From: Kay Sievers Date: Mon, 15 Oct 2007 18:38:20 +0000 (+0200) Subject: usb_id: fail if vendor/product can not be retrieved X-Git-Tag: 174~1805 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=963033472f8d2aab0bf77147b916de8f3b0b5450 usb_id: fail if vendor/product can not be retrieved Thanks to Daniel Drake for identifying the bug. --- diff --git a/extras/usb_id/usb_id.c b/extras/usb_id/usb_id.c index d36a27b3c..5fb030db5 100644 --- a/extras/usb_id/usb_id.c +++ b/extras/usb_id/usb_id.c @@ -1,7 +1,5 @@ /* - * usb_id.c - * - * Identify an USB (block) device + * usb_id - identify an USB device * * Copyright (c) 2005 SUSE Linux Products GmbH, Germany * @@ -224,8 +222,6 @@ static int usb_id(const char *devpath) struct sysfs_device *dev; struct sysfs_device *dev_interface; struct sysfs_device *dev_usb; - const char *scsi_model, *scsi_vendor, *scsi_type, *scsi_rev; - const char *usb_model = NULL, *usb_vendor = NULL, *usb_rev, *usb_serial; const char *if_class, *if_subclass; int if_class_num; int protocol = 0; @@ -271,6 +267,7 @@ static int usb_id(const char *devpath) /* mass storage */ if (protocol == 6 && !use_usb_info) { struct sysfs_device *dev_scsi; + const char *scsi_model, *scsi_vendor, *scsi_type, *scsi_rev; int host, bus, target, lun; /* get scsi device */ @@ -321,40 +318,50 @@ static int usb_id(const char *devpath) } fallback: - /* Fallback to USB vendor & device */ + /* fallback to USB vendor & device */ if (vendor_str[0] == '\0') { + const char *usb_vendor = NULL; + if (!use_num_info) - if (!(usb_vendor = sysfs_attr_get_value(dev_usb->devpath, "manufacturer"))) - dbg("No USB vendor string found, using idVendor"); + usb_vendor = sysfs_attr_get_value(dev_usb->devpath, "manufacturer"); + + if (!usb_vendor) + usb_vendor = sysfs_attr_get_value(dev_usb->devpath, "idVendor"); if (!usb_vendor) { - if (!(usb_vendor = sysfs_attr_get_value(dev_usb->devpath, "idVendor"))) { - dbg("No USB vendor information available\n"); - sprintf(vendor_str,"0000"); - } + info("No USB vendor information available"); + return 1; } - set_str(vendor_str,usb_vendor, sizeof(vendor_str) - 1); + set_str(vendor_str, usb_vendor, sizeof(vendor_str)-1); } - + if (model_str[0] == '\0') { + const char *usb_model = NULL; + if (!use_num_info) - if (!(usb_model = sysfs_attr_get_value(dev_usb->devpath, "product"))) - dbg("No USB model string found, using idProduct"); - + usb_model = sysfs_attr_get_value(dev_usb->devpath, "product"); + + if (!usb_model) + usb_model = sysfs_attr_get_value(dev_usb->devpath, "idProduct"); + if (!usb_model) { - if (!(usb_model = sysfs_attr_get_value(dev_usb->devpath, "idProduct"))) - dbg("No USB model information available\n"); sprintf(model_str,"0000"); + dbg("No USB model information available"); + return 1; } - set_str(model_str, usb_model, sizeof(model_str) - 1); + set_str(model_str, usb_model, sizeof(model_str)-1); } if (revision_str[0] == '\0') { + const char *usb_rev; + usb_rev = sysfs_attr_get_value(dev_usb->devpath, "bcdDevice"); if (usb_rev) set_str(revision_str, usb_rev, sizeof(revision_str)-1); } if (serial_str[0] == '\0') { + const char *usb_serial; + usb_serial = sysfs_attr_get_value(dev_usb->devpath, "serial"); if (usb_serial) set_str(serial_str, usb_serial, sizeof(serial_str)-1);