* Copyright (c) 2005 SUSE Linux Products GmbH, Germany
* Author: Hannes Reinecke <hare@suse.de>
*
- * Copyright (C) 2005-2011 Kay Sievers <kay.sievers@vrfy.org>
+ * Copyright (C) 2005-2011 Kay Sievers <kay@vrfy.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
static void set_usb_iftype(char *to, int if_class_num, size_t len)
{
- char *type = "generic";
+ const char *type = "generic";
switch (if_class_num) {
case 1:
{
int type_num = 0;
char *eptr;
- char *type = "generic";
+ const char *type = "generic";
type_num = strtoul(from, &eptr, 0);
if (eptr != from) {
break;
}
}
- util_strscpy(to, len, type);
+ strscpy(to, len, type);
return type_num;
}
{
int type_num;
char *eptr;
- char *type = "generic";
+ const char *type = "generic";
type_num = strtoul(from, &eptr, 0);
if (eptr != from) {
break;
}
}
- util_strscpy(to, len, type);
+ strscpy(to, len, type);
}
#define USB_DT_DEVICE 0x01
static int dev_if_packed_info(struct udev_device *dev, char *ifs_str, size_t len)
{
- char *filename = NULL;
- int fd;
+ char _cleanup_free_ *filename = NULL;
+ int _cleanup_close_ 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 < sizeof(buf) && strpos+7 < len-2) {
+ while (pos < size && strpos+7 < len-2) {
struct usb_interface_descriptor *desc;
char if_str[8];
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;
}
/*
const char *driver = NULL;
char serial[256];
- struct udev *udev = udev_device_get_udev(dev);
struct udev_device *dev_interface = NULL;
struct udev_device *dev_usb = NULL;
const char *if_class, *if_subclass;
type_str[0] = '\0';
instance_str[0] = '\0';
- dbg(udev, "syspath %s\n", udev_device_get_syspath(dev));
-
/* shortcut, if we are called directly for a "usb_device" type */
- if (udev_device_get_devtype(dev) != NULL && strcmp(udev_device_get_devtype(dev), "usb_device") == 0) {
+ if (udev_device_get_devtype(dev) != NULL && streq(udev_device_get_devtype(dev), "usb_device")) {
dev_if_packed_info(dev, packed_if_str, sizeof(packed_if_str));
dev_usb = dev;
goto fallback;
/* usb interface directory */
dev_interface = udev_device_get_parent_with_subsystem_devtype(dev, "usb", "usb_interface");
if (dev_interface == NULL) {
- info(udev, "unable to access usb_interface device of '%s'\n",
+ log_debug("unable to access usb_interface device of '%s'\n",
udev_device_get_syspath(dev));
return EXIT_FAILURE;
}
if_class = udev_device_get_sysattr_value(dev_interface, "bInterfaceClass");
if (!if_class) {
- info(udev, "%s: cannot get bInterfaceClass attribute\n",
+ log_debug("%s: cannot get bInterfaceClass attribute\n",
udev_device_get_sysname(dev));
return EXIT_FAILURE;
}
set_usb_iftype(type_str, if_class_num, sizeof(type_str)-1);
}
- info(udev, "%s: if_class %d protocol %d\n",
+ log_debug("%s: if_class %d protocol %d\n",
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) {
- info(udev, "unable to find parent 'usb' device of '%s'\n",
+ log_debug("unable to find parent 'usb' device of '%s'\n",
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) {
- info(udev, "unable to find parent 'scsi' device of '%s'\n",
+ log_debug("unable to find parent 'scsi' device of '%s'\n",
udev_device_get_syspath(dev));
goto fallback;
}
if (sscanf(udev_device_get_sysname(dev_scsi), "%d:%d:%d:%d", &host, &bus, &target, &lun) != 4) {
- info(udev, "invalid scsi device '%s'\n", udev_device_get_sysname(dev_scsi));
+ log_debug("invalid scsi device '%s'\n", 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) {
- info(udev, "%s: cannot get SCSI vendor attribute\n",
+ log_debug("%s: cannot get SCSI vendor attribute\n",
udev_device_get_sysname(dev_scsi));
goto fallback;
}
scsi_model = udev_device_get_sysattr_value(dev_scsi, "model");
if (!scsi_model) {
- info(udev, "%s: cannot get SCSI model attribute\n",
+ log_debug("%s: cannot get SCSI model attribute\n",
udev_device_get_sysname(dev_scsi));
goto fallback;
}
scsi_type = udev_device_get_sysattr_value(dev_scsi, "type");
if (!scsi_type) {
- info(udev, "%s: cannot get SCSI type attribute\n",
+ log_debug("%s: cannot get SCSI type attribute\n",
udev_device_get_sysname(dev_scsi));
goto fallback;
}
scsi_rev = udev_device_get_sysattr_value(dev_scsi, "rev");
if (!scsi_rev) {
- info(udev, "%s: cannot get SCSI revision attribute\n",
+ log_debug("%s: cannot get SCSI revision attribute\n",
udev_device_get_sysname(dev_scsi));
goto fallback;
}
if (!usb_vendor)
usb_vendor = vendor_id;
if (!usb_vendor) {
- info(udev, "No USB vendor information available\n");
+ log_debug("No USB vendor information available\n");
return EXIT_FAILURE;
}
udev_util_encode_string(usb_vendor, vendor_str_enc, sizeof(vendor_str_enc));
usb_model = udev_device_get_sysattr_value(dev_usb, "product");
if (!usb_model)
usb_model = product_id;
- if (!usb_model) {
- dbg(udev, "No USB model information available\n");
+ if (!usb_model)
return EXIT_FAILURE;
- }
udev_util_encode_string(usb_model, model_str_enc, sizeof(model_str_enc));
util_replace_whitespace(usb_model, model_str, sizeof(model_str)-1);
util_replace_chars(model_str, NULL);
const char *usb_serial;
usb_serial = udev_device_get_sysattr_value(dev_usb, "serial");
+ if (usb_serial) {
+ const unsigned char *p;
+
+ /* http://msdn.microsoft.com/en-us/library/windows/hardware/gg487321.aspx */
+ for (p = (unsigned char *)usb_serial; *p != '\0'; p++)
+ if (*p < 0x20 || *p > 0x7f || *p == ',') {
+ usb_serial = NULL;
+ break;
+ }
+ }
+
if (usb_serial) {
util_replace_whitespace(usb_serial, serial_str, sizeof(serial_str)-1);
util_replace_chars(serial_str, NULL);
}
s = serial;
- l = util_strpcpyl(&s, sizeof(serial), vendor_str, "_", model_str, NULL);
+ l = strpcpyl(&s, sizeof(serial), vendor_str, "_", model_str, NULL);
if (serial_str[0] != '\0')
- l = util_strpcpyl(&s, l, "_", serial_str, NULL);
+ l = strpcpyl(&s, l, "_", serial_str, NULL);
if (instance_str[0] != '\0')
- util_strpcpyl(&s, l, "-", instance_str, NULL);
+ strpcpyl(&s, l, "-", instance_str, NULL);
udev_builtin_add_property(dev, test, "ID_VENDOR", vendor_str);
udev_builtin_add_property(dev, test, "ID_VENDOR_ENC", vendor_str_enc);