diff --git a/libburn/drive.c b/libburn/drive.c index ac9273f..509471c 100644 --- a/libburn/drive.c +++ b/libburn/drive.c @@ -656,15 +656,27 @@ int burn_drive_scan_and_grab(struct burn_drive_info *drive_infos[], char* adr, return 1; } -/* ts A60823 */ +/* ts A60923 */ +/** Inquire the persistent address of the given drive. */ +int burn_drive_raw_get_adr(struct burn_drive *d, char adr[]) +{ + assert(strlen(d->devname) < BURN_DRIVE_ADR_LEN); + strcpy(adr,d->devname); + return 1; +} + +/* ts A60823 - A60923 */ /** Inquire the persistent address of the given drive. */ int burn_drive_get_adr(struct burn_drive_info *drive_info, char adr[]) { - assert(strlen(drive_info->location) < BURN_DRIVE_ADR_LEN); - strcpy(adr,drive_info->location); - return 1; + int ret; + + assert(drive_info->drive!=NULL); + ret = burn_drive_raw_get_adr(drive_info->drive, adr); + return ret; } + /* ts A60922 ticket 33 */ /** Evaluate wether the given address would be enumerated by libburn */ int burn_drive_is_enumerable_adr(char *adr) @@ -849,7 +861,24 @@ fprintf(stderr,"libburn experimental: Nothing found for %s \n",path); int burn_drive_obtain_scsi_adr(char *path, int *host_no, int *channel_no, int *target_no, int *lun_no) { - int ret; + int ret, i; + char adr[BURN_DRIVE_ADR_LEN]; + + /* open drives cannot be inquired by sg_obtain_scsi_adr() */ + for (i = 0; i < drivetop + 1; i++) { + if (drive_array[i].global_index < 0) + continue; + ret = burn_drive_raw_get_adr(&(drive_array[i]),adr); + if (ret <= 0) + continue; + if (strcmp(adr, path) == 0) { + *host_no = drive_array[i].host; + *channel_no = drive_array[i].channel; + *target_no = drive_array[i].id; + *lun_no = drive_array[i].lun; + return 1; + } + } ret = sg_obtain_scsi_adr(path, host_no, channel_no, target_no, lun_no); return ret; diff --git a/libburn/sg.c b/libburn/sg.c index 0250c23..3cfdc8a 100644 --- a/libburn/sg.c +++ b/libburn/sg.c @@ -23,7 +23,8 @@ #include "toc.h" #include "util.h" -static void enumerate_common(char *fname); +static void enumerate_common(char *fname, int host_no, int channel_no, + int target_no, int lun_no); /* ts A51221 */ int burn_drive_is_banned(char *device_address); @@ -177,7 +178,7 @@ void ata_enumerate(void) return; } close(fd); - enumerate_common(fname); + enumerate_common(fname, -1, -1, -1, -1); } } @@ -248,15 +249,23 @@ void sg_enumerate(void) fprintf(stderr,"libburn experimental: SCSI triple: %d,%d,%d\n",sid.host_no,sid.scsi_id,sid.lun); */ - enumerate_common(fname); + enumerate_common(fname, sid.host_no, sid.channel, + sid.scsi_id, sid.lun); } } - -static void enumerate_common(char *fname) +/* ts A60923 : introduced new SCSI parameters */ +static void enumerate_common(char *fname, int host_no, int channel_no, + int target_no, int lun_no) { struct burn_drive *t; struct burn_drive out; + /* ts A60923 */ + out.host = host_no; + out.id = target_no; + out.channel = channel_no; + out.lun = lun_no; + out.devname = burn_strdup(fname); out.fd = -1337; @@ -321,7 +330,7 @@ static void enumerate_common(char *fname) if refcount is not one, drive is open somewhere else. ts A60813: this test is too late. O_EXCL is the stronger solution. - After all the test was diabled already in icculus.org/burn CVS. + After all the test was disabled already in icculus.org/burn CVS. */ int sg_grab(struct burn_drive *d) {