[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

cdparanoia: beginning of a patch



Hi,

I gave cdparanoia a quick shot, and here are my findings:
 - it looks like we have to move sg_buffer from d-> to d->private_data->
   (where d is a cdrom_drive*)
 - it looks like new functions appeared, see i_read_mmc2B(), quite
   similar to i_read_mmc2(); the latter might have been changed lately
   on Linux (in the .c file, not the GNU/kFreeBSD-specific .inc file),
   so the .inc file might need an update (see the array, constant
   change); and a wrapper around got added.
 - GNU/kFreeBSD is missing a set_speed() function.
 - ENOMEDIUM is used in several places.
 - I didn't get any further yet.

Petr, as you did most of the work apparently, could you please use the
attached patch as a possible basis and update the kbsd patch?

Mraw,
KiBi.
--- a/interface/scan_devices.c
+++ b/interface/scan_devices.c
@@ -914,7 +914,7 @@ cdrom_drive *cdda_identify_scsi(const ch
 	d->lun = d->dev->target_lun;
 	d->interface = GENERIC_SCSI;
 
-	if ((d->sg_buffer = malloc(MAX_BIG_BUFF_SIZE)) == NULL) {
+	if ((d->private_data->sg_buffer = malloc(MAX_BIG_BUFF_SIZE)) == NULL) {
 		idperror(messagedest, messages, "Could not allocate buffer memory", NULL);
 		goto cdda_identify_scsi_fail;
 	}
--- a/interface/interface.c
+++ b/interface/interface.c
@@ -51,8 +51,8 @@ int cdda_close(cdrom_drive *d){
       cam_freeccb(d->ccb);
     if (d->dev)
       cam_close_device(d->dev);
-    if (d->sg_buffer)
-      free(d->sg_buffer);
+    if (d->private_data->sg_buffer)
+      free(d->private_data->sg_buffer);
     if (d->ioctl_fd != -1)
       close(d->ioctl_fd);
 #endif
--- a/interface/scsi_interface_libcam.inc
+++ b/interface/scsi_interface_libcam.inc
@@ -54,17 +54,17 @@ static int handle_scsi_cmd(cdrom_drive *
 
 	bzero(&d->ccb->csio, sizeof(d->ccb->csio));
 
-	memcpy(d->ccb->csio.cdb_io.cdb_bytes, d->sg_buffer, cmd_len);
+	memcpy(d->ccb->csio.cdb_io.cdb_bytes, d->private_data->sg_buffer, cmd_len);
 
 	if (bytecheck && out_size == 0)
-		memset(d->sg_buffer, bytefill, in_size);
+		memset(d->private_data->sg_buffer, bytefill, in_size);
 
 	cam_fill_csio(&d->ccb->csio,
 	    /* retries */ 0,
 	    /* cbfcnp */ NULL,
 	    /* flags */ CAM_DEV_QFRZDIS | (out_size ? CAM_DIR_OUT : CAM_DIR_IN),
 	    /* tag_action */ MSG_SIMPLE_Q_TAG,
-	    /* data_ptr */ out_size ? d->sg_buffer + cmd_len : d->sg_buffer,
+	    /* data_ptr */ out_size ? d->private_data->sg_buffer + cmd_len : d->private_data->sg_buffer,
 	    /* dxfer_len */ out_size ? out_size : in_size,
 	    /* sense_len */ SSD_FULL_SIZE,
 	    /* cdb_len */ cmd_len,
@@ -122,7 +122,7 @@ static int handle_scsi_cmd(cdrom_drive *
 /* Group 1 (10b) command */
 
 static int mode_sense_atapi(cdrom_drive *d,int size,int page){
-  memcpy(d->sg_buffer,
+  memcpy(d->private_data->sg_buffer,
 	 (char [])  {0x5A,   /* MODE_SENSE */
 		       0x00, /* reserved */
 		       0x00, /* page */
@@ -135,14 +135,14 @@ static int mode_sense_atapi(cdrom_drive 
 		       0},   /* reserved */
          10);
 
-  d->sg_buffer[1]=d->lun<<5;
-  d->sg_buffer[2]=0x3F&page;
-  d->sg_buffer[8]=size+4;
+  d->private_data->sg_buffer[1]=d->lun<<5;
+  d->private_data->sg_buffer[2]=0x3F&page;
+  d->private_data->sg_buffer[8]=size+4;
 
   if (handle_scsi_cmd (d, 10, 0, size+4,'\377',1)) return(1);
 
   {
-    char *b=d->sg_buffer;
+    char *b=d->private_data->sg_buffer;
     if(b[0])return(1); /* Handles only up to 256 bytes */
     if(b[6])return(1); /* Handles only up to 256 bytes */
 
@@ -159,7 +159,7 @@ static int mode_sense_atapi(cdrom_drive 
 /* group 0 (6b) command */
 
 static int mode_sense_scsi(cdrom_drive *d,int size,int page){
-  memcpy(d->sg_buffer,
+  memcpy(d->private_data->sg_buffer,
 	 (char [])  {0x1A,   /* MODE_SENSE */
 		       0x00, /* return block descriptor/lun */
 		       0x00, /* page */
@@ -168,9 +168,9 @@ static int mode_sense_scsi(cdrom_drive *
 		       0},   /* control */
          6);
 
-  d->sg_buffer[1]=d->lun<<5;
-  d->sg_buffer[2]=(0x3F&page);
-  d->sg_buffer[4]=size;
+  d->private_data->sg_buffer[1]=d->lun<<5;
+  d->private_data->sg_buffer[2]=(0x3F&page);
+  d->private_data->sg_buffer[4]=size;
 
   if (handle_scsi_cmd (d, 6, 0, size, '\377',1)) return(1);
   return(0);
@@ -185,9 +185,9 @@ static int mode_sense(cdrom_drive *d,int
 static int mode_select(cdrom_drive *d,int density,int secsize){
   /* short circut the way Heiko does it; less flexible, but shorter */
   if(d->is_atapi){
-    unsigned char *mode = d->sg_buffer + 18;
+    unsigned char *mode = d->private_data->sg_buffer + 18;
 
-    memcpy(d->sg_buffer,
+    memcpy(d->private_data->sg_buffer,
 	   (char []) { 0x55, /* MODE_SELECT */
 			 0x10, /* no save page */
 			 0, /* reserved */
@@ -210,7 +210,7 @@ static int mode_select(cdrom_drive *d,in
 			 0, 0, 0},/* Blocklen */
 	   26);
 
-    d->sg_buffer[1]|=d->lun<<5;
+    d->private_data->sg_buffer[1]|=d->lun<<5;
 
     /* prepare to read cds in the previous mode */
     mode [0] = density;
@@ -221,9 +221,9 @@ static int mode_select(cdrom_drive *d,in
     return(handle_scsi_cmd (d,10, 16, 0,0,0));
 
   }else{
-    unsigned char *mode = d->sg_buffer + 10;
+    unsigned char *mode = d->private_data->sg_buffer + 10;
 
-    memcpy(d->sg_buffer,
+    memcpy(d->private_data->sg_buffer,
 	   (char []) { 0x15, /* MODE_SELECT */
 			 0x10, /* no save page */
 			 0, /* reserved */
@@ -254,8 +254,8 @@ static int mode_select(cdrom_drive *d,in
 static unsigned int get_orig_sectorsize(cdrom_drive *d){
   if(mode_sense(d,12,0x01))return(-1);
 
-  d->orgdens = d->sg_buffer[4];
-  return(d->orgsize = ((int)(d->sg_buffer[10])<<8)+d->sg_buffer[11]);
+  d->orgdens = d->private_data->sg_buffer[4];
+  return(d->orgsize = ((int)(d->private_data->sg_buffer[10])<<8)+d->private_data->sg_buffer[11]);
 }
 
 /* switch CDROM scsi drives to given sector size  */
@@ -305,16 +305,16 @@ static int scsi_read_toc (cdrom_drive *d
      len lsb, flags */
 
   /* read the header first */
-  memcpy(d->sg_buffer, (char []){ 0x43, 0, 0, 0, 0, 0, 1, 0, 12, 0}, 10);
-  d->sg_buffer[1]=d->lun<<5;
+  memcpy(d->private_data->sg_buffer, (char []){ 0x43, 0, 0, 0, 0, 0, 1, 0, 12, 0}, 10);
+  d->private_data->sg_buffer[1]=d->lun<<5;
 
   if (handle_scsi_cmd (d,10, 0, 12,'\377',1)){
     cderror(d,"004: Unable to read table of contents header\n");
     return(-4);
   }
 
-  first=d->sg_buffer[2];
-  last=d->sg_buffer[3];
+  first=d->private_data->sg_buffer[2];
+  last=d->private_data->sg_buffer[3];
   tracks=last-first+1;
 
   if (last > MAXTRK || first > MAXTRK || last<0 || first<0) {
@@ -323,16 +323,16 @@ static int scsi_read_toc (cdrom_drive *d
   }
 
   for (i = first; i <= last; i++){
-    memcpy(d->sg_buffer, (char []){ 0x43, 0, 0, 0, 0, 0, 0, 0, 12, 0}, 10);
-    d->sg_buffer[1]=d->lun<<5;
-    d->sg_buffer[6]=i;
+    memcpy(d->private_data->sg_buffer, (char []){ 0x43, 0, 0, 0, 0, 0, 0, 0, 12, 0}, 10);
+    d->private_data->sg_buffer[1]=d->lun<<5;
+    d->private_data->sg_buffer[6]=i;
 
     if (handle_scsi_cmd (d,10, 0, 12,'\377',1)){
       cderror(d,"005: Unable to read table of contents entry\n");
       return(-5);
     }
     {
-      scsi_TOC *toc=(scsi_TOC *)(d->sg_buffer+4);
+      scsi_TOC *toc=(scsi_TOC *)(d->private_data->sg_buffer+4);
 
       d->disc_toc[i-first].bFlags=toc->bFlags;
       d->disc_toc[i-first].bTrack=i;
@@ -344,16 +344,16 @@ static int scsi_read_toc (cdrom_drive *d
     }
   }
 
-  memcpy(d->sg_buffer, (char []){ 0x43, 0, 0, 0, 0, 0, 0, 0, 12, 0}, 10);
-  d->sg_buffer[1]=d->lun<<5;
-  d->sg_buffer[6]=0xAA;
+  memcpy(d->private_data->sg_buffer, (char []){ 0x43, 0, 0, 0, 0, 0, 0, 0, 12, 0}, 10);
+  d->private_data->sg_buffer[1]=d->lun<<5;
+  d->private_data->sg_buffer[6]=0xAA;
 
   if (handle_scsi_cmd (d,10, 0, 12,'\377',1)){
     cderror(d,"002: Unable to read table of contents lead-out\n");
     return(-2);
   }
   {
-    scsi_TOC *toc=(scsi_TOC *)(d->sg_buffer+4);
+    scsi_TOC *toc=(scsi_TOC *)(d->private_data->sg_buffer+4);
 
     d->disc_toc[i-first].bFlags=toc->bFlags;
     d->disc_toc[i-first].bTrack=0xAA;
@@ -376,9 +376,9 @@ static int scsi_read_toc2 (cdrom_drive *
   int i;
   unsigned tracks;
 
-  memcpy(d->sg_buffer, (char[]){ 0xe5, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 10);
-  d->sg_buffer[5]=1;
-  d->sg_buffer[8]=255;
+  memcpy(d->private_data->sg_buffer, (char[]){ 0xe5, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 10);
+  d->private_data->sg_buffer[5]=1;
+  d->private_data->sg_buffer[8]=255;
 
   if (handle_scsi_cmd (d,10, 0, 256,'\377',1)){
     cderror(d,"004: Unable to read table of contents header\n");
@@ -386,49 +386,49 @@ static int scsi_read_toc2 (cdrom_drive *
   }
 
   /* copy to our structure and convert start sector */
-  tracks = d->sg_buffer[1];
+  tracks = d->private_data->sg_buffer[1];
   if (tracks > MAXTRK) {
     cderror(d,"003: CDROM reporting illegal number of tracks\n");
     return(-3);
   }
 
   for (i = 0; i < tracks; i++){
-    memcpy(d->sg_buffer, (char[]){ 0xe5, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 10);
-    d->sg_buffer[5]=i+1;
-    d->sg_buffer[8]=255;
+    memcpy(d->private_data->sg_buffer, (char[]){ 0xe5, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 10);
+    d->private_data->sg_buffer[5]=i+1;
+    d->private_data->sg_buffer[8]=255;
 
     if (handle_scsi_cmd (d,10, 0, 256,'\377',1)){
       cderror(d,"005: Unable to read table of contents entry\n");
       return(-5);
     }
 
-    d->disc_toc[i].bFlags = d->sg_buffer[10];
+    d->disc_toc[i].bFlags = d->private_data->sg_buffer[10];
     d->disc_toc[i].bTrack = i + 1;
 
     d->disc_toc[i].dwStartSector= d->adjust_ssize *
-	(((signed char)(d->sg_buffer[2])<<24) |
-	 (d->sg_buffer[3]<<16)|
-	 (d->sg_buffer[4]<<8)|
-	 (d->sg_buffer[5]));
+	(((signed char)(d->private_data->sg_buffer[2])<<24) |
+	 (d->private_data->sg_buffer[3]<<16)|
+	 (d->private_data->sg_buffer[4]<<8)|
+	 (d->private_data->sg_buffer[5]));
   }
 
   d->disc_toc[i].bFlags = 0;
   d->disc_toc[i].bTrack = i + 1;
-  memcpy (&foo, d->sg_buffer+2, 4);
-  memcpy (&bar, d->sg_buffer+6, 4);
+  memcpy (&foo, d->private_data->sg_buffer+2, 4);
+  memcpy (&bar, d->private_data->sg_buffer+6, 4);
   d->disc_toc[i].dwStartSector = d->adjust_ssize * (be32_to_cpu(foo) +
 						    be32_to_cpu(bar));
 
   d->disc_toc[i].dwStartSector= d->adjust_ssize *
-    ((((signed char)(d->sg_buffer[2])<<24) |
-      (d->sg_buffer[3]<<16)|
-      (d->sg_buffer[4]<<8)|
-      (d->sg_buffer[5]))+
-
-     ((((signed char)(d->sg_buffer[6])<<24) |
-       (d->sg_buffer[7]<<16)|
-       (d->sg_buffer[8]<<8)|
-       (d->sg_buffer[9]))));
+    ((((signed char)(d->private_data->sg_buffer[2])<<24) |
+      (d->private_data->sg_buffer[3]<<16)|
+      (d->private_data->sg_buffer[4]<<8)|
+      (d->private_data->sg_buffer[5]))+
+
+     ((((signed char)(d->private_data->sg_buffer[6])<<24) |
+       (d->private_data->sg_buffer[7]<<16)|
+       (d->private_data->sg_buffer[8]<<8)|
+       (d->private_data->sg_buffer[9]))));
 
 
   d->cd_extra = FixupTOC(d,tracks+1);
@@ -439,111 +439,111 @@ static int scsi_read_toc2 (cdrom_drive *
 
 static int i_read_28 (cdrom_drive *d, void *p, long begin, long sectors){
   int ret;
-  memcpy(d->sg_buffer,(char []){0x28, 0, 0, 0, 0, 0, 0, 0, 0, 0},10);
+  memcpy(d->private_data->sg_buffer,(char []){0x28, 0, 0, 0, 0, 0, 0, 0, 0, 0},10);
 
   if(d->fua)
-    d->sg_buffer[1]=0x08;
+    d->private_data->sg_buffer[1]=0x08;
 
-  d->sg_buffer[1]|=d->lun<<5;
+  d->private_data->sg_buffer[1]|=d->lun<<5;
 
-  d->sg_buffer[3] = (begin >> 16) & 0xFF;
-  d->sg_buffer[4] = (begin >> 8) & 0xFF;
-  d->sg_buffer[5] = begin & 0xFF;
-  d->sg_buffer[8] = sectors;
+  d->private_data->sg_buffer[3] = (begin >> 16) & 0xFF;
+  d->private_data->sg_buffer[4] = (begin >> 8) & 0xFF;
+  d->private_data->sg_buffer[5] = begin & 0xFF;
+  d->private_data->sg_buffer[8] = sectors;
   if((ret=handle_scsi_cmd(d,10,0,sectors * CD_FRAMESIZE_RAW,'\177',1)))
     return(ret);
-  if(p)memcpy(p,d->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+  if(p)memcpy(p,d->private_data->sg_buffer,sectors*CD_FRAMESIZE_RAW);
   return(0);
 }
 
 static int i_read_A8 (cdrom_drive *d, void *p, long begin, long sectors){
   int ret;
-  memcpy(d->sg_buffer,(char []){0xA8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},12);
+  memcpy(d->private_data->sg_buffer,(char []){0xA8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},12);
 
   if(d->fua)
-    d->sg_buffer[1]=0x08;
+    d->private_data->sg_buffer[1]=0x08;
 
-  d->sg_buffer[1]|=d->lun<<5;
+  d->private_data->sg_buffer[1]|=d->lun<<5;
 
-  d->sg_buffer[3] = (begin >> 16) & 0xFF;
-  d->sg_buffer[4] = (begin >> 8) & 0xFF;
-  d->sg_buffer[5] = begin & 0xFF;
-  d->sg_buffer[9] = sectors;
+  d->private_data->sg_buffer[3] = (begin >> 16) & 0xFF;
+  d->private_data->sg_buffer[4] = (begin >> 8) & 0xFF;
+  d->private_data->sg_buffer[5] = begin & 0xFF;
+  d->private_data->sg_buffer[9] = sectors;
   if((ret=handle_scsi_cmd(d,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1)))
     return(ret);
-  if(p)memcpy(p,d->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+  if(p)memcpy(p,d->private_data->sg_buffer,sectors*CD_FRAMESIZE_RAW);
   return(0);
 }
 
 static int i_read_D4_10 (cdrom_drive *d, void *p, long begin, long sectors){
   int ret;
-  memcpy(d->sg_buffer,(char []){0xd4, 0, 0, 0, 0, 0, 0, 0, 0, 0},10);
+  memcpy(d->private_data->sg_buffer,(char []){0xd4, 0, 0, 0, 0, 0, 0, 0, 0, 0},10);
 
   if(d->fua)
-    d->sg_buffer[1]=0x08;
+    d->private_data->sg_buffer[1]=0x08;
 
-  d->sg_buffer[1]|=d->lun<<5;
-  d->sg_buffer[3] = (begin >> 16) & 0xFF;
-  d->sg_buffer[4] = (begin >> 8) & 0xFF;
-  d->sg_buffer[5] = begin & 0xFF;
-  d->sg_buffer[8] = sectors;
+  d->private_data->sg_buffer[1]|=d->lun<<5;
+  d->private_data->sg_buffer[3] = (begin >> 16) & 0xFF;
+  d->private_data->sg_buffer[4] = (begin >> 8) & 0xFF;
+  d->private_data->sg_buffer[5] = begin & 0xFF;
+  d->private_data->sg_buffer[8] = sectors;
   if((ret=handle_scsi_cmd(d,10,0,sectors * CD_FRAMESIZE_RAW,'\177',1)))
     return(ret);
-  if(p)memcpy(p,d->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+  if(p)memcpy(p,d->private_data->sg_buffer,sectors*CD_FRAMESIZE_RAW);
   return(0);
 }
 
 static int i_read_D4_12 (cdrom_drive *d, void *p, long begin, long sectors){
   int ret;
-  memcpy(d->sg_buffer,(char []){0xd4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},12);
+  memcpy(d->private_data->sg_buffer,(char []){0xd4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},12);
 
   if(d->fua)
-    d->sg_buffer[1]=0x08;
+    d->private_data->sg_buffer[1]=0x08;
 
-  d->sg_buffer[1]|=d->lun<<5;
-  d->sg_buffer[3] = (begin >> 16) & 0xFF;
-  d->sg_buffer[4] = (begin >> 8) & 0xFF;
-  d->sg_buffer[5] = begin & 0xFF;
-  d->sg_buffer[9] = sectors;
+  d->private_data->sg_buffer[1]|=d->lun<<5;
+  d->private_data->sg_buffer[3] = (begin >> 16) & 0xFF;
+  d->private_data->sg_buffer[4] = (begin >> 8) & 0xFF;
+  d->private_data->sg_buffer[5] = begin & 0xFF;
+  d->private_data->sg_buffer[9] = sectors;
   if((ret=handle_scsi_cmd(d,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1)))
     return(ret);
-  if(p)memcpy(p,d->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+  if(p)memcpy(p,d->private_data->sg_buffer,sectors*CD_FRAMESIZE_RAW);
   return(0);
 }
 
 static int i_read_D5 (cdrom_drive *d, void *p, long begin, long sectors){
   int ret;
-  memcpy(d->sg_buffer,(char []){0xd5, 0, 0, 0, 0, 0, 0, 0, 0, 0},10);
+  memcpy(d->private_data->sg_buffer,(char []){0xd5, 0, 0, 0, 0, 0, 0, 0, 0, 0},10);
 
   if(d->fua)
-    d->sg_buffer[1]=0x08;
+    d->private_data->sg_buffer[1]=0x08;
 
-  d->sg_buffer[1]|=d->lun<<5;
-  d->sg_buffer[3] = (begin >> 16) & 0xFF;
-  d->sg_buffer[4] = (begin >> 8) & 0xFF;
-  d->sg_buffer[5] = begin & 0xFF;
-  d->sg_buffer[8] = sectors;
+  d->private_data->sg_buffer[1]|=d->lun<<5;
+  d->private_data->sg_buffer[3] = (begin >> 16) & 0xFF;
+  d->private_data->sg_buffer[4] = (begin >> 8) & 0xFF;
+  d->private_data->sg_buffer[5] = begin & 0xFF;
+  d->private_data->sg_buffer[8] = sectors;
   if((ret=handle_scsi_cmd(d,10,0,sectors * CD_FRAMESIZE_RAW,'\177',1)))
     return(ret);
-  if(p)memcpy(p,d->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+  if(p)memcpy(p,d->private_data->sg_buffer,sectors*CD_FRAMESIZE_RAW);
   return(0);
 }
 
 static int i_read_D8 (cdrom_drive *d, void *p, long begin, long sectors){
   int ret;
-  memcpy(d->sg_buffer,(char []){0xd8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},12);
+  memcpy(d->private_data->sg_buffer,(char []){0xd8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},12);
 
   if(d->fua)
-    d->sg_buffer[1]=0x08;
+    d->private_data->sg_buffer[1]=0x08;
 
-  d->sg_buffer[1]|=d->lun<<5;
-  d->sg_buffer[3] = (begin >> 16) & 0xFF;
-  d->sg_buffer[4] = (begin >> 8) & 0xFF;
-  d->sg_buffer[5] = begin & 0xFF;
-  d->sg_buffer[9] = sectors;
+  d->private_data->sg_buffer[1]|=d->lun<<5;
+  d->private_data->sg_buffer[3] = (begin >> 16) & 0xFF;
+  d->private_data->sg_buffer[4] = (begin >> 8) & 0xFF;
+  d->private_data->sg_buffer[5] = begin & 0xFF;
+  d->private_data->sg_buffer[9] = sectors;
   if((ret=handle_scsi_cmd(d,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1)))
     return(ret);
-  if(p)memcpy(p,d->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+  if(p)memcpy(p,d->private_data->sg_buffer,sectors*CD_FRAMESIZE_RAW);
   return(0);
 }
 
@@ -554,43 +554,57 @@ static int i_read_mmc (cdrom_drive *d, v
     return(TR_ILLEGAL);
   }*/
 
-  memcpy(d->sg_buffer,(char []){0xbe, 0, 0, 0, 0, 0, 0, 0, 0, 0x10, 0, 0},12);
+  memcpy(d->private_data->sg_buffer,(char []){0xbe, 0, 0, 0, 0, 0, 0, 0, 0, 0x10, 0, 0},12);
 
-  d->sg_buffer[3] = (begin >> 16) & 0xFF;
-  d->sg_buffer[4] = (begin >> 8) & 0xFF;
-  d->sg_buffer[5] = begin & 0xFF;
-  d->sg_buffer[8] = sectors;
+  d->private_data->sg_buffer[3] = (begin >> 16) & 0xFF;
+  d->private_data->sg_buffer[4] = (begin >> 8) & 0xFF;
+  d->private_data->sg_buffer[5] = begin & 0xFF;
+  d->private_data->sg_buffer[8] = sectors;
   if((ret=handle_scsi_cmd(d,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1)))
     return(ret);
-  if(p)memcpy(p,d->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+  if(p)memcpy(p,d->private_data->sg_buffer,sectors*CD_FRAMESIZE_RAW);
   return(0);
 }
 
 static int i_read_mmc2 (cdrom_drive *d, void *p, long begin, long sectors){
   int ret;
-  memcpy(d->sg_buffer,(char []){0xbe, 0, 0, 0, 0, 0, 0, 0, 0, 0xf8, 0, 0},12);
+  memcpy(d->private_data->sg_buffer,(char []){0xbe, 0, 0, 0, 0, 0, 0, 0, 0, 0xf8, 0, 0},12);
 
-  d->sg_buffer[3] = (begin >> 16) & 0xFF;
-  d->sg_buffer[4] = (begin >> 8) & 0xFF;
-  d->sg_buffer[5] = begin & 0xFF;
-  d->sg_buffer[8] = sectors;
+  d->private_data->sg_buffer[3] = (begin >> 16) & 0xFF;
+  d->private_data->sg_buffer[4] = (begin >> 8) & 0xFF;
+  d->private_data->sg_buffer[5] = begin & 0xFF;
+  d->private_data->sg_buffer[8] = sectors;
   if((ret=handle_scsi_cmd(d,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1)))
     return(ret);
-  if(p)memcpy(p,d->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+  if(p)memcpy(p,d->private_data->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+  return(0);
+}
+
+static int i_read_mmc2B (cdrom_drive *d, void *p, long begin, long sectors){
+  int ret;
+  memcpy(d->private_data->sg_buffer,(char []){0xbe, 0, 0, 0, 0, 0, 0, 0, 0, 0xf8, 0, 0},12);
+
+  d->private_data->sg_buffer[3] = (begin >> 16) & 0xFF;
+  d->private_data->sg_buffer[4] = (begin >> 8) & 0xFF;
+  d->private_data->sg_buffer[5] = begin & 0xFF;
+  d->private_data->sg_buffer[8] = sectors;
+  if((ret=handle_scsi_cmd(d,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1)))
+    return(ret);
+  if(p)memcpy(p,d->private_data->sg_buffer,sectors*CD_FRAMESIZE_RAW);
   return(0);
 }
 
 static int i_read_mmc3 (cdrom_drive *d, void *p, long begin, long sectors){
   int ret;
-  memcpy(d->sg_buffer,(char []){0xbe, 4, 0, 0, 0, 0, 0, 0, 0, 0xf8, 0, 0},12);
+  memcpy(d->private_data->sg_buffer,(char []){0xbe, 4, 0, 0, 0, 0, 0, 0, 0, 0xf8, 0, 0},12);
 
-  d->sg_buffer[3] = (begin >> 16) & 0xFF;
-  d->sg_buffer[4] = (begin >> 8) & 0xFF;
-  d->sg_buffer[5] = begin & 0xFF;
-  d->sg_buffer[8] = sectors;
+  d->private_data->sg_buffer[3] = (begin >> 16) & 0xFF;
+  d->private_data->sg_buffer[4] = (begin >> 8) & 0xFF;
+  d->private_data->sg_buffer[5] = begin & 0xFF;
+  d->private_data->sg_buffer[8] = sectors;
   if((ret=handle_scsi_cmd(d,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1)))
     return(ret);
-  if(p)memcpy(p,d->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+  if(p)memcpy(p,d->private_data->sg_buffer,sectors*CD_FRAMESIZE_RAW);
   return(0);
 }
 
@@ -617,40 +631,40 @@ static inline void LBA_to_MSF(long lba,
 
 static int i_read_msf (cdrom_drive *d, void *p, long begin, long sectors){
   int ret;
-  memcpy(d->sg_buffer,(char []){0xb9, 0, 0, 0, 0, 0, 0, 0, 0, 0x10, 0, 0},12);
+  memcpy(d->private_data->sg_buffer,(char []){0xb9, 0, 0, 0, 0, 0, 0, 0, 0, 0x10, 0, 0},12);
 
-  LBA_to_MSF(begin,d->sg_buffer+3,d->sg_buffer+4,d->sg_buffer+5);
-  LBA_to_MSF(begin+sectors,d->sg_buffer+6,d->sg_buffer+7,d->sg_buffer+8);
+  LBA_to_MSF(begin,d->private_data->sg_buffer+3,d->private_data->sg_buffer+4,d->private_data->sg_buffer+5);
+  LBA_to_MSF(begin+sectors,d->private_data->sg_buffer+6,d->private_data->sg_buffer+7,d->private_data->sg_buffer+8);
 
   if((ret=handle_scsi_cmd(d,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1)))
     return(ret);
-  if(p)memcpy(p,d->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+  if(p)memcpy(p,d->private_data->sg_buffer,sectors*CD_FRAMESIZE_RAW);
   return(0);
 }
 
 static int i_read_msf2 (cdrom_drive *d, void *p, long begin, long sectors){
   int ret;
-  memcpy(d->sg_buffer,(char []){0xb9, 0, 0, 0, 0, 0, 0, 0, 0, 0xf8, 0, 0},12);
+  memcpy(d->private_data->sg_buffer,(char []){0xb9, 0, 0, 0, 0, 0, 0, 0, 0, 0xf8, 0, 0},12);
 
-  LBA_to_MSF(begin,d->sg_buffer+3,d->sg_buffer+4,d->sg_buffer+5);
-  LBA_to_MSF(begin+sectors,d->sg_buffer+6,d->sg_buffer+7,d->sg_buffer+8);
+  LBA_to_MSF(begin,d->private_data->sg_buffer+3,d->private_data->sg_buffer+4,d->private_data->sg_buffer+5);
+  LBA_to_MSF(begin+sectors,d->private_data->sg_buffer+6,d->private_data->sg_buffer+7,d->private_data->sg_buffer+8);
 
   if((ret=handle_scsi_cmd(d,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1)))
     return(ret);
-  if(p)memcpy(p,d->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+  if(p)memcpy(p,d->private_data->sg_buffer,sectors*CD_FRAMESIZE_RAW);
   return(0);
 }
 
 static int i_read_msf3 (cdrom_drive *d, void *p, long begin, long sectors){
   int ret;
-  memcpy(d->sg_buffer,(char []){0xb9, 4, 0, 0, 0, 0, 0, 0, 0, 0xf8, 0, 0},12);
+  memcpy(d->private_data->sg_buffer,(char []){0xb9, 4, 0, 0, 0, 0, 0, 0, 0, 0xf8, 0, 0},12);
 
-  LBA_to_MSF(begin,d->sg_buffer+3,d->sg_buffer+4,d->sg_buffer+5);
-  LBA_to_MSF(begin+sectors,d->sg_buffer+6,d->sg_buffer+7,d->sg_buffer+8);
+  LBA_to_MSF(begin,d->private_data->sg_buffer+3,d->private_data->sg_buffer+4,d->private_data->sg_buffer+5);
+  LBA_to_MSF(begin+sectors,d->private_data->sg_buffer+6,d->private_data->sg_buffer+7,d->private_data->sg_buffer+8);
 
   if((ret=handle_scsi_cmd(d,12,0,sectors * CD_FRAMESIZE_RAW,'\177',1)))
     return(ret);
-  if(p)memcpy(p,d->sg_buffer,sectors*CD_FRAMESIZE_RAW);
+  if(p)memcpy(p,d->private_data->sg_buffer,sectors*CD_FRAMESIZE_RAW);
   return(0);
 }
 
@@ -815,6 +829,11 @@ long scsi_read_mmc2 (cdrom_drive *d, voi
   return(scsi_read_map(d,p,begin,sectors,i_read_mmc2));
 }
 
+long scsi_read_mmc2B (cdrom_drive *d, void *p, long begin,
+			       long sectors){
+  return(scsi_read_map(d,p,begin,sectors,i_read_mmc2B));
+}
+
 long scsi_read_mmc3 (cdrom_drive *d, void *p, long begin,
 			       long sectors){
   return(scsi_read_map(d,p,begin,sectors,i_read_mmc3));
@@ -843,7 +862,7 @@ long scsi_read_msf3 (cdrom_drive *d, voi
 static int count_2352_bytes(cdrom_drive *d){
   long i;
   for(i=2351;i>=0;i--)
-    if(d->sg_buffer[i]!=(unsigned char)'\177')
+    if(d->private_data->sg_buffer[i]!=(unsigned char)'\177')
       return(((i+3)>>2)<<2);
 
   return(0);
@@ -852,7 +871,7 @@ static int count_2352_bytes(cdrom_drive 
 static int verify_nonzero(cdrom_drive *d){
   long i,flag=0;
   for(i=0;i<2352;i++)
-    if(d->sg_buffer[i]!=0){
+    if(d->private_data->sg_buffer[i]!=0){
       flag=1;
       break;
     }

Attachment: signature.asc
Description: Digital signature


Reply to: