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