chiark / gitweb /
libudev: require LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE
[elogind.git] / extras / usb_id / usb_id.c
index 50918f060b4839abd96176df5754fa047cfaf15e..92492c8665dbf77ee7e0a37c622974fad8b308c5 100644 (file)
@@ -1,7 +1,5 @@
 /*
- * usb_id.c
- *
- * Identify an USB (block) device
+ * usb_id - identify an USB device
  *
  * Copyright (c) 2005 SUSE Linux Products GmbH, Germany
  *
@@ -13,6 +11,8 @@
  *     Free Software Foundation version 2 of the License.
  */
 
+#include <config.h>
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdarg.h>
@@ -22,7 +22,7 @@
 #include <errno.h>
 #include <getopt.h>
 
-#include "../../udev.h"
+#include "../../udev/udev.h"
 
 #define MAX_PATH_LEN                   512
 #define MAX_SERIAL_LEN                 256
@@ -224,8 +224,6 @@ static int usb_id(const char *devpath)
        struct sysfs_device *dev;
        struct sysfs_device *dev_interface;
        struct sysfs_device *dev_usb;
-       const char *scsi_model, *scsi_vendor, *scsi_type, *scsi_rev;
-       const char *usb_model = NULL, *usb_vendor = NULL, *usb_rev, *usb_serial;
        const char *if_class, *if_subclass;
        int if_class_num;
        int protocol = 0;
@@ -235,20 +233,20 @@ static int usb_id(const char *devpath)
        /* get all usb specific information: dev_interface, if_class, dev_usb */
        dev = sysfs_device_get(devpath);
        if (dev == NULL) {
-               err("unable to access '%s'", devpath);
+               err("unable to access '%s'\n", devpath);
                return 1;
        }
 
        /* usb interface directory */
        dev_interface = sysfs_device_get_parent_with_subsystem(dev, "usb");
        if (dev_interface == NULL) {
-               info("unable to access usb_interface device of '%s'", devpath);
+               info("unable to access usb_interface device of '%s'\n", devpath);
                return 1;
        }
 
        if_class = sysfs_attr_get_value(dev_interface->devpath, "bInterfaceClass");
        if (!if_class) {
-               info("%s: cannot get bInterfaceClass attribute", dev_interface->kernel);
+               info("%s: cannot get bInterfaceClass attribute\n", dev_interface->kernel);
                return 1;
        }
        if_class_num = strtoul(if_class, NULL, 16);
@@ -264,51 +262,52 @@ static int usb_id(const char *devpath)
        /* usb device directory */
        dev_usb = sysfs_device_get_parent_with_subsystem(dev_interface, "usb");
        if (!dev_usb) {
-               info("unable to find parent 'usb' device of '%s'", devpath);
+               info("unable to find parent 'usb' device of '%s'\n", devpath);
                return 1;
        }
 
        /* mass storage */
        if (protocol == 6 && !use_usb_info) {
                struct sysfs_device *dev_scsi;
+               const char *scsi_model, *scsi_vendor, *scsi_type, *scsi_rev;
                int host, bus, target, lun;
 
                /* get scsi device */
                dev_scsi = sysfs_device_get_parent_with_subsystem(dev, "scsi");
                if (dev_scsi == NULL) {
-                       info("unable to find parent 'scsi' device of '%s'", devpath);
+                       info("unable to find parent 'scsi' device of '%s'\n", devpath);
                        goto fallback;
                }
                if (sscanf(dev_scsi->kernel, "%d:%d:%d:%d", &host, &bus, &target, &lun) != 4) {
-                       info("invalid scsi device '%s'", dev_scsi->kernel);
+                       info("invalid scsi device '%s'\n", dev_scsi->kernel);
                        goto fallback;
                }
 
                /* Generic SPC-2 device */
                scsi_vendor = sysfs_attr_get_value(dev_scsi->devpath, "vendor");
                if (!scsi_vendor) {
-                       info("%s: cannot get SCSI vendor attribute", dev_scsi->kernel);
+                       info("%s: cannot get SCSI vendor attribute\n", dev_scsi->kernel);
                        goto fallback;
                }
                set_str(vendor_str, scsi_vendor, sizeof(vendor_str)-1);
 
                scsi_model = sysfs_attr_get_value(dev_scsi->devpath, "model");
                if (!scsi_model) {
-                       info("%s: cannot get SCSI model attribute", dev_scsi->kernel);
+                       info("%s: cannot get SCSI model attribute\n", dev_scsi->kernel);
                        goto fallback;
                }
                set_str(model_str, scsi_model, sizeof(model_str)-1);
 
                scsi_type = sysfs_attr_get_value(dev_scsi->devpath, "type");
                if (!scsi_type) {
-                       info("%s: cannot get SCSI type attribute", dev_scsi->kernel);
+                       info("%s: cannot get SCSI type attribute\n", dev_scsi->kernel);
                        goto fallback;
                }
                set_scsi_type(type_str, scsi_type, sizeof(type_str)-1);
 
                scsi_rev = sysfs_attr_get_value(dev_scsi->devpath, "rev");
                if (!scsi_rev) {
-                       info("%s: cannot get SCSI revision attribute", dev_scsi->kernel);
+                       info("%s: cannot get SCSI revision attribute\n", dev_scsi->kernel);
                        goto fallback;
                }
                set_str(revision_str, scsi_rev, sizeof(revision_str)-1);
@@ -321,40 +320,50 @@ static int usb_id(const char *devpath)
        }
 
 fallback:
