summaryrefslogtreecommitdiff
path: root/src/udev/udev-builtin-usb_id.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/udev/udev-builtin-usb_id.c')
-rw-r--r--src/udev/udev-builtin-usb_id.c59
1 files changed, 32 insertions, 27 deletions
diff --git a/src/udev/udev-builtin-usb_id.c b/src/udev/udev-builtin-usb_id.c
index 13d1226393..e3bbd05e4b 100644
--- a/src/udev/udev-builtin-usb_id.c
+++ b/src/udev/udev-builtin-usb_id.c
@@ -111,7 +111,7 @@ static int set_usb_mass_storage_ifsubtype(char *to, const char *from, size_t len
break;
}
}
- util_strscpy(to, len, type);
+ strscpy(to, len, type);
return type_num;
}
@@ -143,7 +143,7 @@ static void set_scsi_type(char *to, const char *from, size_t len)
break;
}
}
- util_strscpy(to, len, type);
+ strscpy(to, len, type);
}
#define USB_DT_DEVICE 0x01
@@ -151,11 +151,12 @@ static void set_scsi_type(char *to, const char *from, size_t len)
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;
@@ -167,29 +168,22 @@ static int dev_if_packed_info(struct udev_device *dev, char *ifs_str, size_t len
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];
@@ -213,13 +207,13 @@ static int dev_if_packed_info(struct udev_device *dev, char *ifs_str, size_t len
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;
}
/*
@@ -273,7 +267,7 @@ static int builtin_usb_id(struct udev_device *dev, int argc, char *argv[], bool
instance_str[0] = '\0';
/* 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;
@@ -432,18 +426,29 @@ fallback:
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);