Changed pseudo-cdrecord addresses: /dev/hdX = ATA:(X-'a')/2,(X-'a')%2,0

This commit is contained in:
Thomas Schmitt 2006-10-11 19:21:26 +00:00
parent 30168169a7
commit 8fbb799a3f
3 changed files with 48 additions and 41 deletions

View File

@ -238,17 +238,19 @@ I have the hope that Joerg feels more flattered than annoyed by cdrskin.
Pseudo-SCSI Adresses Pseudo-SCSI Adresses
cdrecord and cdrskin share only some syntax of addresses but not necessarily cdrecord and cdrskin share the syntax of addresses but not necessarily
the meaning of the components. A cdrecord-style address for cdrskin the meaning of the components. A cdrecord-style address for cdrskin
[prefix:]scsibus,target,lun [prefix:]scsibus,target,lun
can be interpreted in two different modes. can be interpreted in two different modes.
Standard mode uses scsibus,target,lun as given by the operating system. On Standard mode tries to be compatible to original cdrecord. This should be true
(old) real SCSI burners and on emulated SCSI it is compatible to cdrecord. with (emulated) SCSI where the /dev/sgN with is looked up with matching
scsibus,target,lun as given by the operating system.
With dev=ATA: or dev=ATAPI: the translation to /dev/hdX is purely literal
but matches the cdrecord addresses on all systems tested so far:
X = 'a' + 2 * scsibus + target
where target only may have the values 0 or 1.
On plain IDE this mode offers no compatible scsibus,target,lun addressing,
but the cdrecord-ly advised methods ATA:scsibus,target,lun and ATAPI:...
are supported by cdrskin via an own incompatible address enumeration.
In this mode, option -scanbus will list only SCSI devices unless option In this mode, option -scanbus will list only SCSI devices unless option
dev=ATA or dev=ATAPI are given, which will suppress SCSI devices and only dev=ATA or dev=ATAPI are given, which will suppress SCSI devices and only
show IDE drives (i.e. /dev/hdX without ide-scsi emulation). show IDE drives (i.e. /dev/hdX without ide-scsi emulation).
@ -276,10 +278,7 @@ a meaning. To stay upward compatible, use addresses as printed by -scanbus.
Some programs or users have their own ideas about the address of their burner. Some programs or users have their own ideas about the address of their burner.
K3b 0.10 for example derives cdrecord addresses by own examination of the K3b 0.10 for example derives cdrecord addresses by own examination of the
devices and not by calling cdrecord -scanbus. devices and not by calling cdrecord -scanbus.
On systems where the burners are attached via (emulated) SCSI, standard mode Standard mode will hopefully be fully compatible with their ideas.
will hopefully be fully compatible. If IDE devices are used, then hope that
the frontend uses directly /dev/hdX or asks its "cdrecord:" via
dev=ATA -scanbus for drive addresses and drive descriptions.
Old frontends which do not know dev=ATA or dev=ATAPI and which do ask their Old frontends which do not know dev=ATA or dev=ATAPI and which do ask their
"cdrecord" via -scanbus may be well served with option --old_pseudo_scsi_adr . "cdrecord" via -scanbus may be well served with option --old_pseudo_scsi_adr .

View File

