From 9eaa50d0e7d7ec15f89ecd667ddbb2935cf78593 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Fri, 25 May 2007 17:37:47 +0200 Subject: [PATCH] scsi_id: add long options --- extras/scsi_id/scsi_id.8 | 77 ++++++++++++---------------------------- extras/scsi_id/scsi_id.c | 71 ++++++++++++++++++++++++++---------- 2 files changed, 75 insertions(+), 73 deletions(-) diff --git a/extras/scsi_id/scsi_id.8 b/extras/scsi_id/scsi_id.8 index ba7e42f8..927549bf 100644 --- a/extras/scsi_id/scsi_id.8 +++ b/extras/scsi_id/scsi_id.8 @@ -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= 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" diff --git a/extras/scsi_id/scsi_id.c b/extras/scsi_id/scsi_id.c index 79a8d7e5..e9818a63 100644 --- a/extras/scsi_id/scsi_id.c +++ b/extras/scsi_id/scsi_id.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include "../../udev.h" @@ -34,7 +35,25 @@ #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 \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); -- 2.39.5