type_num = strtoul(from, &eptr, 0);
if (eptr != from) {
switch (type_num) {
+ case 1: /* RBC devices */
+ type = "rbc";
+ break;
case 2:
type = "atapi";
break;
type = "tape";
break;
case 4: /* UFI */
- case 5: /* SFF-8070i */
type = "floppy";
break;
- case 1: /* RBC devices */
- type = "rbc";
- break;
case 6: /* Transparent SPC-2 devices */
type = "scsi";
break;
static int dev_if_packed_info(struct udev_device *dev, char *ifs_str, size_t len)
{
- char *filename = NULL;
- int fd;
+ _cleanup_free_ char *filename = NULL;
+ _cleanup_close_ int fd = -1;
ssize_t size;
unsigned char buf[18 + 65535];
- unsigned int pos, strpos;
+ int pos = 0;
+ unsigned strpos = 0;
struct usb_interface_descriptor {
u_int8_t bLength;
u_int8_t bDescriptorType;
u_int8_t bInterfaceProtocol;
u_int8_t iInterface;
} __attribute__((packed));
- int err = 0;
- if (asprintf(&filename, "%s/descriptors", udev_device_get_syspath(dev)) < 0) {
- err = -1;
- goto out;
- }
+ if (asprintf(&filename, "%s/descriptors", udev_device_get_syspath(dev)) < 0)
+ return log_oom();
+
fd = open(filename, O_RDONLY|O_CLOEXEC);
if (fd < 0) {
fprintf(stderr, "error opening USB device 'descriptors' file\n");
- err = -1;
- goto out;
+ return -errno;
}
+
size = read(fd, buf, sizeof(buf));
- close(fd);
- if (size < 18 || size == sizeof(buf)) {
- err = -1;
- goto out;
- }
+ if (size < 18 || size == sizeof(buf))
+ return -EIO;
- pos = 0;
- strpos = 0;
ifs_str[0] = '\0';
while (pos < size && strpos+7 < len-2) {
struct usb_interface_descriptor *desc;
memcpy(&ifs_str[strpos], if_str, 8),
strpos += 7;
}
+
if (strpos > 0) {
ifs_str[strpos++] = ':';
ifs_str[strpos++] = '\0';
}
-out:
- free(filename);
- return err;
+
+ return 0;
}
/*
* A unique USB identification is generated like this:
*
* 1.) Get the USB device type from InterfaceClass and InterfaceSubClass
- * 2.) If the device type is 'Mass-Storage/SPC-2' or 'Mass-Storage/RBC'
+ * 2.) If the device type is 'Mass-Storage/SPC-2' or 'Mass-Storage/RBC',
* use the SCSI vendor and model as USB-Vendor and USB-model.
- * 3.) Otherwise use the USB manufacturer and product as
+ * 3.) Otherwise, use the USB manufacturer and product as
* USB-Vendor and USB-model. Any non-printable characters
* in those strings will be skipped; a slash '/' will be converted
* into a full stop '.'.
/* usb interface directory */
dev_interface = udev_device_get_parent_with_subsystem_devtype(dev, "usb", "usb_interface");
if (dev_interface == NULL) {
- log_debug("unable to access usb_interface device of '%s'\n",
+ log_debug("unable to access usb_interface device of '%s'",
udev_device_get_syspath(dev));
return EXIT_FAILURE;
}
if_class = udev_device_get_sysattr_value(dev_interface, "bInterfaceClass");
if (!if_class) {
- log_debug("%s: cannot get bInterfaceClass attribute\n",
+ log_debug("%s: cannot get bInterfaceClass attribute",
udev_device_get_sysname(dev));
return EXIT_FAILURE;
}
set_usb_iftype(type_str, if_class_num, sizeof(type_str)-1);
}
- log_debug("%s: if_class %d protocol %d\n",
+ log_debug("%s: if_class %d protocol %d",
udev_device_get_syspath(dev_interface), if_class_num, protocol);
/* usb device directory */
dev_usb = udev_device_get_parent_with_subsystem_devtype(dev_interface, "usb", "usb_device");
if (!dev_usb) {
- log_debug("unable to find parent 'usb' device of '%s'\n",
+ log_debug("unable to find parent 'usb' device of '%s'",
udev_device_get_syspath(dev));
return EXIT_FAILURE;
}
/* get scsi device */
dev_scsi = udev_device_get_parent_with_subsystem_devtype(dev, "scsi", "scsi_device");
if (dev_scsi == NULL) {
- log_debug("unable to find parent 'scsi' device of '%s'\n",
+ log_debug("unable to find parent 'scsi' device of '%s'",
udev_device_get_syspath(dev));
goto fallback;
}
if (sscanf(udev_device_get_sysname(dev_scsi), "%d:%d:%d:%d", &host, &bus, &target, &lun) != 4) {
- log_debug("invalid scsi device '%s'\n", udev_device_get_sysname(dev_scsi));
+ log_debug("invalid scsi device '%s'", udev_device_get_sysname(dev_scsi));
goto fallback;
}
/* Generic SPC-2 device */
scsi_vendor = udev_device_get_sysattr_value(dev_scsi, "vendor");
if (!scsi_vendor) {
- log_debug("%s: cannot get SCSI vendor attribute\n",
+ log_debug("%s: cannot get SCSI vendor attribute",
udev_device_get_sysname(dev_scsi));
goto fallback;
}
scsi_model = udev_device_get_sysattr_value(dev_scsi, "model");
if (!scsi_model) {
- log_debug("%s: cannot get SCSI model attribute\n",
+ log_debug("%s: cannot get SCSI model attribute",
udev_device_get_sysname(dev_scsi));
goto fallback;
}
scsi_type = udev_device_get_sysattr_value(dev_scsi, "type");
if (!scsi_type) {
- log_debug("%s: cannot get SCSI type attribute\n",
+ log_debug("%s: cannot get SCSI type attribute",
udev_device_get_sysname(dev_scsi));
goto fallback;
}
scsi_rev = udev_device_get_sysattr_value(dev_scsi, "rev");
if (!scsi_rev) {
- log_debug("%s: cannot get SCSI revision attribute\n",
+ log_debug("%s: cannot get SCSI revision attribute",
udev_device_get_sysname(dev_scsi));
goto fallback;
}
if (!usb_vendor)
usb_vendor = vendor_id;
if (!usb_vendor) {
- log_debug("No USB vendor information available\n");
+ log_debug("No USB vendor information available");
return EXIT_FAILURE;
}
udev_util_encode_string(usb_vendor, vendor_str_enc, sizeof(vendor_str_enc));