[Debburn-changes] r704 - in cdrkit/trunk: . wodim

Eduard Bloch blade at alioth.debian.org
Fri Feb 9 23:15:37 CET 2007


Author: blade
Date: 2007-02-09 23:15:36 +0100 (Fri, 09 Feb 2007)
New Revision: 704

Modified:
   cdrkit/trunk/Changelog
   cdrkit/trunk/wodim/wodim.c
Log:
Restored the working procfs feature fishing code

Modified: cdrkit/trunk/Changelog
===================================================================
--- cdrkit/trunk/Changelog	2007-02-09 22:08:08 UTC (rev 703)
+++ cdrkit/trunk/Changelog	2007-02-09 22:15:36 UTC (rev 704)
@@ -13,8 +13,7 @@
     Vladimir Nadvornik <nadvornik at suse.cz>
 
   [ Peter Samuelson ]
-  * Clean up Linux-2.6 CD/DVD-R drive detection, for simpler code and
-    slightly clearer error messages.
+  * Clean up Linux-2.6 CD/DVD-R drive detection, clearer error messages.
 
  -- Eduard Bloch <blade at debian.org>  Tue, 23 Jan 2007 19:13:44 +0100
 

Modified: cdrkit/trunk/wodim/wodim.c
===================================================================
--- cdrkit/trunk/wodim/wodim.c	2007-02-09 22:08:08 UTC (rev 703)
+++ cdrkit/trunk/wodim/wodim.c	2007-02-09 22:15:36 UTC (rev 704)
@@ -3747,9 +3747,10 @@
 		 * 2. Read /proc/sys/dev/cdrom/info, look for a CD-R/DVD-R.
 		 *    Will fail for kernel 2.4 or if cdrom module not loaded.
 		 * 3. stat /dev/cdrom, just assume that it can write media.
-		 */
 
-#ifdef just_example_for_procfs_file_AND_beware_of_the_TABS
+     An example for procfs file contents, beware of the TABs
+
+---
 CD-ROM information, Id: cdrom.c 3.20 2003/12/17
 
 drive name:		hdc     hda
@@ -3773,8 +3774,8 @@
 Can write MRW:          0       1
 Can write RAM:          0       1
 
-
-#endif
+---
+*/
 		struct stat statbuf;
 		char *type="CD-R", *guessdev="/dev/cdrw", *result=NULL;
 		long long filesize=0;
@@ -3799,27 +3800,42 @@
 			result=guessdev;
 		else if(0!= (fh = fopen("/proc/sys/dev/cdrom/info", "r")) ) {
 			/* ok, going the hard way */
-			char name[32], buf[256];
-			int writecd = -1, writedvd = -1;
+			char *nameline=NULL;
+			static char buf[256];
+			int kn = strlen(key);
 
-			name[0] = '\0';
+			buf[255]='\0';
+
 			while(fgets(buf, sizeof(buf), fh)) {
-				sscanf(buf, "drive name: %31s", name) ||
-				sscanf(buf, "Can write CD-R: %d", &writecd) ||
-				sscanf(buf, "Can write DVD-R: %d", &writedvd);
-
-				if (!name[0] || writecd < 0 || writedvd < 0)
-					continue;
-
-				if ((writecd && !need_dvdr) ||
-				    (writedvd && need_dvdr)) {
-					sprintf(buf, "/dev/%s", name);
-					result = strdup(buf);
-					break;
+				if(0==strncmp(buf, "drive name:", 11))
+					nameline=strdup(buf);
+				if(nameline && 0==strncmp(buf, key, kn)) {
+					int p=kn;
+					char *descptr=nameline+11; /* start at the known whitespace */
+					while(p<sizeof(buf) && buf[p]) {
+						if(buf[p]=='1' || buf[p]=='0') {
+							/* find the beginning of the descriptor */
+							for(;isspace((Uchar) *descptr);descptr++)
+								;
+						}
+						if(buf[p]=='1') {
+							result=descptr-5;
+							/* terminate on space/newline and stop there */
+							for(;*descptr;descptr++) {
+								if(isspace((Uchar) *descptr))
+									*(descptr--)='\0';
+							}
+							strncpy(result, "/dev/", 5);
+							break;
+						}
+						else { /* no hit, move to after word ending */
+							for(; *descptr && ! isspace((Uchar) *descptr); descptr++)
+								;
+						}
+						p++;
+					}
 				}
 
-				name[0] = '\0';
-				writecd = writedvd = -1;
 			}
 			fclose(fh);
 		}




More information about the Debburn-changes mailing list