summaryrefslogtreecommitdiffstats
path: root/disk-utils/sfdisk.c
diff options
context:
space:
mode:
authorKarel Zak2015-09-17 13:57:44 +0200
committerKarel Zak2015-09-17 13:57:44 +0200
commitaab9be66c4a2525a6ca3b2b7a47b8ad2a54aa659 (patch)
tree04fea6bf03c91564d0f885754501675bc49cfce7 /disk-utils/sfdisk.c
parentlibfdisk: fix partition move/resize code (diff)
downloadkernel-qcow2-util-linux-aab9be66c4a2525a6ca3b2b7a47b8ad2a54aa659.tar.gz
kernel-qcow2-util-linux-aab9be66c4a2525a6ca3b2b7a47b8ad2a54aa659.tar.xz
kernel-qcow2-util-linux-aab9be66c4a2525a6ca3b2b7a47b8ad2a54aa659.zip
sfdisk: add --delete
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'disk-utils/sfdisk.c')
-rw-r--r--disk-utils/sfdisk.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/disk-utils/sfdisk.c b/disk-utils/sfdisk.c
index 743719ef9..8b213001b 100644
--- a/disk-utils/sfdisk.c
+++ b/disk-utils/sfdisk.c
@@ -83,6 +83,7 @@ enum {
ACT_PARTUUID,
ACT_PARTLABEL,
ACT_PARTATTRS,
+ ACT_DELETE
};
struct sfdisk {
@@ -841,6 +842,45 @@ static int command_activate(struct sfdisk *sf, int argc, char **argv)
}
/*
+ * sfdisk --delete <device> [<partno> ...]
+ */
+static int command_delete(struct sfdisk *sf, int argc, char **argv)
+{
+ size_t i;
+ const char *devname = NULL;
+
+ if (argc < 1)
+ errx(EXIT_FAILURE, _("no disk device specified"));
+ devname = argv[0];
+
+ if (fdisk_assign_device(sf->cxt, devname, 0) != 0)
+ err(EXIT_FAILURE, _("cannot open %s"), devname);
+
+ if (sf->backup)
+ backup_partition_table(sf, devname);
+
+ /* delate all */
+ if (argc == 1) {
+ size_t nparts = fdisk_get_npartitions(sf->cxt);
+ for (i = 0; i < nparts; i++) {
+ if (fdisk_is_partition_used(sf->cxt, i) &&
+ fdisk_delete_partition(sf->cxt, i) != 0)
+ errx(EXIT_FAILURE, _("%s: partition %zu: failed to delete"), devname, i + 1);
+ }
+ /* delete specified */
+ } else {
+ for (i = 1; i < (size_t) argc; i++) {
+ size_t n = strtou32_or_err(argv[i], _("failed to parse partition number"));
+
+ if (fdisk_delete_partition(sf->cxt, n - 1) != 0)
+ errx(EXIT_FAILURE, _("%s: partition %zu: failed to delete"), devname, n);
+ }
+ }
+
+ return write_changes(sf);
+}
+
+/*
* sfdisk --reorder <device>
*/
static int command_reorder(struct sfdisk *sf, int argc, char **argv)
@@ -1670,6 +1710,7 @@ static void __attribute__ ((__noreturn__)) usage(FILE *out)
fputs(_(" -s, --show-size [<dev> ...] list sizes of all or specified devices\n"), out);
fputs(_(" -T, --list-types print the recognized types (see -X)\n"), out);
fputs(_(" -V, --verify [<dev> ...] test whether partitions seem correct\n"), out);
+ fputs(_(" --delete <dev> [<part> ...] delete all or specified partitions\n"), out);
fputs(USAGE_SEPARATOR, out);
fputs(_(" --part-label <dev> <part> [<str>] print or change partition label\n"), out);
@@ -1736,6 +1777,7 @@ int main(int argc, char *argv[])
OPT_BYTES,
OPT_COLOR,
OPT_MOVEDATA,
+ OPT_DELETE
};
static const struct option longopts[] = {
@@ -1745,6 +1787,7 @@ int main(int argc, char *argv[])
{ "backup-file", required_argument, NULL, 'O' },
{ "bytes", no_argument, NULL, OPT_BYTES },
{ "color", optional_argument, NULL, OPT_COLOR },
+ { "delete", no_argument, NULL, OPT_DELETE },
{ "dump", no_argument, NULL, 'd' },
{ "help", no_argument, NULL, 'h' },
{ "force", no_argument, NULL, 'f' },
@@ -1904,6 +1947,9 @@ int main(int argc, char *argv[])
sf->movedata = 1;
sf->move_typescript = optarg;
break;
+ case OPT_DELETE:
+ sf->act = ACT_DELETE;
+ break;
default:
usage(stderr);
}
@@ -1931,6 +1977,10 @@ int main(int argc, char *argv[])
rc = command_activate(sf, argc - optind, argv + optind);
break;
+ case ACT_DELETE:
+ rc = command_delete(sf, argc - optind, argv + optind);
+ break;
+
case ACT_LIST:
rc = command_list_partitions(sf, argc - optind, argv + optind);
break;