[Debburn-changes] r576 - cdrkit/trunk/wodim

Eduard Bloch blade at alioth.debian.org
Thu Dec 7 21:27:44 CET 2006


Author: blade
Date: 2006-12-07 21:27:44 +0100 (Thu, 07 Dec 2006)
New Revision: 576

Modified:
   cdrkit/trunk/wodim/scsi_scan.c
   cdrkit/trunk/wodim/wodim.c
Log:
New option: --devices, displays native device names

Modified: cdrkit/trunk/wodim/scsi_scan.c
===================================================================
--- cdrkit/trunk/wodim/scsi_scan.c	2006-12-07 14:37:26 UTC (rev 575)
+++ cdrkit/trunk/wodim/scsi_scan.c	2006-12-07 20:27:44 UTC (rev 576)
@@ -53,22 +53,95 @@
 #include "scsi_scan.h"
 #include "wodim.h"
 
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+
 static	void	print_product(FILE *f, struct scsi_inquiry *ip);
 int	select_target(SCSI *usalp, FILE *f);
 static	int	select_unit(SCSI *usalp, FILE *f);
 
-static void
-print_product(FILE *f, struct  scsi_inquiry *ip)
-{
+static void print_product(FILE *f, struct  scsi_inquiry *ip) {
 	fprintf(f, "'%.8s' ", ip->vendor_info);
 	fprintf(f, "'%.16s' ", ip->prod_ident);
 	fprintf(f, "'%.4s' ", ip->prod_revision);
+	fprintf(stderr, "wtf, ganze vendor_info: %s\n", ip->vendor_info);
 	if (ip->add_len < 31) {
 		fprintf(f, "NON CCS ");
 	}
 	usal_fprintdev(f, ip);
 }
 
+#define MAXDEVCOUNT (256+26+26)
+int scan_devices() {
+	struct stat statbuf;
+	char *lines[MAXDEVCOUNT];
+	char buf[256], devname[256], perms[8];
+	SCSI *usalp;
+	int i, ndevs=0;
+	BOOL have_tgt;
+
+#ifdef linux
+	for(i=0;i<MAXDEVCOUNT;i++) {
+		if(i<26)
+			snprintf(devname, sizeof (devname), "/dev/hd%c", 'a'+i);
+		else if(i<(256+26))
+			snprintf(devname, sizeof (devname), "/dev/sr%d", i-26);
+		else if(i<(256+26+26))
+			snprintf(devname, sizeof (devname), "/dev/sg%c", 'a'+i-26-256);
+		else
+			break;
+
+		if(stat(devname, &statbuf))
+			continue;
+
+		usalp = usal_open(devname, buf, sizeof (buf), 0, 0);
+		if(!usalp) continue;
+
+		usalp->silent++;
+		have_tgt = unit_ready(usalp) || usalp->scmd->error != SCG_FATAL;
+
+		strcpy(perms,"------");
+		if(statbuf.st_mode&S_IRUSR) perms[0]= 'r';
+		if(statbuf.st_mode&S_IWUSR) perms[1]= 'w';
+		if(statbuf.st_mode&S_IRGRP) perms[2]= 'r';
+		if(statbuf.st_mode&S_IWGRP) perms[3]= 'w';
+		if(statbuf.st_mode&S_IROTH) perms[4]= 'r';
+		if(statbuf.st_mode&S_IWOTH) perms[5]= 'w';
+
+		if(have_tgt) {
+			char *p;
+
+			getdev(usalp, FALSE);
+			for(p=usalp->inq->vendor_info + 7 ; p >= usalp->inq->vendor_info; p--) {
+				if(isspace(*p))
+					*p='\0';
+				else
+					break;
+			}
+			for(p=usalp->inq->prod_ident + 15 ; p >= usalp->inq->prod_ident; p--) {
+				if(isspace(*p))
+					*p='\0';
+				else
+					break;
+			}
+			snprintf(buf, sizeof(buf), "%d    dev='%s'   %s :  '%.8s'  '%.16s'\n", ndevs, devname, perms, usalp->inq->vendor_info, usalp->inq->prod_ident);
+			lines[ndevs++]=strdup(buf);
+			usal_close(usalp);
+		}
+	}
+	fprintf(stdout, "wodim: Overview of accessible drives (%d found) :\n"
+			"----------------------------------------------------------------------\n",
+			ndevs);
+	for(i=0;i<ndevs;i++)
+		fprintf(stdout, "%s", lines[i]);
+	fprintf(stdout,	"----------------------------------------------------------------------\n");
+
+#endif
+	return 0;
+}
+
 int select_target(SCSI *usalp, FILE *f) {
 	int	initiator;
 #ifdef	FMT

Modified: cdrkit/trunk/wodim/wodim.c
===================================================================
--- cdrkit/trunk/wodim/wodim.c	2006-12-07 14:37:26 UTC (rev 575)
+++ cdrkit/trunk/wodim/wodim.c	2006-12-07 20:27:44 UTC (rev 576)
@@ -273,6 +273,9 @@
    kill_faio();
 }
 
+/* shared variables */
+int	scandevs = 0;
+
 int main(int argc, char *argv[])
 {
 	char	*dev = NULL;
@@ -397,6 +400,9 @@
 		exit(0);
 	}
 
+  if (scandevs)
+	  return (scan_devices(usalp, stdout, stderr));
+
   usalp = usal_open(dev, errstr, sizeof (errstr),
         debug, lverbose);
   if(!usalp && dev) {
@@ -408,15 +414,17 @@
      usalp = usal_open(dalt, errstr, sizeof (errstr),
            debug, lverbose);
   }
+
   if(!usalp)
   {
      errmsg("\nCannot open SCSI driver!\n"
-           "For possible targets try 'wodim -scanbus'.\n"
+           "For possible targets try 'wodim --devices' or 'wodim -scanbus'.\n"
            "For possible transport specifiers try 'wodim dev=help'.\n"
            "For IDE/ATAPI devices configuration, see the file README.ATAPI.setup from\n"
            "the wodim documentation.\n");
      exit(EX_BAD);
   }
+  
 #ifdef	HAVE_PRIV_SET
 #ifdef	PRIV_DEBUG
 	fprintf(stderr, "file_dac_read: %d\n", priv_ineffect(PRIV_FILE_DAC_READ));
@@ -3055,7 +3063,7 @@
 }
 
 char	*opts =
