chiark / gitweb /
scsi_id: add long options
authorKay Sievers <kay.sievers@vrfy.org>
Fri, 25 May 2007 15:37:47 +0000 (17:37 +0200)
committerKay Sievers <kay.sievers@vrfy.org>
Fri, 25 May 2007 15:37:47 +0000 (17:37 +0200)
extras/scsi_id/scsi_id.8
extras/scsi_id/scsi_id.c

index ba7e42f8c7d63dc656b54443464cdf3e0525d6fc..927549bf6074284bcccb697cf59d967a2a5f3d67 100644 (file)
@@ -17,7 +17,7 @@ with a non\-zero value.
 \fBscsi_id\fP is primarily for use by other utilities such as \fBudev\fP
 that require a unique SCSI identifier.
 
-By default all devices are assume black listed, the \fB\-g\fP option must
+By default all devices are assume black listed, the \fB\-\-whitelisted\fP option must
 be specified on the command line or in the config file for any useful
 behaviour.
 
@@ -33,7 +33,7 @@ by page 0x80. For example:
 
 .sp
 .nf
-# scsi_id -p 0x80 -s /block/sdg
+# scsi_id --page=0x80 --devpath=/block/sdg
 SIBM     3542           1T05078453
 .fi
 .P
@@ -45,28 +45,26 @@ identifier starts with the NAA value of 6):
 
 .sp
 .nf
-# /sbin/scsi_id -p 0x83 -s /block/sdg
+# /sbin/scsi_id --page=0x83 --devpath=/block/sdg
 3600a0b80000b174b000000d63efc5c8c
 .fi
 .P
 
 .SH OPTIONS
 .TP
-.BI subsystem
-Deprecated method: when called with only a single argument without a
-leading \-, runs in a hotplug mode, and expects the environment variable
-DEVPATH to specify the corresponding sysfs device. See section below on
-usage with \fBudev\fP.
-.TP
-.BI \-a
+.BI \-\-fallback-to-sysfs
 Always print information (model, vendor strings) about the device even
 if it does not support VPD pages.
 .TP
-.BI \-b
+.BI \-\-ignore-sysfs
+Ignore sysfs entries. Used for devices which are not represented as SCSI
+devices, but understand SG_IO commands.
+.TP
+.BI \-\-blacklisted
 The default behaviour \- treat the device as black listed, and do nothing
 unless a white listed device is found in the scsi_id config\-file.
 .TP
-.BI \-d "\| device\^"
+.BI \-\-device=\| device\^
 Instead
 of determining and creating a device node based on a sysfs dev
 entry as done for the \fB\-s\fP, send SG_IO commands to 
@@ -74,24 +72,24 @@ entry as done for the \fB\-s\fP, send SG_IO commands to
 This argument should also be used when invoked via udev to avoid problems
 with creation of temporary files on not-yet writable directories.
 .TP
-.BI \-f "\| config\-file"
+.BI \-\-config=\| config\-file
 Read configuration and black/white list entries from
 .B config\-file 
 rather than the default
 .B /etc/scsi_id.config
 file.
 .TP
-.BI \-g
-Treat the device as white listed. The \fB\-g\fP option must be specified
+.BI \-\-whitelisted
+Treat the device as white listed. The \fB\-\-whitelisted\fP option must be specified
 on the command line or in the scsi_id configuration file for 
 .B scsi_id
 to generate any output.
 .TP
-.BI \-i
+.BI \-\-prefix-bus-id
 Prefix the identification string with the  driver model (sysfs) bus id of
 the SCSI device.
 .TP
-.BI \-p "\| 0x80 | 0x83 | pre-spc3-83"
+.BI \-\-page=\| 0x80 | 0x83 | pre-spc3-83
 Use SCSI INQUIRY VPD page code 0x80, 0x83, or pre-spc3-83.
 .sp
 The default
@@ -104,58 +102,29 @@ option is used for older model 4, 5, and 6 EMC Symmetrix devices, its
 use with SPC-2 or SPC-3 compliant devices will fallback to the page 83
 format supported by these devices.
 .TP