@ -1416,7 +1416,7 @@ int Cdrpreskin_queue_msgs(struct CdrpreskiN *o, int flag)
@param flag Bitfield for control purposes: @param flag Bitfield for control purposes:
bit0= old_pseudo_scsi_adr bit0= old_pseudo_scsi_adr
@return 1 success, 0=no recognizable format, -1=severe error, @return 1 success, 0=no recognizable format, -1=severe error,
-2 could not find scsi device -2 could not find scsi device, -3 address format error
*/ */
int Cdrpreskin__cdrecord_to_dev(char *adr, char device_adr[Cdrskin_adrleN], int Cdrpreskin__cdrecord_to_dev(char *adr, char device_adr[Cdrskin_adrleN],
int *driveno, int flag) int *driveno, int flag)
@ -1469,19 +1469,23 @@ int Cdrpreskin__cdrecord_to_dev(char *adr, char device_adr[Cdrskin_adrleN],
} else if(busno!=0) { } else if(busno!=0) {
fprintf(stderr, fprintf(stderr,
"cdrskin: FATAL : dev=[Prefix:]Bus,Target,Lun expects Bus out of {0,1,2}\n"); "cdrskin: FATAL : dev=[Prefix:]Bus,Target,Lun expects Bus out of {0,1,2}\n");
return(0); return(-3);
} }
} else { } else {
if(busno<0) { if(busno<0) {
fprintf(stderr, fprintf(stderr,
"cdrskin: FATAL : dev=[Prefix:]Bus,Target,Lun expects Bus number >= 0\n"); "cdrskin: FATAL : dev=[Prefix:]Bus,Target,Lun expects Bus number >= 0\n");
return(0); return(-3);
} }
if((strncmp(adr,"ATA",3)==0 && (adr[3]==0 || adr[3]==':')) || if((strncmp(adr,"ATA",3)==0 && (adr[3]==0 || adr[3]==':')) ||
(strncmp(adr,"ATAPI",5)==0 && (adr[5]==0 || adr[5]==':'))) { (strncmp(adr,"ATAPI",5)==0 && (adr[5]==0 || adr[5]==':'))) {
/* >>> in future expect busno to have a meaning */ if(busno>12 || (*driveno)<0 || (*driveno)>1) {
sprintf(device_adr,"/dev/hd%c",'a'+(*driveno)); fprintf(stderr,
"cdrskin: FATAL : dev=ATA:Bus,Target,Lun expects Bus {0..12}, Target {0,1}\n");
return(-3);
}
sprintf(device_adr,"/dev/hd%c",'a'+(2*busno)+(*driveno));
#ifdef Cdrskin_libburn_has_convert_scsi_adR #ifdef Cdrskin_libburn_has_convert_scsi_adR
} else { } else {
@ -1966,7 +1970,7 @@ dev_too_long:;
} else { } else {
ret= Cdrpreskin__cdrecord_to_dev(adr,o->device_adr,&driveno, ret= Cdrpreskin__cdrecord_to_dev(adr,o->device_adr,&driveno,
!!o->old_pseudo_scsi_adr); !!o->old_pseudo_scsi_adr);
if(ret==-2) if(ret==-2 || ret==-3)
{ret= 0; goto ex;} {ret= 0; goto ex;}
if(ret<0) if(ret<0)
goto ex; goto ex;
@ -2945,11 +2949,9 @@ int Cdrskin_driveno_to_btldev(struct CdrskiN *skin, int driveno,
if(strncmp(loc,"/dev/hd",7)==0) if(strncmp(loc,"/dev/hd",7)==0)
if(loc[7]>='a' && loc[7]<='z') if(loc[7]>='a' && loc[7]<='z')
if(loc[8]==0) { if(loc[8]==0) {
bus_no= (loc[7]-'a')/2;
/* >>> implement new ATA enumeration here */ sprintf(btldev,"%d,%d,0",bus_no,(loc[7]-'a')%2);
{ret= 2000000 + bus_no; goto adr_translation;}
sprintf(btldev,"2,%d,0",loc[7]-'a');
{ret= 2000002; goto adr_translation;}
} }
goto fallback; goto fallback;
} else { } else {
@ -3037,6 +3039,7 @@ int Cdrskin_report_disc_status(struct CdrskiN *skin, enum burn_disc_status s,
int Cdrskin_scanbus(struct CdrskiN *skin, int flag) int Cdrskin_scanbus(struct CdrskiN *skin, int flag)
{ {
int ret,i,busno,first_on_bus,pseudo_transport_group= 0,skipped_devices= 0; int ret,i,busno,first_on_bus,pseudo_transport_group= 0,skipped_devices= 0;
int busmax= 16;
char shellsafe[5*Cdrskin_strleN+2],perms[40],btldev[Cdrskin_adrleN]; char shellsafe[5*Cdrskin_strleN+2],perms[40],btldev[Cdrskin_adrleN];
char adr[Cdrskin_adrleN],*raw_dev,*drives_shown= NULL; char adr[Cdrskin_adrleN],*raw_dev,*drives_shown= NULL;
struct stat stbuf; struct stat stbuf;
@ -3097,14 +3100,14 @@ int Cdrskin_scanbus(struct CdrskiN *skin, int flag)
/* >>> fprintf(stderr,"Linux sg driver version: 3.1.25\n"); */ /* >>> fprintf(stderr,"Linux sg driver version: 3.1.25\n"); */
printf("Using libburn version '%s'.\n", Cdrskin_libburn_versioN); printf("Using libburn version '%s'.\n", Cdrskin_libburn_versioN);
if(pseudo_transport_group!=1000000) if(pseudo_transport_group!=1000000)
printf( if(skin->preskin->old_pseudo_scsi_adr)
"cdrskin: NOTE : The printed addresses are not cdrecord compatible !\n"); printf("cdrskin: NOTE : The printed addresses are not cdrecord compatible !\n");
for(busno= 0;busno<=16;busno++) { for(busno= 0;busno<=busmax;busno++) {
first_on_bus= 1; first_on_bus= 1;
for(i=0;i<skin->n_drives;i++) { for(i=0;i<skin->n_drives;i++) {
ret= Cdrskin_driveno_to_btldev(skin,i,btldev,1); ret= Cdrskin_driveno_to_btldev(skin,i,btldev,1);
if(busno==16 && drives_shown[i]==0) { if(busno==busmax && drives_shown[i]==0) {
if(ret/1000000 != pseudo_transport_group) { if(ret/1000000 != pseudo_transport_group) {
skipped_devices++; skipped_devices++;
if(skin->verbosity>=Cdrskin_verbose_debuG) if(skin->verbosity>=Cdrskin_verbose_debuG)
@ -3128,7 +3131,7 @@ int Cdrskin_scanbus(struct CdrskiN *skin, int flag)
printf("cdrskin: NOTE : There were %d drives not shown.\n", printf("cdrskin: NOTE : There were %d drives not shown.\n",
skipped_devices); skipped_devices);
else else
printf("cdrskin: NOTE : There was 1 drives not shown.\n"); printf("cdrskin: NOTE : There was 1 drive not shown.\n");
printf("cdrskin: HINT : To surely see all drives try option: --devices\n"); printf("cdrskin: HINT : To surely see all drives try option: --devices\n");
if(pseudo_transport_group!=2000000) if(pseudo_transport_group!=2000000)
printf("cdrskin: HINT : or try options: dev=ATA -scanbus\n"); printf("cdrskin: HINT : or try options: dev=ATA -scanbus\n");
@ -3683,7 +3686,11 @@ int Cdrskin_burn(struct CdrskiN *skin, int flag)
disc= burn_disc_create(); disc= burn_disc_create();
session= burn_session_create(); session= burn_session_create();
burn_disc_add_session(disc,session,BURN_POS_END); ret= burn_disc_add_session(disc,session,BURN_POS_END);
if(ret==0) {
fprintf(stderr,"cdrskin: FATAL : cannot add session to disc object.\n");
return(0);
}
skin->fixed_size= 0.0; skin->fixed_size= 0.0;
for(i=0;i<skin->track_counter;i++) { for(i=0;i<skin->track_counter;i++) {
@ -4594,25 +4601,26 @@ ignore_unknown:;
if(strlen(skin->preskin->raw_device_adr)>0 || if(strlen(skin->preskin->raw_device_adr)>0 ||
strlen(skin->preskin->device_adr)>0) { strlen(skin->preskin->device_adr)>0) {
if(strlen(skin->preskin->device_adr)>0) if(strlen(skin->preskin->device_adr)>0)
ret= Cdrskin_dev_to_driveno(skin,skin->preskin->device_adr, cpt= skin->preskin->device_adr;
&(skin->driveno),0);
else else
ret= Cdrskin_dev_to_driveno(skin,skin->preskin->raw_device_adr, cpt= skin->preskin->raw_device_adr;
&(skin->driveno),0); if(strcmp(cpt,"ATA")!=0 && strcmp(cpt,"ATAPI")!=0 && strcmp(cpt,"SCSI")!=0){
if(ret<=0) ret= Cdrskin_dev_to_driveno(skin,cpt,&(skin->driveno),0);
return(ret); if(ret<=0)
if(skin->verbosity>=Cdrskin_verbose_cmD) { return(ret);
if(skin->verbosity>=Cdrskin_verbose_cmD) {
#ifdef Cdrskin_libburn_has_drive_get_adR #ifdef Cdrskin_libburn_has_drive_get_adR
ret= burn_drive_get_adr(&(skin->drives[skin->driveno]), adr); ret= burn_drive_get_adr(&(skin->drives[skin->driveno]), adr);
if(ret<=0) if(ret<=0)
adr[0]= 0; adr[0]= 0;
#else #else
strcpy(adr,skin->drives[skin->driveno].location); strcpy(adr,skin->drives[skin->driveno].location);
#endif #endif
printf("cdrskin: active drive number : %d '%s'\n", printf("cdrskin: active drive number : %d '%s'\n",
skin->driveno,adr); skin->driveno,adr);
}
} }
} }
if(grab_and_wait_value>0) { if(grab_and_wait_value>0) {

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2006.10.10.175444" #define Cdrskin_timestamP "2006.10.11.191959"