1
0
mirror of https://github.com/systemd/systemd.git synced 2024-12-26 03:22:00 +03:00

scsi_id: add long options

This commit is contained in:
Kay Sievers 2007-05-25 17:37:47 +02:00
parent 87cf9f5aac
commit 9eaa50d0e7
2 changed files with 75 additions and 73 deletions

View 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"

View File

@ -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,6 +743,7 @@ 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);
if (bus_str != NULL)
printf("ID_BUS=%s\n", bus_str);
} else {
if (reformat_serial)