From 11420e4a32a46e345f3e469e28eb22e0bb1cc72f Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Thu, 28 Jul 2011 19:16:06 +0000 Subject: [PATCH] New option --device_links --- libburn/trunk/cdrskin/cdrskin.1 | 21 +++++++--- libburn/trunk/cdrskin/cdrskin.c | 50 +++++++++++++++++++---- libburn/trunk/cdrskin/cdrskin_timestamp.h | 2 +- 3 files changed, 59 insertions(+), 14 deletions(-) diff --git a/libburn/trunk/cdrskin/cdrskin.1 b/libburn/trunk/cdrskin/cdrskin.1 index 31d36dc9..f9bd364f 100644 --- a/libburn/trunk/cdrskin/cdrskin.1 +++ b/libburn/trunk/cdrskin/cdrskin.1 @@ -2,7 +2,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH CDRSKIN 1 "Jan 09, 2011" +.TH CDRSKIN 1 "Jul 28, 2011" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -256,7 +256,7 @@ that it has to be formatted again. If in doubt, just give it a try. .br The drives, CD, DVD, or BD burners, are accessed via addresses which are specific to libburn and the operating system. Those addresses get listed -by a run of \fBcdrskin --devices\fP. +by a run of \fBcdrskin --devices\fP or \fBcdrskin --device_links\fP. .br On Linux, they are device files which traditionally do not offer w-permissions for normal users. Because libburn needs rw-permission, @@ -512,7 +512,7 @@ cdrskin will not write CD-ROM XA but rather strip the header bytes and write as .TP .BI dev= target Set the address of the drive to use. Valid are at least the -addresses listed with option --devices, +addresses listed with options --devices or --device_links, X,Y,Z addresses listed with option -scanbus, ATA:X,Y,Z addresses listed with options dev=ATA -scanbus, and volatile libburn drive numbers (numbering starts at "0"). @@ -881,6 +881,17 @@ Number dev='Devicefile' rw-Permissions : 'Vendor' 'Model' Number and Devicefile can both be used with option dev=, but number is volatile (numbering changes if drives become busy). .TP +.BI \--device_links +Like --devices, but presenting the drives with addresses of symbolic links +which point to the actual device files. +.br +Modern GNU/Linux systems may shuffle drive addresses from boot to boot. +The udev daemon is supposed to create links which always point to the +same drive, regardless of its system address. +Option --device_links shows the addresses of such links if they begin +by "/dev/dvd" or "/dev/cd". +Precedence is: "dvdrw", "cdrw", "dvd", "cdrom", "cd". +.TP .BI direct_write_amount= size Do not write a session with tracks but rather make an appropriate number of direct write operations with no preparations. Flushing the drive buffer will @@ -1136,7 +1147,7 @@ Wether this leads to senseful behavior depends on operating system and kernel. .TP .BI drive_scsi_dev_family= sr | scd | sg Linux specific: Select a SCSI device file family to be scanned for by -options --devices and -scanbus. +options --devices, --device_links and -scanbus. Normally this is /dev/sgN on kernel versions < 2.6 and /dev/srN on kernels >= 2.6 . This option allows to explicitly override that default in order to meet other programs at a common device file for each drive. @@ -1242,7 +1253,7 @@ cdrskin -scanbus .br cdrskin dev=ATA -scanbus .br -cdrskin --devices +cdrskin --device_links .SS .B Get info about a particular drive or loaded media: .br diff --git a/libburn/trunk/cdrskin/cdrskin.c b/libburn/trunk/cdrskin/cdrskin.c index df4a186c..6a9a4781 100644 --- a/libburn/trunk/cdrskin/cdrskin.c +++ b/libburn/trunk/cdrskin/cdrskin.c @@ -2684,7 +2684,8 @@ return: o->scan_demands_drive= 1; o->demands_cdrskin_caps= 1; - } else if(strcmp(argv[i],"--devices")==0) { + } else if(strcmp(argv[i],"--devices") == 0 || + strcmp(argv[i],"--device_links") == 0) { #ifndef Cdrskin_extra_leaN printf("Note: If this hangs for a while then there is a drive with\n"); printf(" unexpected problems (e.g. ill DMA).\n"); @@ -2879,6 +2880,7 @@ set_dev:; " direct_write_amount= write random access to media like DVD+RW\n"); printf(" --demand_a_drive exit !=0 on bus scans with empty result\n"); printf(" --devices list accessible devices (tells /dev/...)\n"); + printf(" --device_links list accessible devices by (udev) links\n"); printf( " dev_translation= set input address alias\n"); printf(" e.g.: dev_translation=+ATA:1,0,0+/dev/sg1\n"); @@ -3400,7 +3402,7 @@ struct CdrskiN { int single_track; int prodvd_cli_compatible; - int do_devices; + int do_devices; /* 1= --devices , 2= --device_links */ int do_scanbus; @@ -4727,14 +4729,16 @@ int Cdrskin_report_disc_status(struct CdrskiN *skin, enum burn_disc_status s, /** Perform operations -scanbus or --devices @param flag Bitfield for control purposes: bit0= perform --devices rather than -scanbus + bit1= with bit0: perform --device_links @return <=0 error, 1 success */ int Cdrskin_scanbus(struct CdrskiN *skin, int flag) { int ret,i,busno,first_on_bus,pseudo_transport_group= 0,skipped_devices= 0; - int busmax= 16, busidx; + int busmax= 16, busidx, max_dev_len, pad, j; char shellsafe[5*Cdrskin_strleN+2],perms[40],btldev[Cdrskin_adrleN]; char adr[Cdrskin_adrleN],*raw_dev,*drives_shown= NULL; + char link_adr[BURN_DRIVE_ADR_LEN]; int *drives_busses= NULL; struct stat stbuf; @@ -4742,9 +4746,26 @@ int Cdrskin_scanbus(struct CdrskiN *skin, int flag) drives_busses= calloc((skin->n_drives+1), sizeof(int)); if(drives_shown == NULL || drives_busses == NULL) {ret= -1; goto ex;} - for(i= 0; i < (int) skin->n_drives; i++) - drives_shown[i]= 0; + if(flag&1) { + max_dev_len= 0; + for(i= 0; i < (int) skin->n_drives; i++) { + drives_shown[i]= 0; + ret= burn_drive_get_adr(&(skin->drives[i]), adr); + if(ret<=0) + continue; + if(flag & 2) { + ret= burn_lookup_device_link(adr, link_adr, "/dev", NULL, 0, 0); + if(ret == 1) + strcpy(adr, link_adr); + } + if(strlen(adr)>=Cdrskin_strleN) + Text_shellsafe("failure:oversized string", shellsafe, 0); + else + Text_shellsafe(adr, shellsafe,0); + if((int) strlen(shellsafe) > max_dev_len) + max_dev_len= strlen(shellsafe); + } printf("cdrskin: Overview of accessible drives (%d found) :\n", skin->n_drives); printf("-----------------------------------------------------------------------------\n"); @@ -4771,12 +4792,22 @@ 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(flag & 2) { + ret= burn_lookup_device_link(adr, link_adr, "/dev", NULL, 0, 0); + if(ret == 1) + strcpy(adr, link_adr); + } if(strlen(adr)>=Cdrskin_strleN) Text_shellsafe("failure:oversized string",shellsafe,0); else Text_shellsafe(adr,shellsafe,0); - printf("%d dev=%s %s : '%-8.8s' '%s'\n", - i,shellsafe,perms,skin->drives[i].vendor,skin->drives[i].product); + printf("%d dev=%s", i, shellsafe); + pad= max_dev_len - strlen(shellsafe); + if(pad > 0) + for(j= 0; j < pad; j++) + printf(" "); + printf(" %s : '%-8.8s' '%s'\n", + perms, skin->drives[i].vendor, skin->drives[i].product); } printf("-----------------------------------------------------------------------------\n"); } else { @@ -8123,6 +8154,9 @@ option_data:; } else if(strcmp(argv[i],"--devices")==0) { skin->do_devices= 1; + } else if(strcmp(argv[i],"--device_links")==0) { + skin->do_devices= 2; + #ifndef Cdrskin_extra_leaN } else if(strncmp(argv[i],"dev_translation=",16)==0) { @@ -9054,7 +9088,7 @@ int Cdrskin_run(struct CdrskiN *skin, int *exit_value, int flag) {*exit_value= 4; goto no_drive;} if(Cdrskin__is_aborting(0)) goto ex; - ret= Cdrskin_scanbus(skin,1); + ret= Cdrskin_scanbus(skin, 1 | (2 * (skin->do_devices == 2))); if(ret<=0) { fprintf(stderr,"cdrskin: FATAL : --devices failed.\n"); {*exit_value= 4; goto ex;} diff --git a/libburn/trunk/cdrskin/cdrskin_timestamp.h b/libburn/trunk/cdrskin/cdrskin_timestamp.h index 2d57d24d..ee0e99ce 100644 --- a/libburn/trunk/cdrskin/cdrskin_timestamp.h +++ b/libburn/trunk/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2011.07.28.191202" +#define Cdrskin_timestamP "2011.07.28.191536"