-       /* Fallback to USB vendor & device */
+       /* fallback to USB vendor & device */
        if (vendor_str[0] == '\0') {
+               const char *usb_vendor = NULL;
+
                if (!use_num_info)
-                       if (!(usb_vendor = sysfs_attr_get_value(dev_usb->devpath, "manufacturer")))
-                               dbg("No USB vendor string found, using idVendor");
+                       usb_vendor = sysfs_attr_get_value(dev_usb->devpath, "manufacturer");
+
+               if (!usb_vendor)
+                       usb_vendor = sysfs_attr_get_value(dev_usb->devpath, "idVendor");
 
                if (!usb_vendor) {
-                       if (!(usb_vendor = sysfs_attr_get_value(dev_usb->devpath, "idVendor"))) {
-                               dbg("No USB vendor information available\n");
-                               sprintf(vendor_str,"0000");
-                       }
+                       info("No USB vendor information available\n");
+                       return 1;
                }
-               set_str(vendor_str,usb_vendor, sizeof(vendor_str) - 1);
+               set_str(vendor_str, usb_vendor, sizeof(vendor_str)-1);
        }
-       
+
        if (model_str[0] == '\0') {
+               const char *usb_model = NULL;
+
                if (!use_num_info)
-                       if (!(usb_model = sysfs_attr_get_value(dev_usb->devpath, "product")))
-                               dbg("No USB model string found, using idProduct");
-               
+                       usb_model = sysfs_attr_get_value(dev_usb->devpath, "product");
+
+               if (!usb_model)
+                       usb_model = sysfs_attr_get_value(dev_usb->devpath, "idProduct");
+
                if (!usb_model) {
-                       if (!(usb_model = sysfs_attr_get_value(dev_usb->devpath, "idProduct")))
-                               dbg("No USB model information available\n"); sprintf(model_str,"0000");
+                       dbg("No USB model information available\n");
+                       return 1;
                }
-               set_str(model_str, usb_model, sizeof(model_str) - 1);
+               set_str(model_str, usb_model, sizeof(model_str)-1);
        }
 
        if (revision_str[0] == '\0') {
+               const char *usb_rev;
+
                usb_rev = sysfs_attr_get_value(dev_usb->devpath, "bcdDevice");
                if (usb_rev)
                        set_str(revision_str, usb_rev, sizeof(revision_str)-1);
        }
 
        if (serial_str[0] == '\0') {
+               const char *usb_serial;
+
                usb_serial = sysfs_attr_get_value(dev_usb->devpath, "serial");
                if (usb_serial)
                        set_str(serial_str, usb_serial, sizeof(serial_str)-1);
@@ -368,10 +377,6 @@ int main(int argc, char **argv)
        const char *env;
        char devpath[MAX_PATH_LEN];
        static int export;
-
-       logging_init("usb_id");
-       sysfs_init();
-
        static const struct option options[] = {
                { "usb-info", 0, NULL, 'u' },
                { "num-info", 0, NULL, 'n' },
@@ -380,6 +385,9 @@ int main(int argc, char **argv)
                {}
        };
 
+       logging_init("usb_id");
+       sysfs_init();
+
        while (1) {
                int option;
 
@@ -399,7 +407,7 @@ 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] <devpath>\n"
                               "  --usb-info  use usb strings instead\n"
                               "  --num-info  use numerical values\n"
                               "  --export    print values as environemt keys\n"