fix usb_id and let scsi_id ignore "illegal request"

This commit is contained in:
Hannes Reinecke 2005-07-08 03:29:19 +02:00 committed by Kay Sievers
parent face198a5f
commit b4a2906bf1
3 changed files with 70 additions and 38 deletions

View File

@ -52,7 +52,7 @@
* options are not supported, but other code is still left in place for
* now.
*/
static const char short_options[] = "bd:f:gip:s:uvVx";
static const char short_options[] = "abd:f:gip:s:uvVx";
/*
* Just duplicate per dev options.
*/
@ -61,6 +61,7 @@ static const char dev_short_options[] = "bgp:";
char sysfs_mnt_path[SYSFS_PATH_MAX];
static int all_good;
static int always_info;
static char *default_callout;
static int dev_specified;
static int sys_specified;
@ -485,6 +486,9 @@ static int set_options(int argc, char **argv, const char *short_opts,
dprintf("option '%c'\n", option);
switch (option) {
case 'a':
always_info = 1;
break;
case 'b':
all_good = 0;
break;
@ -810,7 +814,7 @@ static int scsi_id(const char *target_path, char *maj_min_dev)
retval = 1;
} else if (scsi_get_serial(scsi_dev, maj_min_dev, page_code,
serial, MAX_SERIAL_LEN)) {
retval = 1;
retval = always_info?0:1;
} else {
retval = 0;
}

View File

@ -89,6 +89,7 @@ static const char hex_str[]="0123456789abcdef";
#define SG_ERR_CAT_RESET 2 /* interpreted from sense buffer */
#define SG_ERR_CAT_TIMEOUT 3
#define SG_ERR_CAT_RECOVERED 4 /* Successful command after recovered err */
#define SG_ERR_CAT_NOTSUPPORTED 5 /* Illegal / unsupported command */
#define SG_ERR_CAT_SENSE 98 /* Something else in the sense buffer */
#define SG_ERR_CAT_OTHER 99 /* Some other error/warning */
@ -130,6 +131,8 @@ static int sg_err_category_new(int scsi_status, int msg_status, int
return SG_ERR_CAT_MEDIA_CHANGED;
if (0x29 == asc)
return SG_ERR_CAT_RESET;
} else if (sense_key == ILLEGAL_REQUEST) {
return SG_ERR_CAT_NOTSUPPORTED;
}
}
return SG_ERR_CAT_SENSE;
@ -331,6 +334,9 @@ resend:
retval = sg_err_category3(&io_hdr);
switch (retval) {
case SG_ERR_CAT_NOTSUPPORTED:
buf[1] = 0;
/* Fallthrough */
case SG_ERR_CAT_CLEAN:
case SG_ERR_CAT_RECOVERED:
retval = 0;

View File

@ -72,7 +72,9 @@ static char revision_str[16];
static char type_str[16];
static int use_usb_info;
static int use_num_info;
static int export;
static int debug;
static void set_str(char *to, const unsigned char *from, int count)
{
@ -259,7 +261,7 @@ static int usb_id(const char *target_path)
struct sysfs_device *target_dev;
struct sysfs_device *host_dev, *interface_dev, *usb_dev;
struct sysfs_attribute *scsi_model, *scsi_vendor, *scsi_type, *scsi_rev;
struct sysfs_attribute *usb_model, *usb_vendor, *usb_rev, *usb_serial;
struct sysfs_attribute *usb_model = NULL, *usb_vendor = NULL, *usb_rev, *usb_serial;
struct sysfs_attribute *if_class, *if_subclass;
int if_class_num;
int protocol = 0;
@ -322,11 +324,12 @@ static int usb_id(const char *target_path)
if_class = sysfs_get_device_attr(interface_dev, "bInterfaceClass");
if (!if_class) {
info("%s: cannot get bInterfaceClass attribute", interface_dev->name);
return -1;
return 1;
}
if_class_num = strtoul(if_class->value, NULL, 16);
if (if_class_num != 8) {
set_usb_iftype(type_str, if_class->value, sizeof(type_str) - 1);
protocol = 0;
} else {
if_subclass = sysfs_get_device_attr(interface_dev,
"bInterfaceSubClass");
@ -338,29 +341,29 @@ static int usb_id(const char *target_path)
/* Generic SPC-2 device */
scsi_vendor = sysfs_get_device_attr(scsi_dev, "vendor");
if (!scsi_vendor) {
info("%s: cannot get vendor attribute", scsi_dev->name);
return -1;
info("%s: cannot get SCSI vendor attribute", scsi_dev->name);
return 1;
}
set_str(vendor_str, scsi_vendor->value, sizeof(vendor_str)-1);
scsi_model = sysfs_get_device_attr(scsi_dev, "model");
if (!scsi_model) {
info("%s: cannot get model attribute", scsi_dev->name);
return -1;
info("%s: cannot get SCSI model attribute", scsi_dev->name);
return 1;
}
set_str(model_str, scsi_model->value, sizeof(model_str)-1);
scsi_type = sysfs_get_device_attr(scsi_dev, "type");
if (!scsi_type) {
info("%s: cannot get type attribute", scsi_dev->name);
return -1;
info("%s: cannot get SCSI type attribute", scsi_dev->name);
return 1;
}
set_scsi_type(type_str, scsi_type->value, sizeof(type_str)-1);
scsi_rev = sysfs_get_device_attr(scsi_dev, "rev");
if (!scsi_rev) {
info("%s: cannot get type attribute", scsi_dev->name);
return -1;
info("%s: cannot get SCSI revision attribute", scsi_dev->name);
return 1;
}
set_str(revision_str, scsi_rev->value, sizeof(revision_str)-1);
@ -368,19 +371,29 @@ static int usb_id(const char *target_path)
/* Fallback to USB vendor & device */
if (vendor_str[0] == '\0') {
usb_vendor = sysfs_get_device_attr(usb_dev, "manufacturer");
if (!use_num_info)
if (!(usb_vendor = sysfs_get_device_attr(usb_dev, "manufacturer")))
dbg("No USB vendor string found, using idVendor");
if (!usb_vendor) {
dbg("No USB vendor string found, using idVendor");
usb_vendor = sysfs_get_device_attr(usb_dev, "idVendor");
if (!(usb_vendor = sysfs_get_device_attr(usb_dev, "idVendor"))) {
dbg("No USB vendor information available\n");
sprintf(vendor_str,"0000");
}
}
set_str(vendor_str,usb_vendor->value, sizeof(vendor_str) - 1);
}
if (model_str[0] == '\0') {
usb_model = sysfs_get_device_attr(usb_dev, "product");
if (!use_num_info)
if (!(usb_model = sysfs_get_device_attr(usb_dev, "product")))
dbg("No USB model string found, using idProduct");
if (!usb_model) {
dbg("No USB model string found, using idProduct");
usb_model = sysfs_get_device_attr(usb_dev, "idProduct");
if (!(usb_model = sysfs_get_device_attr(usb_dev, "idProduct"))) {
dbg("No USB model information available\n");
sprintf(model_str,"0000");
}
}
set_str(model_str, usb_model->value, sizeof(model_str) - 1);
}
@ -417,13 +430,20 @@ int main(int argc, char **argv)
exit(1);
}
while ((option = getopt(argc, argv, "ux")) != -1 ) {
while ((option = getopt(argc, argv, "dnux")) != -1 ) {
if (optarg)
dbg("option '%c' arg '%s'", option, optarg);
else
dbg("option '%c'", option);
switch (option) {
case 'd':
debug = 1;
break;
case 'n':
use_num_info=1;
use_usb_info=1;
break;
case 'u':
use_usb_info=1;
break;
@ -432,7 +452,7 @@ int main(int argc, char **argv)
break;
default:
info("Unknown or bad option '%c' (0x%x)", option, option);
retval = -1;
retval = 1;
break;
}
}
@ -452,25 +472,27 @@ int main(int argc, char **argv)
retval = usb_id(target_path);
if (export) {
printf("ID_VENDOR=%s\n", vendor_str);
printf("ID_MODEL=%s\n", model_str);
printf("ID_REVISION=%s\n", revision_str);
if (serial_str[0] == '\0') {
printf("ID_SERIAL=%s_%s\n",
vendor_str, model_str);
if (retval == 0) {
if (export) {
printf("ID_VENDOR=%s\n", vendor_str);
printf("ID_MODEL=%s\n", model_str);
printf("ID_REVISION=%s\n", revision_str);
if (serial_str[0] == '\0') {
printf("ID_SERIAL=%s_%s\n",
vendor_str, model_str);
} else {
printf("ID_SERIAL=%s_%s_%s\n",
vendor_str, model_str, serial_str);
}
printf("ID_TYPE=%s\n", type_str);
} else {
printf("ID_SERIAL=%s_%s_%s\n",
vendor_str, model_str, serial_str);
}
printf("ID_TYPE=%s\n", type_str);
} else {
if (serial_str[0] == '\0') {
printf("%s_%s\n",
vendor_str, model_str);
} else {
printf("%s_%s_%s\n",
vendor_str, model_str, serial_str);
if (serial_str[0] == '\0') {
printf("%s_%s\n",
vendor_str, model_str);
} else {
printf("%s_%s_%s\n",
vendor_str, model_str, serial_str);
}
}
}
exit(retval);