X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=extras%2Fscsi_id%2Fscsi_id.c;h=6334af386b0910c9ee1a09c7ded395cfb513b85e;hp=bc942fac58fb7122caeb678bc3ef64d34d2cf8d5;hb=59315eeae497de23bd761f95bc55226538bc49b1;hpb=05364975aff0bfaca1b5fb23963cee7d2201f99a diff --git a/extras/scsi_id/scsi_id.c b/extras/scsi_id/scsi_id.c index bc942fac5..6334af386 100644 --- a/extras/scsi_id/scsi_id.c +++ b/extras/scsi_id/scsi_id.c @@ -27,22 +27,21 @@ #include #include -#include "../../udev.h" +#include "../../udev/udev.h" #include "scsi_id.h" -#include "scsi_id_version.h" static const struct option options[] = { - { "device", 1, NULL, 'd' }, - { "config", 1, NULL, 'f' }, - { "page", 1, NULL, 'p' }, - { "blacklisted", 0, NULL, 'b' }, - { "whitelisted", 0, NULL, 'g' }, - { "replace-whitespace", 0, NULL, 'u' }, - { "sg-version", 1, NULL, 's' }, - { "verbose", 0, NULL, 'v' }, - { "version", 0, NULL, 'V' }, - { "export", 0, NULL, 'x' }, - { "help", 0, NULL, 'h' }, + { "device", required_argument, NULL, 'd' }, + { "config", required_argument, NULL, 'f' }, + { "page", required_argument, NULL, 'p' }, + { "blacklisted", no_argument, NULL, 'b' }, + { "whitelisted", no_argument, NULL, 'g' }, + { "replace-whitespace", no_argument, NULL, 'u' }, + { "sg-version", required_argument, NULL, 's' }, + { "verbose", no_argument, NULL, 'v' }, + { "version", no_argument, NULL, 'V' }, + { "export", no_argument, NULL, 'x' }, + { "help", no_argument, NULL, 'h' }, {} }; @@ -51,7 +50,7 @@ static const char dev_short_options[] = "bgp:"; static int all_good; static int dev_specified; -static char config_file[MAX_PATH_LEN] = SCSI_ID_CONFIG_FILE; +static char config_file[MAX_PATH_LEN] = SYSCONFDIR "/scsi_id.config"; static enum page_code default_page_code; static int sg_version = 4; static int use_stderr; @@ -63,30 +62,12 @@ static char model_str[64]; static char revision_str[16]; static char type_str[16]; -#ifdef USE_LOG -void log_message(int priority, const char *format, ...) +static void log_fn(struct udev *udev, int priority, + const char *file, int line, const char *fn, + const char *format, va_list args) { - va_list args; - static int udev_log = -1; - - if (udev_log == -1) { - const char *value; - - value = getenv("UDEV_LOG"); - if (value) - udev_log = log_priority(value); - else - udev_log = LOG_ERR; - } - - if (priority > udev_log) - return; - - va_start(args, format); vsyslog(priority, format, args); - va_end(args); } -#endif static void set_str(char *to, const char *from, size_t count) { @@ -214,7 +195,8 @@ static int argc_count(char *opts) * * vendor and model can end in '\n'. */ -static int get_file_options(const char *vendor, const char *model, +static int get_file_options(struct udev *udev, + const char *vendor, const char *model, int *argc, char ***newargv) { char *buffer; @@ -226,14 +208,14 @@ static int get_file_options(const char *vendor, const char *model, int c; int retval = 0; - dbg("vendor='%s'; model='%s'\n", vendor, model); + dbg(udev, "vendor='%s'; model='%s'\n", vendor, model); fd = fopen(config_file, "r"); if (fd == NULL) { - dbg("can't open %s\n", config_file); + dbg(udev, "can't open %s\n", config_file); if (errno == ENOENT) { return 1; } else { - err("can't open %s: %s\n", config_file, strerror(errno)); + err(udev, "can't open %s: %s\n", config_file, strerror(errno)); return -1; } } @@ -245,7 +227,7 @@ static int get_file_options(const char *vendor, const char *model, */ buffer = malloc(MAX_BUFFER_LEN); if (!buffer) { - err("can't allocate memory\n"); + err(udev, "can't allocate memory\n"); return -1; } @@ -259,7 +241,7 @@ static int get_file_options(const char *vendor, const char *model, break; lineno++; if (buf[strlen(buffer) - 1] != '\n') { - err("Config file line %d too long\n", lineno); + err(udev, "Config file line %d too long\n", lineno); break; } @@ -274,7 +256,7 @@ static int get_file_options(const char *vendor, const char *model, if (*buf == '#') continue; - dbg("lineno %d: '%s'\n", lineno, buf); + dbg(udev, "lineno %d: '%s'\n", lineno, buf); str1 = strsep(&buf, "="); if (str1 && strcasecmp(str1, "VENDOR") == 0) { str1 = get_value(&buf); @@ -304,20 +286,20 @@ static int get_file_options(const char *vendor, const char *model, } options_in = str1; } - dbg("config file line %d:\n" + dbg(udev, "config file line %d:\n" " vendor '%s'; model '%s'; options '%s'\n", lineno, vendor_in, model_in, options_in); /* * Only allow: [vendor=foo[,model=bar]]options=stuff */ if (!options_in || (!vendor_in && model_in)) { - err("Error parsing config file line %d '%s'\n", lineno, buffer); + err(udev, "Error parsing config file line %d '%s'\n", lineno, buffer); retval = -1; break; } if (vendor == NULL) { if (vendor_in == NULL) { - dbg("matched global option\n"); + dbg(udev, "matched global option\n"); break; } } else if ((vendor_in && strncmp(vendor, vendor_in, @@ -331,10 +313,10 @@ static int get_file_options(const char *vendor, const char *model, * give a partial match (that is FOO * matches FOOBAR). */ - dbg("matched vendor/model\n"); + dbg(udev, "matched vendor/model\n"); break; } else { - dbg("no match\n"); + dbg(udev, "no match\n"); } } @@ -349,7 +331,7 @@ static int get_file_options(const char *vendor, const char *model, c = argc_count(buffer) + 2; *newargv = calloc(c, sizeof(**newargv)); if (!*newargv) { - err("can't allocate memory\n"); + err(udev, "can't allocate memory\n"); retval = -1; } else { *argc = c; @@ -374,7 +356,8 @@ static int get_file_options(const char *vendor, const char *model, return retval; } -static int set_options(int argc, char **argv, const char *short_opts, +static int set_options(struct udev *udev, + int argc, char **argv, const char *short_opts, char *maj_min_dev) { int option; @@ -391,9 +374,9 @@ static int set_options(int argc, char **argv, const char *short_opts, break; if (optarg) - dbg("option '%c' arg '%s'\n", option, optarg); + dbg(udev, "option '%c' arg '%s'\n", option, optarg); else - dbg("option '%c'\n", option); + dbg(udev, "option '%c'\n", option); switch (option) { case 'b': @@ -442,7 +425,7 @@ static int set_options(int argc, char **argv, const char *short_opts, } else if (strcmp(optarg, "pre-spc3-83") == 0) { default_page_code = PAGE_83_PRE_SPC3; } else { - err("Unknown page code '%s'\n", optarg); + err(udev, "Unknown page code '%s'\n", optarg); return -1; } break; @@ -450,7 +433,7 @@ static int set_options(int argc, char **argv, const char *short_opts, case 's': sg_version = atoi(optarg); if (sg_version < 3 || sg_version > 4) { - err("Unknown SG version '%s'\n", optarg); + err(udev, "Unknown SG version '%s'\n", optarg); return -1; } break; @@ -468,7 +451,7 @@ static int set_options(int argc, char **argv, const char *short_opts, break; case 'V': - printf("%s\n", SCSI_ID_VERSION); + printf("%s\n", VERSION); exit(0); break; @@ -484,7 +467,8 @@ static int set_options(int argc, char **argv, const char *short_opts, return 0; } -static int per_dev_options(struct scsi_id_device *dev_scsi, int *good_bad, int *page_code) +static int per_dev_options(struct udev *udev, + struct scsi_id_device *dev_scsi, int *good_bad, int *page_code) { int retval; int newargc; @@ -494,7 +478,7 @@ static int per_dev_options(struct scsi_id_device *dev_scsi, int *good_bad, int * *good_bad = all_good; *page_code = default_page_code; - retval = get_file_options(vendor_str, model_str, &newargc, &newargv); + retval = get_file_options(udev, vendor_str, model_str, &newargc, &newargv); optind = 1; /* reset this global extern */ while (retval == 0) { @@ -503,9 +487,9 @@ static int per_dev_options(struct scsi_id_device *dev_scsi, int *good_bad, int * break; if (optarg) - dbg("option '%c' arg '%s'\n", option, optarg); + dbg(udev, "option '%c' arg '%s'\n", option, optarg); else - dbg("option '%c'\n", option); + dbg(udev, "option '%c'\n", option); switch (option) { case 'b': @@ -524,13 +508,13 @@ static int per_dev_options(struct scsi_id_device *dev_scsi, int *good_bad, int * } else if (strcmp(optarg, "pre-spc3-83") == 0) { *page_code = PAGE_83_PRE_SPC3; } else { - err("Unknown page code '%s'\n", optarg); + err(udev, "Unknown page code '%s'\n", optarg); retval = -1; } break; default: - err("Unknown or bad option '%c' (0x%x)\n", option, option); + err(udev, "Unknown or bad option '%c' (0x%x)\n", option, option); retval = -1; break; } @@ -543,13 +527,13 @@ static int per_dev_options(struct scsi_id_device *dev_scsi, int *good_bad, int * return retval; } -static int set_inq_values(struct scsi_id_device *dev_scsi, const char *path) +static int set_inq_values(struct udev *udev, struct scsi_id_device *dev_scsi, const char *path) { int retval; dev_scsi->use_sg = sg_version; - retval = scsi_std_inquiry(dev_scsi, path); + retval = scsi_std_inquiry(udev, dev_scsi, path); if (retval) return retval; @@ -593,7 +577,7 @@ static void format_serial(char *serial) * memory etc. return 2, and return 1 for expected cases (like broken * device found) that do not print an id. */ -static int scsi_id(char *maj_min_dev) +static int scsi_id(struct udev *udev, char *maj_min_dev) { int retval; struct scsi_id_device dev_scsi; @@ -601,15 +585,16 @@ static int scsi_id(char *maj_min_dev) int page_code; char serial_short[MAX_SERIAL_LEN] = ""; - set_inq_values(&dev_scsi, maj_min_dev); + set_inq_values(udev, &dev_scsi, maj_min_dev); /* get per device (vendor + model) options from the config file */ - retval = per_dev_options(&dev_scsi, &good_dev, &page_code); - dbg("per dev options: good %d; page code 0x%x\n", good_dev, page_code); + retval = per_dev_options(udev, &dev_scsi, &good_dev, &page_code); + dbg(udev, "per dev options: good %d; page code 0x%x\n", good_dev, page_code); if (!good_dev) { retval = 1; - } else if (scsi_get_serial(&dev_scsi, maj_min_dev, page_code, + } else if (scsi_get_serial(udev, + &dev_scsi, maj_min_dev, page_code, serial_short, MAX_SERIAL_LEN)) { retval = 1; } else { @@ -632,7 +617,7 @@ static int scsi_id(char *maj_min_dev) format_serial(dev_scsi.serial); printf("%s\n", dev_scsi.serial); } - dbg("%s\n", dev_scsi.serial); + dbg(udev, "%s\n", dev_scsi.serial); retval = 0; } @@ -641,25 +626,30 @@ static int scsi_id(char *maj_min_dev) int main(int argc, char **argv) { + struct udev *udev; int retval = 0; char maj_min_dev[MAX_PATH_LEN]; int newargc; char **newargv; + udev = udev_new(); + if (udev == NULL) + goto exit; + logging_init("scsi_id"); - dbg("argc is %d\n", argc); + udev_set_log_fn(udev, log_fn); /* * Get config file options. */ newargv = NULL; - retval = get_file_options(NULL, NULL, &newargc, &newargv); + retval = get_file_options(udev, NULL, NULL, &newargc, &newargv); if (retval < 0) { retval = 1; goto exit; } if (newargv && (retval == 0)) { - if (set_options(newargc, newargv, short_options, maj_min_dev) < 0) { + if (set_options(udev, newargc, newargv, short_options, maj_min_dev) < 0) { retval = 2; goto exit; } @@ -669,18 +659,19 @@ int main(int argc, char **argv) /* * Get command line options (overriding any config file settings). */ - if (set_options(argc, argv, short_options, maj_min_dev) < 0) + if (set_options(udev, argc, argv, short_options, maj_min_dev) < 0) exit(1); if (!dev_specified) { - err("no device specified\n"); + err(udev, "no device specified\n"); retval = 1; goto exit; } - retval = scsi_id(maj_min_dev); + retval = scsi_id(udev, maj_min_dev); exit: + udev_unref(udev); logging_close(); return retval; }