Signed-off-by: Sami Kerola <kerolasa@xxxxxx> --- misc-utils/blkid.c | 171 +++++++++++++++++++++++++++-------------------------- 1 file changed, 88 insertions(+), 83 deletions(-) diff --git a/misc-utils/blkid.c b/misc-utils/blkid.c index eb2ea0735..2f36fac3a 100644 --- a/misc-utils/blkid.c +++ b/misc-utils/blkid.c @@ -19,15 +19,13 @@ #include <errno.h> #include <getopt.h> +#define OUTPUT_FULL (1 << 0) #define OUTPUT_VALUE_ONLY (1 << 1) #define OUTPUT_DEVICE_ONLY (1 << 2) #define OUTPUT_PRETTY_LIST (1 << 3) /* deprecated */ #define OUTPUT_UDEV_LIST (1 << 4) /* deprecated */ #define OUTPUT_EXPORT_LIST (1 << 5) -#define LOWPROBE_TOPOLOGY (1 << 1) -#define LOWPROBE_SUPERBLOCKS (1 << 2) - #define BLKID_EXIT_NOTFOUND 2 /* token or device not found */ #define BLKID_EXIT_OTHER 4 /* bad usage or other error */ #define BLKID_EXIT_AMBIVAL 8 /* ambivalent low-level probing detected */ @@ -47,7 +45,20 @@ #include "ttyutils.h" #include "xalloc.h" -static int raw_chars; +struct blkid_control { + int output; + uintmax_t offset; + uintmax_t size; + char *show[128]; + unsigned int + eval:1, + gc:1, + lookup:1, + lowprobe:1, + lowprobe_superblocks:1, + lowprobe_topology:1, + raw_chars:1; +}; static void print_version(FILE *out) { @@ -102,7 +113,8 @@ static void usage(int error) * * If 'esc' is defined then escape all chars from esc by \. */ -static void safe_print(const char *cp, int len, const char *esc) +static void safe_print(const struct blkid_control *ctl, const char *cp, int len, + const char *esc) { unsigned char ch; @@ -111,7 +123,7 @@ static void safe_print(const char *cp, int len, const char *esc) while (len--) { ch = *cp++; - if (!raw_chars) { + if (!ctl->raw_chars) { if (ch >= 128) { fputs("M-", stdout); ch -= 128; @@ -284,22 +296,23 @@ static int has_item(char *ary[], const char *item) return 0; } -static void print_value(int output, int num, const char *devname, - const char *value, const char *name, size_t valsz) +static void print_value(const struct blkid_control *ctl, int num, + const char *devname, const char *value, + const char *name, size_t valsz) { - if (output & OUTPUT_VALUE_ONLY) { + if (ctl->output & OUTPUT_VALUE_ONLY) { fputs(value, stdout); fputc('\n', stdout); - } else if (output & OUTPUT_UDEV_LIST) { + } else if (ctl->output & OUTPUT_UDEV_LIST) { print_udev_format(name, value); - } else if (output & OUTPUT_EXPORT_LIST) { + } else if (ctl->output & OUTPUT_EXPORT_LIST) { if (num == 1 && devname) printf("DEVNAME=%s\n", devname); fputs(name, stdout); fputs("=", stdout); - safe_print(value, valsz, " \\\"'$`<>"); + safe_print(ctl, value, valsz, " \\\"'$`<>"); fputs("\n", stdout); } else { @@ -308,12 +321,12 @@ static void print_value(int output, int num, const char *devname, fputs(" ", stdout); fputs(name, stdout); fputs("=\"", stdout); - safe_print(value, valsz, "\"\\"); + safe_print(ctl, value, valsz, "\"\\"); fputs("\"", stdout); } } -static void print_tags(blkid_dev dev, char *show[], int output) +static void print_tags(const struct blkid_control *ctl, blkid_dev dev) { blkid_tag_iterate iter; const char *type, *value, *devname; @@ -323,34 +336,34 @@ static void print_tags(blkid_dev dev, char *show[], int output) if (!dev) return; - if (output & OUTPUT_PRETTY_LIST) { + if (ctl->output & OUTPUT_PRETTY_LIST) { pretty_print_dev(dev); return; } devname = blkid_dev_devname(dev); - if (output & OUTPUT_DEVICE_ONLY) { + if (ctl->output & OUTPUT_DEVICE_ONLY) { printf("%s\n", devname); return; } iter = blkid_tag_iterate_begin(dev); while (blkid_tag_next(iter, &type, &value) == 0) { - if (show[0] && !has_item(show, type)) + if (ctl->show[0] && !has_item(ctl->show, type)) continue; if (num == 1 && !first && - (output & (OUTPUT_UDEV_LIST | OUTPUT_EXPORT_LIST))) + (ctl->output & (OUTPUT_UDEV_LIST | OUTPUT_EXPORT_LIST))) /* add extra line between output from more devices */ fputc('\n', stdout); - print_value(output, num++, devname, value, type, strlen(value)); + print_value(ctl, num++, devname, value, type, strlen(value)); } blkid_tag_iterate_end(iter); if (num > 1) { - if (!(output & (OUTPUT_VALUE_ONLY | OUTPUT_UDEV_LIST | + if (!(ctl->output & (OUTPUT_VALUE_ONLY | OUTPUT_UDEV_LIST | OUTPUT_EXPORT_LIST))) printf("\n"); first = 0; @@ -474,8 +487,7 @@ static int lowprobe_topology(blkid_probe pr) } static int lowprobe_device(blkid_probe pr, const char *devname, - int chain, char *show[], int output, - uint64_t offset, uint64_t size) + struct blkid_control *ctl) { const char *data; const char *name; @@ -490,12 +502,12 @@ static int lowprobe_device(blkid_probe pr, const char *devname, warn(_("error: %s"), devname); return BLKID_EXIT_NOTFOUND; } - if (blkid_probe_set_device(pr, fd, offset, size)) + if (blkid_probe_set_device(pr, fd, ctl->offset, ctl->size)) goto done; - if (chain & LOWPROBE_TOPOLOGY) + if (ctl->lowprobe_topology) rc = lowprobe_topology(pr); - if (rc >= 0 && (chain & LOWPROBE_SUPERBLOCKS)) + if (rc >= 0 && ctl->lowprobe_superblocks) rc = lowprobe_superblocks(pr); if (rc < 0) goto done; @@ -503,11 +515,11 @@ static int lowprobe_device(blkid_probe pr, const char *devname, if (!rc) nvals = blkid_probe_numof_values(pr); - if (nvals && !first && output & (OUTPUT_UDEV_LIST | OUTPUT_EXPORT_LIST)) + if (nvals && !first && ctl->output & (OUTPUT_UDEV_LIST | OUTPUT_EXPORT_LIST)) /* add extra line between output from devices */ fputc('\n', stdout); - if (nvals && (output & OUTPUT_DEVICE_ONLY)) { + if (nvals && (ctl->output & OUTPUT_DEVICE_ONLY)) { printf("%s\n", devname); goto done; } @@ -515,20 +527,21 @@ static int lowprobe_device(blkid_probe pr, const char *devname, for (n = 0; n < nvals; n++) { if (blkid_probe_get_value(pr, n, &name, &data, &len)) continue; - if (show[0] && !has_item(show, name)) + if (ctl->show[0] && !has_item(ctl->show, name)) continue; len = strnlen((char *) data, len); - print_value(output, num++, devname, (char *) data, name, len); + print_value(ctl, num++, devname, (char *) data, name, len); } if (first) first = 0; - if (nvals >= 1 && !(output & (OUTPUT_VALUE_ONLY | + + if (nvals >= 1 && !(ctl->output & (OUTPUT_VALUE_ONLY | OUTPUT_UDEV_LIST | OUTPUT_EXPORT_LIST))) printf("\n"); done: if (rc == -2) { - if (output & OUTPUT_UDEV_LIST) + if (ctl->output & OUTPUT_UDEV_LIST) print_udev_ambivalent(pr); else warnx(_("%s: ambivalent result (probably more " @@ -631,9 +644,9 @@ static void free_types_list(char *list[]) int main(int argc, char **argv) { + struct blkid_control ctl = { .output = OUTPUT_FULL, 0 }; blkid_cache cache = NULL; char **devices = NULL; - char *show[128] = { NULL, }; char *search_type = NULL, *search_value = NULL; char *read = NULL; int fltr_usage = 0; @@ -642,10 +655,7 @@ int main(int argc, char **argv) unsigned int numdev = 0, numtag = 0; int err = BLKID_EXIT_OTHER; unsigned int i; - int output_format = 0; - int lookup = 0, gc = 0, lowprobe = 0, eval = 0; int c; - uintmax_t offset = 0, size = 0; static const ul_excl_t excl[] = { /* rows and cols in ASCII order */ { 'n','u' }, @@ -653,7 +663,6 @@ int main(int argc, char **argv) }; int excl_st[ARRAY_SIZE(excl)] = UL_EXCL_STATUS_INIT; - show[0] = NULL; setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); @@ -666,16 +675,13 @@ int main(int argc, char **argv) switch (c) { case 'c': - if (optarg && !*optarg) - read = NULL; - else - read = optarg; + read = optarg; break; case 'd': - raw_chars = 1; + ctl.raw_chars = 1; break; case 'L': - eval++; + ctl.eval = 1; search_value = xstrdup(optarg); search_type = xstrdup("LABEL"); break; @@ -686,18 +692,18 @@ int main(int argc, char **argv) fltr_usage = list_to_usage(optarg, &fltr_flag); break; case 'U': - eval++; + ctl.eval = 1; search_value = xstrdup(optarg); search_type = xstrdup("UUID"); break; case 'i': - lowprobe |= LOWPROBE_TOPOLOGY; + ctl.lowprobe_topology = 1; break; case 'l': - lookup++; + ctl.lookup = 1; break; case 'g': - gc = 1; + ctl.gc = 1; break; case 'k': { @@ -710,36 +716,35 @@ int main(int argc, char **argv) } case 'o': if (!strcmp(optarg, "value")) - output_format = OUTPUT_VALUE_ONLY; + ctl.output = OUTPUT_VALUE_ONLY; else if (!strcmp(optarg, "device")) - output_format = OUTPUT_DEVICE_ONLY; + ctl.output = OUTPUT_DEVICE_ONLY; else if (!strcmp(optarg, "list")) - output_format = OUTPUT_PRETTY_LIST; /* deprecated */ + ctl.output = OUTPUT_PRETTY_LIST; /* deprecated */ else if (!strcmp(optarg, "udev")) - output_format = OUTPUT_UDEV_LIST; + ctl.output = OUTPUT_UDEV_LIST; else if (!strcmp(optarg, "export")) - output_format = OUTPUT_EXPORT_LIST; + ctl.output = OUTPUT_EXPORT_LIST; else if (!strcmp(optarg, "full")) - output_format = 0; + ctl.output = 0; else errx(BLKID_EXIT_OTHER, _("unsupported output format %s"), optarg); break; case 'O': - offset = strtosize_or_err(optarg, _("invalid offset argument")); + ctl.offset = strtosize_or_err(optarg, _("invalid offset argument")); break; case 'p': - lowprobe |= LOWPROBE_SUPERBLOCKS; + ctl.lowprobe_superblocks = 1; break; case 's': - if (numtag + 1 >= sizeof(show) / sizeof(*show)) { + if (numtag + 1 >= sizeof(ctl.show) / sizeof(*ctl.show)) { warnx(_("Too many tags specified")); errtryh(err); } - show[numtag++] = optarg; - show[numtag] = NULL; + ctl.show[numtag++] = optarg; break; case 'S': - size = strtosize_or_err(optarg, _("invalid size argument")); + ctl.size = strtosize_or_err(optarg, _("invalid size argument")); break; case 't': if (search_type) { @@ -769,6 +774,8 @@ int main(int argc, char **argv) } } + if (ctl.lowprobe_topology || ctl.lowprobe_superblocks) + ctl.lowprobe = 1; /* The rest of the args are device names */ if (optind < argc) { @@ -778,31 +785,31 @@ int main(int argc, char **argv) } /* convert LABEL/UUID lookup to evaluate request */ - if (lookup && output_format == OUTPUT_DEVICE_ONLY && search_type && + if (ctl.lookup && ctl.output == OUTPUT_DEVICE_ONLY && search_type && (!strcmp(search_type, "LABEL") || !strcmp(search_type, "UUID"))) { - eval++; - lookup = 0; + ctl.eval = 1; + ctl.lookup = 0; } - if (!lowprobe && !eval && blkid_get_cache(&cache, read) < 0) + if (!ctl.lowprobe && !ctl.eval && blkid_get_cache(&cache, read) < 0) goto exit; - if (gc) { + if (ctl.gc) { blkid_gc_cache(cache); err = 0; goto exit; } err = BLKID_EXIT_NOTFOUND; - if (eval == 0 && (output_format & OUTPUT_PRETTY_LIST)) { - if (lowprobe) + if (ctl.eval == 0 && (ctl.output & OUTPUT_PRETTY_LIST)) { + if (ctl.lowprobe) errx(BLKID_EXIT_OTHER, _("The low-level probing mode does not " "support 'list' output format")); pretty_print_dev(NULL); } - if (lowprobe) { + if (ctl.lowprobe) { /* * Low-level API */ @@ -814,38 +821,36 @@ int main(int argc, char **argv) "requires a device")); /* automatically enable 'export' format for I/O Limits */ - if (!output_format && (lowprobe & LOWPROBE_TOPOLOGY)) - output_format = OUTPUT_EXPORT_LIST; + if (!ctl.output && ctl.lowprobe_topology) + ctl.output = OUTPUT_EXPORT_LIST; pr = blkid_new_probe(); if (!pr) goto exit; - if (lowprobe & LOWPROBE_SUPERBLOCKS) { + if (ctl.lowprobe_superblocks) { blkid_probe_set_superblocks_flags(pr, BLKID_SUBLKS_LABEL | BLKID_SUBLKS_UUID | BLKID_SUBLKS_TYPE | BLKID_SUBLKS_SECTYPE | BLKID_SUBLKS_USAGE | BLKID_SUBLKS_VERSION); - if (fltr_usage && blkid_probe_filter_superblocks_usage( - pr, fltr_flag, fltr_usage)) + + if (fltr_usage && + blkid_probe_filter_superblocks_usage(pr, fltr_flag, fltr_usage)) goto exit; - else if (fltr_type && blkid_probe_filter_superblocks_type( - pr, fltr_flag, fltr_type)) + else if (fltr_type && + blkid_probe_filter_superblocks_type(pr, fltr_flag, fltr_type)) goto exit; } for (i = 0; i < numdev; i++) { - err = lowprobe_device(pr, devices[i], lowprobe, show, - output_format, - (uint64_t) offset, - (uint64_t) size); + err = lowprobe_device(pr, devices[i], &ctl); if (err) break; } blkid_free_probe(pr); - } else if (eval) { + } else if (ctl.eval) { /* * Evaluate API */ @@ -854,7 +859,7 @@ int main(int argc, char **argv) err = 0; printf("%s\n", res); } - } else if (lookup) { + } else if (ctl.lookup) { /* * Classic (cache based) API */ @@ -870,7 +875,7 @@ int main(int argc, char **argv) if ((dev = blkid_find_dev_with_tag(cache, search_type, search_value))) { - print_tags(dev, show, output_format); + print_tags(&ctl, dev); err = 0; } /* If we didn't specify a single device, show all available devices */ @@ -886,7 +891,7 @@ int main(int argc, char **argv) dev = blkid_verify(cache, dev); if (!dev) continue; - print_tags(dev, show, output_format); + print_tags(&ctl, dev); err = 0; } blkid_dev_iterate_end(iter); @@ -900,7 +905,7 @@ int main(int argc, char **argv) !blkid_dev_has_tag(dev, search_type, search_value)) continue; - print_tags(dev, show, output_format); + print_tags(&ctl, dev); err = 0; } } @@ -909,7 +914,7 @@ exit: free(search_type); free(search_value); free_types_list(fltr_type); - if (!lowprobe && !eval) + if (!ctl.lowprobe && !ctl.eval) blkid_put_cache(cache); free(devices); return err; -- 2.12.0 -- To unsubscribe from this list: send the line "unsubscribe util-linux" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html