|
|
|
@ -816,7 +816,7 @@ static int is_ata_drive(char *fname, int fd_in)
|
|
|
|
|
static int is_scsi_drive(char *fname, int fd_in, int *bus_no, int *host_no, |
|
|
|
|
int *channel_no, int *target_no, int *lun_no) |
|
|
|
|
{ |
|
|
|
|
int fd, sid_ret = 0, ret; |
|
|
|
|
int fd = -1, sid_ret = 0, ret, fail_sev_sorry = 0; |
|
|
|
|
struct sg_scsi_id sid; |
|
|
|
|
int *sibling_fds = NULL, sibling_count= 0; |
|
|
|
|
typedef char burn_sg_sibling_fname[BURN_OS_SG_MAX_NAMELEN]; |
|
|
|
@ -836,7 +836,6 @@ static int is_scsi_drive(char *fname, int fd_in, int *bus_no, int *host_no,
|
|
|
|
|
errno, strerror(errno)); |
|
|
|
|
{ret = 0; goto ex;} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sid_ret = ioctl(fd, SG_GET_SCSI_ID, &sid); |
|
|
|
|
if (sid_ret == -1) { |
|
|
|
|
sid.scsi_id = -1; /* mark SCSI address as invalid */ |
|
|
|
@ -851,8 +850,6 @@ static int is_scsi_drive(char *fname, int fd_in, int *bus_no, int *host_no,
|
|
|
|
|
"FATAL: sgio_test() failed: errno=%d '%s'", |
|
|
|
|
errno, strerror(errno)); |
|
|
|
|
|
|
|
|
|
if (fd_in < 0) |
|
|
|
|
sg_close_drive_fd(fname, -1, &fd, 0); |
|
|
|
|
{ret = 0; goto ex;} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -878,19 +875,7 @@ static int is_scsi_drive(char *fname, int fd_in, int *bus_no, int *host_no,
|
|
|
|
|
*bus_no = -1; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
/* >>> SINGLE_OPEN : close in label ex.
|
|
|
|
|
after re-using fd with sg_obtain_scsi_adr_fd() */ |
|
|
|
|
if (fd_in < 0) { |
|
|
|
|
if (sg_close_drive_fd(fname, -1, &fd,
|
|
|
|
|
sid.scsi_type == TYPE_ROM ) <= 0) { |
|
|
|
|
if (linux_sg_enumerate_debug) |
|
|
|
|
fprintf(stderr, |
|
|
|
|
"cannot close properly, errno=%d '%s'\n", |
|
|
|
|
errno, strerror(errno));
|
|
|
|
|
{ret = 0; goto ex;} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fail_sev_sorry = (sid.scsi_type == TYPE_ROM); |
|
|
|
|
if ( (sid_ret == -1 || sid.scsi_type != TYPE_ROM) |
|
|
|
|
&& !linux_sg_accept_any_type) { |
|
|
|
|
if (linux_sg_enumerate_debug) |
|
|
|
@ -901,7 +886,7 @@ static int is_scsi_drive(char *fname, int fd_in, int *bus_no, int *host_no,
|
|
|
|
|
|
|
|
|
|
if (sid_ret == -1 || sid.scsi_id < 0) { |
|
|
|
|
/* ts A61211 : employ a more general ioctl */ |
|
|
|
|
/* ts B11001 : re-use fd if still open */ |
|
|
|
|
/* ts B11001 : re-use fd */ |
|
|
|
|
ret = sg_obtain_scsi_adr_fd(fname, fd, bus_no, host_no, |
|
|
|
|
channel_no, target_no, lun_no); |
|
|
|
|
if (ret>0) { |
|
|
|
@ -946,6 +931,16 @@ static int is_scsi_drive(char *fname, int fd_in, int *bus_no, int *host_no,
|
|
|
|
|
*lun_no= sid.lun; |
|
|
|
|
ret = 1; |
|
|
|
|
ex:; |
|
|
|
|
if (fd_in < 0 && fd >= 0) { |
|
|
|
|
if (sg_close_drive_fd(fname, -1, &fd, fail_sev_sorry) <= 0) { |
|
|
|
|
if (linux_sg_enumerate_debug) |
|
|
|
|
fprintf(stderr, |
|
|
|
|
"cannot close properly, errno=%d '%s'\n", |
|
|
|
|
errno, strerror(errno));
|
|
|
|
|
if (ret > 0) |
|
|
|
|
ret = 0; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
BURN_FREE_MEM(sibling_fds); |
|
|
|
|
BURN_FREE_MEM(sibling_fnames); |
|
|
|
|
return ret; |
|
|
|
|