X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=extras%2Fusb_id%2Fusb_id.c;h=3a7a0ffd496cb61130e85ff504fc9535d2ab8134;hb=e48e2912023b5600d291904b0f7b0017387e8cb2;hp=b15263ef7deff5eb0c2f5c02d0b39cee6bfef22a;hpb=5afd777ebb6c797aaf7fe8b6c3b9eab62521abd7;p=elogind.git diff --git a/extras/usb_id/usb_id.c b/extras/usb_id/usb_id.c index b15263ef7..3a7a0ffd4 100644 --- a/extras/usb_id/usb_id.c +++ b/extras/usb_id/usb_id.c @@ -3,12 +3,20 @@ * * Copyright (c) 2005 SUSE Linux Products GmbH, Germany * - * Author: - * Hannes Reinecke + * Author: Hannes Reinecke * - * 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 the - * Free Software Foundation version 2 of the License. + * 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 + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ #include @@ -21,7 +29,8 @@ #include #include -#include "../../udev/udev.h" +#include "libudev.h" +#include "libudev-private.h" int debug; @@ -38,14 +47,18 @@ static void log_fn(struct udev *udev, int priority, } static char vendor_str[64]; +static char vendor_str_enc[256]; +static const char *vendor_id = ""; static char model_str[64]; static char model_str_enc[256]; -static char vendor_str_enc[256]; +static const char *product_id = ""; static char serial_str[UTIL_NAME_SIZE]; static char packed_if_str[UTIL_NAME_SIZE]; static char revision_str[64]; static char type_str[64]; static char instance_str[64]; +static const char *ifnum; +static const char *driver; static int use_usb_info; static int use_num_info; @@ -130,7 +143,7 @@ static int set_usb_mass_storage_ifsubtype(char *to, const char *from, size_t len break; } } - util_strlcpy(to, type, len); + util_strscpy(to, len, type); return type_num; } @@ -162,7 +175,7 @@ static void set_scsi_type(char *to, const char *from, size_t len) break; } } - util_strlcpy(to, type, len); + util_strscpy(to, len, type); } #define USB_DT_DEVICE 0x01 @@ -279,6 +292,9 @@ static int usb_id(struct udev_device *dev) return 1; } + ifnum = udev_device_get_sysattr_value(dev_interface, "bInterfaceNumber"); + driver = udev_device_get_sysattr_value(dev_interface, "driver"); + if_class = udev_device_get_sysattr_value(dev_interface, "bInterfaceClass"); if (!if_class) { info(udev, "%s: cannot get bInterfaceClass attribute\n", @@ -374,6 +390,9 @@ static int usb_id(struct udev_device *dev) } fallback: + vendor_id = udev_device_get_sysattr_value(dev_usb, "idVendor"); + product_id = udev_device_get_sysattr_value(dev_usb, "idProduct"); + /* fallback to USB vendor & device */ if (vendor_str[0] == '\0') { const char *usb_vendor = NULL; @@ -382,7 +401,7 @@ fallback: usb_vendor = udev_device_get_sysattr_value(dev_usb, "manufacturer"); if (!usb_vendor) - usb_vendor = udev_device_get_sysattr_value(dev_usb, "idVendor"); + usb_vendor = vendor_id; if (!usb_vendor) { info(udev, "No USB vendor information available\n"); @@ -400,7 +419,7 @@ fallback: usb_model = udev_device_get_sysattr_value(dev_usb, "product"); if (!usb_model) - usb_model = udev_device_get_sysattr_value(dev_usb, "idProduct"); + usb_model = product_id; if (!usb_model) { dbg(udev, "No USB model information available\n"); @@ -445,8 +464,6 @@ int main(int argc, char **argv) }; struct udev *udev; struct udev_device *dev = NULL; - char syspath[UTIL_PATH_SIZE]; - const char *devpath; static int export; int retval = 0; @@ -454,7 +471,7 @@ int main(int argc, char **argv) if (udev == NULL) goto exit; - logging_init("usb_id"); + udev_log_init("usb_id"); udev_set_log_fn(udev, log_fn); while (1) { @@ -481,53 +498,57 @@ int main(int argc, char **argv) export = 1; break; case 'h': - printf("Usage: usb_id [--usb-info] [--num-info] [--export] [--help] \n" + printf("Usage: usb_id [--usb-info] [--num-info] [--export] [--help] []\n" " --usb-info use usb strings instead\n" " --num-info use numerical values\n" " --export print values as environment keys\n" " --help print this help text\n\n"); - default: - retval = 1; goto exit; } } - devpath = argv[optind]; - if (devpath == NULL) { - fprintf(stderr, "No device specified\n"); - retval = 1; - goto exit; - } - - util_strlcpy(syspath, udev_get_sys_path(udev), sizeof(syspath)); - util_strlcat(syspath, devpath, sizeof(syspath)); - dev = udev_device_new_from_syspath(udev, syspath); + dev = udev_device_new_from_environment(udev); if (dev == NULL) { - err(udev, "unable to access '%s'\n", devpath); - return 1; + char syspath[UTIL_PATH_SIZE]; + const char *devpath; + + devpath = argv[optind]; + if (devpath == NULL) { + fprintf(stderr, "missing device\n"); + retval = 1; + goto exit; + } + + util_strscpyl(syspath, sizeof(syspath), udev_get_sys_path(udev), devpath, NULL); + dev = udev_device_new_from_syspath(udev, syspath); + if (dev == NULL) { + err(udev, "unable to access '%s'\n", devpath); + retval = 1; + goto exit; + return 1; + } } retval = usb_id(dev); if (retval == 0) { char serial[256]; + size_t l; + char *s; - util_strlcpy(serial, vendor_str, sizeof(serial)); - util_strlcat(serial, "_", sizeof(serial)); - util_strlcat(serial, model_str, sizeof(serial)); - if (serial_str[0] != '\0') { - util_strlcat(serial, "_", sizeof(serial)); - util_strlcat(serial, serial_str, sizeof(serial)); - } - if (instance_str[0] != '\0') { - util_strlcat(serial, "-", sizeof(serial)); - util_strlcat(serial, instance_str, sizeof(serial)); - } + s = serial; + l = util_strpcpyl(&s, sizeof(serial), vendor_str, "_", model_str, NULL); + if (serial_str[0] != '\0') + l = util_strpcpyl(&s, l, "_", serial_str, NULL); + if (instance_str[0] != '\0') + util_strpcpyl(&s, l, "-", instance_str, NULL); if (export) { printf("ID_VENDOR=%s\n", vendor_str); printf("ID_VENDOR_ENC=%s\n", vendor_str_enc); + printf("ID_VENDOR_ID=%s\n", vendor_id); printf("ID_MODEL=%s\n", model_str); printf("ID_MODEL_ENC=%s\n", model_str_enc); + printf("ID_MODEL_ID=%s\n", product_id); printf("ID_REVISION=%s\n", revision_str); printf("ID_SERIAL=%s\n", serial); if (serial_str[0] != '\0') @@ -539,6 +560,10 @@ int main(int argc, char **argv) printf("ID_BUS=usb\n"); if (packed_if_str[0] != '\0') printf("ID_USB_INTERFACES=:%s\n", packed_if_str); + if (ifnum != NULL) + printf("ID_USB_INTERFACE_NUM=%s\n", ifnum); + if (driver != NULL) + printf("ID_USB_DRIVER=%s\n", driver); } else printf("%s\n", serial); } @@ -546,6 +571,6 @@ int main(int argc, char **argv) exit: udev_device_unref(dev); udev_unref(udev); - logging_close(); + udev_log_close(); return retval; }