-.BI \-s "\| sysfs\-device"
+.BI \-\-devpath=\| sysfs\-devpath
 Generate an id for the
-.B sysfs\-device.
-The sysfs mount point must not be included. For example, use /block/sd,
-not /sys/block/sd.
+.B sysfs\-devpath.
+The sysfs mount point must not be included.
 .TP
-.BI \-u
+.BI \-\-replace-whitespace
 Reformat the output : replace all whitespaces by underscores.
 .TP
-.BI \-x
+.BI \-\-export
 Export all data in KEY=<value> format used to import in other programs.
 .TP
-.BI \-v
+.BI \-\-verbose
 Generate verbose debugging output.
 .TP
-.BI \-V
+.BI \-\-version
 Display version number and exit.
 .RE
 
-.SH USAGE WITH UDEV 
-
-If \fBscsi_id\fP is invoked with one argument without a leading \-, it
-assumes it is called for a hotplug event, and looks for the sysfs device
-in the DEVPATH environment variable. This mode is deprecated, but
-available for backwards compatibility.
+.SH ENVIRONMENT
 
 If the DEVPATH environment variable is set, scsi_id assumes it has been
 invoked via udev (or some other hotplug program), and all errors or
 warnings are sent using syslog.
-
-To determine the specific value needed in a RESULT key, use the \-s option,
-for example:
-
-.sp
-.nf
-/sbin/scsi_id -s /block/sda
-.fi
-.P
-
-\fBscsi_id\fP is one of the tools used in the "Linux Persistent Device Names"
-scheme that creates persistent device links in /dev/disk. It is called with
-the -x option which will print all values in a defined format to let udev
-import it into its own environment for later event processing.
-.sp
-An example custom \fBudev\fP rule using \fBscsi_id\fP, that will name a block
-device and any partitions for the device matching the \fBscsi_id\fP output
-of 312345:
-
-.sp
-.nf
-SUBSYSTEMS=="scsi", PROGRAM=="/sbin/scsi_id -d %N -s %p", RESULT=="312345", NAME="disk%n"
-.fi
 .P
 
 .SH "FILES"
index 79a8d7e51bce5e1bc62d15355aa9eed2fca60540..e9818a635a9660f5f7e988d5f382985f35c19a32 100644 (file)
@@ -24,6 +24,7 @@
 #include <syslog.h>
 #include <stdarg.h>
 #include <ctype.h>
+#include <getopt.h>
 #include <sys/stat.h>
 
 #include "../../udev.h"
 #define TMP_DIR                "/dev"
 #define TMP_PREFIX     "tmp-scsi"
 
-static const char short_options[] = "abd:f:ginp:s:uvVx";
+static const struct option options[] = {
+       { "device", 1, NULL, 'd' },
+       { "config", 1, NULL, 'f' },
+       { "page", 1, NULL, 'p' },
+       { "devpath", 1, NULL, 's' },
+       { "fallback-to-sysfs", 0, NULL, 'a' },
+       { "blacklisted", 0, NULL, 'b' },
+       { "whitelisted", 0, NULL, 'g' },
+       { "prefix-bus-id", 0, NULL, 'i' },
+       { "replace-whitespace", 0, NULL, 'u' },
+       { "ignore-sysfs", 0, NULL, 'n' },
+       { "verbose", 0, NULL, 'v' },
+       { "version", 0, NULL, 'V' },
+       { "export", 0, NULL, 'x' },
+       { "help", 0, NULL, 'h' },
+       {}
+};
+
+static const char short_options[] = "abd:f:ghinp:s:uvVx";
 static const char dev_short_options[] = "bgp:";
 
 static int all_good;