-"help,version,checkdrive,prcap,inq,scanbus,reset,abort,overburn,ignsize,useinfo,dev*,timeout#,driver*,driveropts*,setdropts,tsize&,padsize&,pregap&,defpregap&,speed#,load,lock,eject,dummy,msinfo,toc,atip,multi,fix,nofix,waiti,immed,debug#,d+,kdebug#,kd#,verbose+,v+,Verbose+,V+,x+,xd#,silent,s,audio,data,mode2,xa,xa1,xa2,xamix,cdi,isosize,nopreemp,preemp,nocopy,copy,nopad,pad,swab,fs&,ts&,blank&,format,formattype&,pktsize#,packet,noclose,force,tao,dao,sao,raw,raw96r,raw96p,raw16,clone,scms,isrc*,mcn*,index*,cuefile*,textfile*,text,shorttrack,noshorttrack,gracetime#,minbuf#";
+"help,version,checkdrive,prcap,inq,devices,scanbus,reset,abort,overburn,ignsize,useinfo,dev*,timeout#,driver*,driveropts*,setdropts,tsize&,padsize&,pregap&,defpregap&,speed#,load,lock,eject,dummy,msinfo,toc,atip,multi,fix,nofix,waiti,immed,debug#,d+,kdebug#,kd#,verbose+,v+,Verbose+,V+,x+,xd#,silent,s,audio,data,mode2,xa,xa1,xa2,xamix,cdi,isosize,nopreemp,preemp,nocopy,copy,nopad,pad,swab,fs&,ts&,blank&,format,formattype&,pktsize#,packet,noclose,force,tao,dao,sao,raw,raw96r,raw96p,raw16,clone,scms,isrc*,mcn*,index*,cuefile*,textfile*,text,shorttrack,noshorttrack,gracetime#,minbuf#";
 
 /*
  * Defines used to find whether a write mode has been specified.
@@ -3173,7 +3181,7 @@
 		 */
 		if ((ga_ret = getargs(&cac, &cav, opts,
 				&help, &version, &checkdrive, &prcap,
-				&inq, &scanbus, &reset, &doabort, &overburn, &ignsize,
+				&inq, &scandevs, &scanbus, &reset, &doabort, &overburn, &ignsize,
 				&useinfo,
 				devp, timeoutp, &driver, &driveropts, &setdropts,
 				getllnum, &tracksize,
@@ -3220,7 +3228,7 @@
 				*flagsp |= F_PRCAP;
 			if (inq)
 				*flagsp |= F_INQUIRY;
-			if (scanbus)
+			if (scanbus || scandevs) /* scandevs behaves similarly WRT in the legacy code, just the scan operation is different */
 				*flagsp |= F_SCANBUS;
 			if (reset)
 				*flagsp |= F_RESET;
@@ -3733,7 +3741,7 @@
 		if (tracks != 0) {
        fprintf(stderr,
              "No tracks allowed with -load, -lock, -setdropts, -msinfo, -toc, -atip, -fix,\n"
-             "-version, -checkdrive, -prcap, -inq, -scanbus, -reset and -abort options.\n" );
+             "-version, -checkdrive, -prcap, -inq, -scanbus, -devices, -reset and -abort options.\n" );
        exit(EXIT_FAILURE);
 		}
 		return ispacket;




More information about the Debburn-changes mailing list