chiark / gitweb /
man: add static device nodes and udevd debug options
[elogind.git] / extras / usb_id / usb_id.c
index b15263ef7deff5eb0c2f5c02d0b39cee6bfef22a..42ccddff356f038b7334042dfe546137e25b78a5 100644 (file)
@@ -21,7 +21,8 @@
 #include <errno.h>
 #include <getopt.h>
 
-#include "../../udev/udev.h"
+#include "libudev.h"
+#include "libudev-private.h"
 
 int debug;
 
@@ -38,14 +39,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 +135,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 +167,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 +284,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 +382,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 +393,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 +411,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 +456,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 +463,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,7 +490,7 @@ int main(int argc, char **argv)
                        export = 1;
                        break;
                case 'h':
-                       printf("Usage: usb_id [--usb-info] [--num-info] [--export] [--help] <devpath>\n"
+                       printf("Usage: usb_id [--usb-info] [--num-info] [--export] [--help] [<devpath>]\n"
                               "  --usb-info  use usb strings instead\n"
                               "  --num-info  use numerical values\n"
                               "  --export    print values as environment keys\n"
@@ -492,42 +501,48 @@ int main(int argc, char **argv)
                }
        }
 
-       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 +554,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 +565,6 @@ int main(int argc, char **argv)
 exit:
        udev_device_unref(dev);
        udev_unref(udev);
-       logging_close();
+       udev_log_close();
        return retval;
 }