X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=extras%2Fscsi_id%2Fscsi_id.c;h=d8b269a950387aa45af55eb9e6a074bb39ec1d47;hb=be580fa5d83ef4b73b71f29ebd76b1f26eb12e9c;hp=79a8d7e51bce5e1bc62d15355aa9eed2fca60540;hpb=87cf9f5aacf65d0bc186e5e525026cc760290379;p=elogind.git diff --git a/extras/scsi_id/scsi_id.c b/extras/scsi_id/scsi_id.c index 79a8d7e51..d8b269a95 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 environment 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); @@ -784,7 +817,7 @@ int main(int argc, char **argv) exit(1); if (!sys_specified) { - info("-s must be specified\n"); + info("--devpath= must be specified\n"); retval = 1; goto exit; }