From 0b56b9d91586eb5f4218e86e6d8a8aede0611ae9 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Mon, 28 Aug 2006 21:28:24 +0000 Subject: [PATCH] Wrote into API the imperative not to use drive.location but burn_drive_get_adr --- trunk/cdrskin/cdrskin.c | 86 +++++++++++++++++++++++++++++++++++------ trunk/libburn/libburn.h | 4 ++ 2 files changed, 78 insertions(+), 12 deletions(-) diff --git a/trunk/cdrskin/cdrskin.c b/trunk/cdrskin/cdrskin.c index c3c35dd1..d8eaf077 100644 --- a/trunk/cdrskin/cdrskin.c +++ b/trunk/cdrskin/cdrskin.c @@ -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;in_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;in_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); diff --git a/trunk/libburn/libburn.h b/trunk/libburn/libburn.h index 2c6f5b94..6148191a 100644 --- a/trunk/libburn/libburn.h +++ b/trunk/libburn/libburn.h @@ -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;