[patch] dagrab post new ATA code

Peter Kostouros kpeter at melbpc.org.au
Thu Oct 30 19:24:16 PST 2003


Hi

I have attached a patch that got dagrab working for me again after the 
new ATA code was imported into CURRENT. The patch may need further work, 
but for those interested ...

-- 

Regards

Peter

As always the organisation disavows knowledge of this email

-------------- next part --------------
--- dagrab.c.after.patch	Fri Oct 31 12:02:06 2003
+++ dagrab.c	Fri Oct 31 14:00:45 2003
@@ -106,6 +106,7 @@
 #include <sys/cdio.h>
 #include <sys/param.h>
 #include <sys/mount.h>
+#include <sys/cdrio.h>
 #define CDDEVICE "/dev/cdrom"
 #define N_BUF 12
 #define OVERLAP 2
@@ -203,7 +204,8 @@
   {"@DIS",KW_DISK,"Disk name (guessed)"}
 };
 
-
+int block_size = CD_FRAMESIZE_RAW;
+  
 struct Wavefile cd_newave(unsigned size)
 {
   struct Wavefile dummy={{'R','I','F','F'},		/* Rid */
@@ -242,27 +244,33 @@
   return ioctl(cdrom_fd,CDIOREADTOCENTRY,Te);
 }
 
-void cd_read_audio(int lba,int num,char *buf)
-	/* reads num CD_FRAMESIZE_RAW sized
-	   sectors in buf, starting from lba*/
-	/*NOTE: if num>CDROM_NBLOCKS_BUFFER as defined in ide_cd.c (8 in linux 2.0.32)
-	  jitter correction may be required inside the block. */					   
-{
-	struct ioc_read_audio ra;
-
-	ra.address.lba=lba;
-	ra.address_format=CD_LBA_FORMAT;
-	ra.nframes=num;
-	ra.buffer=buf;
-	if(ioctl(cdrom_fd,CDIOCREADAUDIO,&ra)){
-		/*fprintf(stderr,"%s: read raw ioctl failed \n",progname);*/
-		fprintf(stderr,"\n%s: read raw ioctl failed at lba %d length %d: %s\n",
-				progname,lba,num,strerror(errno));
-		exit(1);
-	}
+/* Original documentation for cd_read_audio:
+ * 
+ * reads num CD_FRAMESIZE_RAW sized sectors in buf, starting from lba
+ * 
+ * NOTE: if num > CDROM_NBLOCKS_BUFFER as defined in ide_cd.c (8 in linux 2.0.32)
+ * jitter correction may be required inside the block.
+ */
+void cd_read_audio(int lba, int num, char *buf)
+{  
+   if (lba >= 0)
+   {	
+     if (lseek(cdrom_fd, lba * block_size, SEEK_SET) == -1)
+     {
+	fprintf(stderr, "\n%s: read failed at lba %d: %s\n",
+	      progname, lba * block_size, strerror(errno));
+         exit (errno);	
+     }
+   }
+   	 
+   if (read(cdrom_fd, buf, num * block_size) == -1)
+   {
+      fprintf(stderr, "\n%s: read failed at lba %d length %d: %s\n",
+	      progname, lba, num, strerror(errno));
+      exit (errno);
+   }
 }
 
-
 // CDDB section
 static int cddb_sock;
 
@@ -655,7 +663,7 @@
 	if ((cdrom_fd=open(cd_dev,O_RDONLY))==-1){
 		fprintf(stderr,"%s: error opening device %s\n",progname,cd_dev);
 		exit(1);
-	}
+	}   
 	if(cd_get_tochdr(&Th)){
 		fprintf(stderr,"%s: read TOC ioctl failed: %s\n",progname,strerror(errno));
 		exit(1);
@@ -987,6 +995,7 @@
 	char path[500];
 	FILE *f;
 	progname=av[0];
+      
 	while((c=getopt(ac,av,"pshaivCSNd:f:n:o:k:r:t:m:e:H:P:D:"))!=-1){
 		switch(c){
 			case 'h':usage();break;
@@ -1064,9 +1073,7 @@
 		opt_chmod=0660; if(opt_verbose)
 			fprintf(stderr, "strange chmod value, setting to 0660\n");
 	}
-	opt_bufsize=CD_FRAMESIZE_RAW * opt_blocks;
-	opt_ibufsize=opt_bufsize/sizeof(int);
-	opt_bufstep=opt_blocks-opt_overlap;
+	
 	if((optind==ac)&&!all_tracks&&!opt_save) {
 		if(disp_TOC){
 			if(cd_getinfo(cd_dev,&tl))
@@ -1075,11 +1082,24 @@
 			exit(0);
 		}
 		else usage();
-	};
+	}
 
 	if(cd_getinfo(cd_dev,&tl)){
 	  exit(1);
 	}
+   
+        /* Initialise global variable block_size */
+        if (ioctl(cdrom_fd, CDRIOCGETBLOCKSIZE, &block_size) == -1)
+        {
+                fprintf(stderr, "\nioctl error: %s\n", strerror(errno));
+                exit (errno);
+        }
+   
+        /* Set opt_* variables now that block_size is found. */
+        opt_bufsize = block_size * opt_blocks;
+	opt_ibufsize = opt_bufsize / sizeof(int);
+        opt_bufstep = opt_blocks - opt_overlap;	   
+   
 	if(disp_TOC)cd_disp_TOC(&tl);
 	if(opt_save && (tl.cddb!=NULL)){
 	  if(tl.gnr==NULL) 


More information about the freebsd-ports mailing list