chiark / gitweb /
trivial cleanups
[elogind.git] / extras / usb_id / usb_id.c
index b15263ef7deff5eb0c2f5c02d0b39cee6bfef22a..3a7a0ffd496cb61130e85ff504fc9535d2ab8134 100644 (file)
@@ -3,12 +3,20 @@
  *
  * Copyright (c) 2005 SUSE Linux Products GmbH, Germany
  *
- * Author:
- *     Hannes Reinecke <hare@suse.de>
+ * Author: Hannes Reinecke <hare@suse.de>
  *
- *     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 <http://www.gnu.org/licenses/>.
  */
 
 #include <stdio.h>
@@ -21,7 +29,8 @@
 #include <errno.h>
 #include <getopt.h>
 
-#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] <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"
                               "  --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;
 }