Wrote into API the imperative not to use drive.location but burn_drive_get_adr

This commit is contained in:
Thomas Schmitt 2006-08-28 21:28:24 +00:00
parent 27c2fee063
commit 0b56b9d915
2 changed files with 78 additions and 12 deletions

View File

@ -152,6 +152,10 @@ or
#define Cdrskin_libburn_largefilE 1
#define Cdrskin_libburn_padding_does_worK 1
#ifdef Cdrskin_new_api_tesT
#define Cdrskin_libburn_has_drive_get_adR 1
#endif
#endif /* Cdrskin_libburn_0_2_1 */
#ifndef Cdrskin_libburn_versioN
@ -2327,10 +2331,21 @@ int Cdrskin_abort_handler(struct CdrskiN *skin, int signum, int flag)
int Cdrskin_driveno_of_location(struct CdrskiN *skin, char *devicename,
int *driveno, int flag)
{
int i;
int i,ret;
char adr[Cdrskin_adrleN];
for(i=0;i<skin->n_drives;i++) {
if(strcmp(skin->drives[i].location,devicename)==0) {
#ifdef Cdrskin_libburn_has_drive_get_adR
ret= burn_drive_get_adr(&(skin->drives[skin->driveno]), adr);
if(ret<=0)
continue;
#else
ret= 1; /* to please gcc -Wall */
strcpy(adr,skin->drives[i].location);
#endif
if(strcmp(adr,devicename)==0) {
*driveno= i;
return(1);
}
@ -2422,11 +2437,21 @@ int Cdrskin_driveno_to_btldev(struct CdrskiN *skin, int driveno,
char btldev[Cdrskin_adrleN], int flag)
{
int k,ret,still_untranslated= 1,hret;
char *loc= NULL,buf[Cdrskin_adrleN];
char *loc= NULL,buf[Cdrskin_adrleN],adr[Cdrskin_adrleN];
if(driveno<0 || driveno>skin->n_drives)
goto fallback;
#ifdef Cdrskin_libburn_has_drive_get_adR
ret= burn_drive_get_adr(&(skin->drives[driveno]), adr);
if(ret<=0)
goto fallback;
loc= adr;
#else
adr[0]= 0; /* to please gcc -Wall */
loc= skin->drives[driveno].location;
#endif
if(loc==NULL)
goto fallback;
if(strncmp(loc,"/dev/sg",7)==0) {
@ -2499,6 +2524,7 @@ int Cdrskin_scanbus(struct CdrskiN *skin, int flag)
{
int ret,i,busno,first_on_bus;
char shellsafe[5*Cdrskin_strleN+2],perms[40],btldev[Cdrskin_adrleN];
char adr[Cdrskin_adrleN];
struct stat stbuf;
if(flag&1) {
@ -2506,7 +2532,18 @@ int Cdrskin_scanbus(struct CdrskiN *skin, int flag)
skin->n_drives);
printf("-----------------------------------------------------------------------------\n");
for(i=0;i<skin->n_drives;i++) {
if(stat(skin->drives[i].location,&stbuf)==-1) {
#ifdef Cdrskin_libburn_has_drive_get_adR
ret= burn_drive_get_adr(&(skin->drives[i]), adr);
if(ret<=0) {
/* >>> one should massively complain */;
continue;
}
#else
strcpy(adr,skin->drives[i].location);
#endif
if(stat(adr,&stbuf)==-1) {
sprintf(perms,"errno=%d",errno);
} else {
strcpy(perms,"------");
@ -2517,10 +2554,10 @@ int Cdrskin_scanbus(struct CdrskiN *skin, int flag)
if(stbuf.st_mode&S_IROTH) perms[4]= 'r';
if(stbuf.st_mode&S_IWOTH) perms[5]= 'w';
}
if(strlen(skin->drives[i].location)>=Cdrskin_strleN)
if(strlen(adr)>=Cdrskin_strleN)
Text_shellsafe("failure:oversized string",shellsafe,0);
else
Text_shellsafe(skin->drives[i].location,shellsafe,0);
Text_shellsafe(adr,shellsafe,0);
printf("%d dev=%s %s : '%s' '%s'\n",
i,shellsafe,perms,skin->drives[i].vendor,skin->drives[i].product);
}
@ -3383,6 +3420,7 @@ ex:;
int Cdrskin_eject(struct CdrskiN *skin, int flag)
{
int ret;
char adr[Cdrskin_adrleN];
#ifndef Cdrskin_burn_drive_eject_brokeN
@ -3407,13 +3445,21 @@ int Cdrskin_eject(struct CdrskiN *skin, int flag)
"cdrskin: HINT : to run cdrskin under your normal user identity.\n");
return(0);
}
#ifdef Cdrskin_libburn_has_drive_get_adR
ret= burn_drive_get_adr(&(skin->drives[skin->driveno]), adr);
if(ret<=0)
adr[0]= 0;
#else
strcpy(adr,skin->drives[skin->driveno].location);
#endif
if(strlen(skin->eject_device)>0)
sprintf(cmd,"eject %s",Text_shellsafe(skin->eject_device,shellsafe,0));
else if(strcmp(skin->drives[skin->driveno].location,"/dev/sg0")==0)
else if(strcmp(adr,"/dev/sg0")==0)
sprintf(cmd,"eject /dev/sr0");
else
sprintf(cmd,"eject %s",Text_shellsafe(skin->drives[skin->driveno].location,
shellsafe,0));
sprintf(cmd,"eject %s",Text_shellsafe(adr,shellsafe,0));
ret= system(cmd);
if(ret==0)
return(1);
@ -3436,7 +3482,7 @@ int Cdrskin_setup(struct CdrskiN *skin, int argc, char **argv, int flag)
{
int i,k,ret;
double value,grab_and_wait_value= -1.0;
char *cpt,*value_pt;
char *cpt,*value_pt,adr[Cdrskin_adrleN];
/* cdrecord 2.01 options which are not scheduled for implementation, yet */
static char ignored_partial_options[][41]= {
@ -3877,6 +3923,12 @@ track_too_large:;
printf(
"cdrskin: NOTE : augmenting non-tao write mode by tao_to_sao_tsize\n");
printf("cdrskin: NOTE : fixed size : %.f\n",skin->fixed_size);
/* >>> upcoming problem fix
} else if(skin->fixed_size<=0) {
fprintf(stderr,
"cdrskin: FATAL : \"-\" (stdin) needs a fixed tsize= or tao_to_sao_tsize=\n");
return(0);
*/
}
} else if(skin->preskin->allow_fd_source==0 &&
argv[i][0]=='#' && (argv[i][1]>='0' && argv[i][1]<='9')) {
@ -3945,9 +3997,19 @@ ignore_unknown:;
&(skin->driveno),0);
if(ret<=0)
return(ret);
if(skin->verbosity>=Cdrskin_verbose_cmD)
if(skin->verbosity>=Cdrskin_verbose_cmD) {
#ifdef Cdrskin_libburn_has_drive_get_adR
ret= burn_drive_get_adr(&(skin->drives[skin->driveno]), adr);
if(ret<=0)
adr[0]= 0;
#else
strcpy(adr,skin->drives[skin->driveno].location);
#endif
printf("cdrskin: active drive number : %d '%s'\n",
skin->driveno,skin->drives[skin->driveno].location);
skin->driveno,adr);
}
}
if(grab_and_wait_value>0) {
Cdrskin_grab_drive(skin,0);

View File

@ -314,6 +314,10 @@ struct burn_drive_info
char revision[5];
/** Location of the drive in the filesystem. */
char location[17];
/** This is currently the string which is used as persistent
drive address. But be warned: there is NO GUARANTEE that this
will stay so. Always use function burn_drive_get_adr() to
inquire a persisten address. ^^^^^^ ALWAYS ^^^^^^ */
/** Can the drive read DVD-RAM discs */
unsigned int read_dvdram:1;