diff options
author | Karel Zak | 2014-09-11 15:28:15 +0200 |
---|---|---|
committer | Karel Zak | 2014-10-07 14:55:31 +0200 |
commit | d2c47697e149d406af266c9d59f140c24ee890ad (patch) | |
tree | 230bf7352d6abaa2770699063b5c3bb5a9a39e84 /disk-utils/sfdisk.c | |
parent | sfdisk: add --list-types (diff) | |
download | kernel-qcow2-util-linux-d2c47697e149d406af266c9d59f140c24ee890ad.tar.gz kernel-qcow2-util-linux-d2c47697e149d406af266c9d59f140c24ee890ad.tar.xz kernel-qcow2-util-linux-d2c47697e149d406af266c9d59f140c24ee890ad.zip |
sfdisk: add --verify
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'disk-utils/sfdisk.c')
-rw-r--r-- | disk-utils/sfdisk.c | 91 |
1 files changed, 80 insertions, 11 deletions
diff --git a/disk-utils/sfdisk.c b/disk-utils/sfdisk.c index f650ddac3..b4ac71ed7 100644 --- a/disk-utils/sfdisk.c +++ b/disk-utils/sfdisk.c @@ -59,8 +59,7 @@ UL_DEBUG_DEFINE_MASKANEMS(sfdisk) = UL_DEBUG_EMPTY_MASKNAMES; #define ON_DBG(m, x) __UL_DBG_CALL(sfdisk, SFDISKPROG_DEBUG_, m, x) enum { - ACT_FDISK = 0, /* default */ - + ACT_FDISK = 1, ACT_ACTIVATE, ACT_CHANGE_ID, ACT_DUMP, @@ -76,6 +75,8 @@ struct sfdisk { const char *label; /* --label <label> */ struct fdisk_context *cxt; /* libfdisk context */ + + unsigned int verify : 1; /* call fdisk_verify_disklabel() */ }; @@ -198,11 +199,11 @@ static int command_list_partitions(struct sfdisk *sf, int argc, char **argv) for (i = 0; i < argc; i++) { if (ct) fputs("\n\n", stdout); - if (print_device_pt(sf->cxt, argv[i], 0) == 0) + if (print_device_pt(sf->cxt, argv[i], 0, sf->verify) == 0) ct++; } } else - print_all_devices_pt(sf->cxt); + print_all_devices_pt(sf->cxt, sf->verify); return 0; } @@ -241,6 +242,62 @@ static int command_list_types(struct sfdisk *sf) return 0; } +static int verify_device(struct sfdisk *sf, const char *devname) +{ + int rc = 1; + + fdisk_enable_listonly(sf->cxt, 1); + + if (fdisk_assign_device(sf->cxt, devname, 1)) { + warn(_("cannot open: %s"), devname); + return 1; + } + + color_scheme_enable("header", UL_COLOR_BOLD); + fdisk_info(sf->cxt, "%s:", devname); + color_disable(); + + if (!fdisk_has_label(sf->cxt)) + fdisk_info(sf->cxt, _("unrecognized partition table type")); + else + rc = fdisk_verify_disklabel(sf->cxt); + + fdisk_deassign_device(sf->cxt, 1); + return rc; +} + +/* + * sfdisk --verify [<device ..] + */ +static int command_verify(struct sfdisk *sf, int argc, char **argv) +{ + int nfails = 0, ct = 0; + + if (argc) { + int i; + for (i = 0; i < argc; i++) { + if (i) + fdisk_info(sf->cxt, " "); + if (verify_device(sf, argv[i]) < 0) + nfails++; + } + } else { + FILE *f = NULL; + char *dev; + + while ((dev = next_proc_partition(&f))) { + if (ct) + fdisk_info(sf->cxt, " "); + if (verify_device(sf, dev) < 0) + nfails++; + free(dev); + ct++; + } + } + + return nfails; +} + static int get_size(const char *dev, int silent, uintmax_t *sz) { int fd, rc = 0; @@ -707,9 +764,9 @@ static void __attribute__ ((__noreturn__)) usage(FILE *out) fputs(_(" -N, --partno <num> specify partition number\n"), out); fputs(_(" -s, --show-size list the size of all or specified device\n"), out); fputs(_(" -T, --list-types print the recognized types (see -X)\n"), out); + fputs(_(" -V, --verify test whether partitions seem correct\n"), out); fputs(_(" -X, --label <name> specify label type (dos, gpt, ...)\n"), out); - fputs(USAGE_SEPARATOR, out); fputs(USAGE_HELP, out); fputs(USAGE_VERSION, out); @@ -724,20 +781,20 @@ int main(int argc, char *argv[]) { int rc = -EINVAL, c; struct sfdisk _sf = { - .act = 0, .partno = -1 }, *sf = &_sf; static const struct option longopts[] = { { "activate",no_argument, NULL, 'a' }, - { "list", no_argument, NULL, 'l' }, { "dump", no_argument, NULL, 'd' }, { "help", no_argument, NULL, 'h' }, - { "show-size", no_argument, NULL, 's' }, - { "partno", required_argument, NULL, 'N' }, { "label", required_argument, NULL, 'X' }, - { "version", no_argument, NULL, 'v' }, + { "list", no_argument, NULL, 'l' }, { "list-types", no_argument, NULL, 'T' }, + { "partno", required_argument, NULL, 'N' }, + { "show-size", no_argument, NULL, 's' }, + { "verify", no_argument, NULL, 'V' }, + { "version", no_argument, NULL, 'v' }, { NULL, 0, 0, 0 }, }; @@ -746,7 +803,7 @@ int main(int argc, char *argv[]) textdomain(PACKAGE); atexit(close_stdout); - while ((c = getopt_long(argc, argv, "adhlN:sTvX:", longopts, NULL)) != -1) { + while ((c = getopt_long(argc, argv, "adhlN:sTvVX:", longopts, NULL)) != -1) { switch(c) { case 'a': sf->act = ACT_ACTIVATE; @@ -776,6 +833,9 @@ int main(int argc, char *argv[]) printf(_("%s from %s\n"), program_invocation_short_name, PACKAGE_STRING); return EXIT_SUCCESS; + case 'V': + sf->verify = 1; + break; default: usage(stderr); } @@ -783,6 +843,11 @@ int main(int argc, char *argv[]) sfdisk_init(sf); + if (sf->verify && !sf->act) + sf->act = ACT_VERIFY; /* --verify make be used with --list too */ + else if (!sf->act) + sf->act = ACT_FDISK; /* default */ + switch (sf->act) { case ACT_ACTIVATE: rc = command_activate(sf, argc - optind, argv + optind); @@ -807,6 +872,10 @@ int main(int argc, char *argv[]) case ACT_SHOW_SIZE: rc = command_show_size(sf, argc - optind, argv + optind); break; + + case ACT_VERIFY: + rc = command_verify(sf, argc - optind, argv + optind); + break; } sfdisk_deinit(sf); |