@@ -407,7 +426,7 @@ static int set_options(int argc, char **argv, const char *short_opts,
         */
        optind = 1;
        while (1) {
-               option = getopt(argc, argv, short_opts);
+               option = getopt_long(argc, argv, short_opts, options, NULL);
                if (option == -1)
                        break;
 
@@ -443,6 +462,24 @@ static int set_options(int argc, char **argv, const char *short_opts,
                        all_good = 1;
                        break;
 
+               case 'h':
+                       printf("Usage: scsi_id OPTIONS <device>\n"
+                              "  --device               device node for SG_IO commands\n"
+                              "  --devpath              sysfs devpath\n"
+                              "  --config               location of config file\n"
+                              "  --page                 SCSI page (0x80, 0x83, pre-spc3-83)\n"
+                              "  --fallback-to-sysfs    print sysfs values if inquiry fails\n"
+                              "  --ignore-sysfs         ignore sysfs entries\n"
+                              "  --blacklisted          threat device as blacklisted\n"
+                              "  --whitelisted          threat device as whitelisted\n"
+                              "  --prefix-bus-id        prefix SCSI bus id\n"
+                              "  --replace-whitespace   replace all whitespaces by underscores\n"
+                              "  --verbose              verbose logging\n"
+                              "  --version              print version\n"
+                              "  --export               print values as environemt keys\n"
+                              "  --help                 print this help text\n\n");
+                       exit(0);
+
                case 'i':
                        display_bus_id = 1;
                        break;
@@ -483,13 +520,12 @@ static int set_options(int argc, char **argv, const char *short_opts,
                        break;
 
                case 'V':
-                       info("scsi_id version: %s\n", SCSI_ID_VERSION);
+                       printf("%s\n", SCSI_ID_VERSION);
                        exit(0);
                        break;
 
                default:
-                       info("Unknown or bad option '%c' (0x%x)", option, option);
-                       return -1;
+                       exit(1);
                }
        }
        return 0;
@@ -509,7 +545,7 @@ static int per_dev_options(struct sysfs_device *dev_scsi, int *good_bad, int *pa
 
        optind = 1; /* reset this global extern */
        while (retval == 0) {
-               option = getopt(newargc, newargv, dev_short_options);
+               option = getopt_long(newargc, newargv, dev_short_options, options, NULL);
                if (option == -1)
                        break;
 
@@ -648,7 +684,7 @@ static int scsi_id(const char *devpath, char *maj_min_dev)
        int page_code;
        char serial[MAX_SERIAL_LEN];
        char serial_short[MAX_SERIAL_LEN];
-       char bus_str[8];
+       const char *bus_str = NULL;
 
        dbg("devpath %s\n", devpath);
 
@@ -663,15 +699,6 @@ static int scsi_id(const char *devpath, char *maj_min_dev)
        else
                dev_type = S_IFCHR;
 
-       if (!ignore_sysfs) {
-               /* get scsi parent device */
-               dev_scsi = sysfs_device_get_parent_with_subsystem(dev, "scsi");
-               if (dev_scsi == NULL) {
-                       err("unable to access parent device of '%s'", devpath);
-                       return 1;
-               }
-       }
-
        /* mknod a temp dev to communicate with the device */
        if (!dev_specified && create_tmp_dev(dev->devpath, maj_min_dev, dev_type)) {
                dbg("create_tmp_dev failed\n");
@@ -679,12 +706,17 @@ static int scsi_id(const char *devpath, char *maj_min_dev)
        }
 
        if (!ignore_sysfs) {
+               /* get scsi parent device */
+               dev_scsi = sysfs_device_get_parent_with_subsystem(dev, "scsi");
+               if (dev_scsi == NULL) {
+                       err("unable to access parent device of '%s'", devpath);
+                       return 1;
+               }
                set_sysfs_values(dev_scsi);
-               strcpy(bus_str,"scsi");
+               bus_str = "scsi";
        } else {
                dev_scsi = dev;
                set_inq_values(dev_scsi, maj_min_dev);
-               strcpy(bus_str,"cciss");
        }
 
        /* get per device (vendor + model) options from the config file */
@@ -711,7 +743,8 @@ static int scsi_id(const char *devpath, char *maj_min_dev)
                        set_str(serial_str, serial_short, sizeof(serial_str));
                        printf("ID_SERIAL_SHORT=%s\n", serial_str);
                        printf("ID_TYPE=%s\n", type_str);
-                       printf("ID_BUS=%s\n", bus_str);
+                       if (bus_str != NULL)
+                               printf("ID_BUS=%s\n", bus_str);
                } else {
                        if (reformat_serial)
                                format_serial(serial);