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