summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--extras/scsi_id/scsi_id.877
-rw-r--r--extras/scsi_id/scsi_id.c71
2 files changed, 75 insertions, 73 deletions
diff --git a/extras/scsi_id/scsi_id.8 b/extras/scsi_id/scsi_id.8
index ba7e42f8c7..927549bf60 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=<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"
diff --git a/extras/scsi_id/scsi_id.c b/extras/scsi_id/scsi_id.c
index 79a8d7e51b..e9818a635a 100644
--- a/extras/scsi_id/scsi_id.c
+++ b/extras/scsi_id/scsi_id.c
@@ -24,6 +24,7 @@
#include <syslog.h>
#include <stdarg.h>
#include <ctype.h>
+#include <getopt.h>
#include <sys/stat.h>
#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 <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);