diff --git a/sbin/gpt/add.c b/sbin/gpt/add.c index 195f6ad34d79..0bba7f9d860b 100644 --- a/sbin/gpt/add.c +++ b/sbin/gpt/add.c @@ -147,6 +147,8 @@ add(int fd) gpt_write(fd, lbt); gpt_write(fd, tpg); + + printf("%sp%u added\n", device_name, i + 1); } int diff --git a/sbin/gpt/gpt.8 b/sbin/gpt/gpt.8 index 8b85a6a367b7..a6f444bd3cd0 100644 --- a/sbin/gpt/gpt.8 +++ b/sbin/gpt/gpt.8 @@ -206,6 +206,11 @@ the GPT equivalent of a slice. .It Xo .Nm .Ic remove +.Op Fl a +.Xc +.It Xo +.Nm +.Ic remove .Op Fl b Ar number .Op Fl i Ar index .Op Fl s Ar count @@ -215,8 +220,12 @@ the GPT equivalent of a slice. The .Ic remove command allows the user to remove any partitions that match the selection. -BEWARE: when no options are given, all GPT partitions will match and thus -will be deleted. +At least one option must be specified. +.Pp +The +.Fl a +option specifies that all partitions should be removed. +It is mutually exclusive with all other options. .Pp The .Fl b Ar number diff --git a/sbin/gpt/gpt.c b/sbin/gpt/gpt.c index a4d5685e31ed..23a36be687cc 100644 --- a/sbin/gpt/gpt.c +++ b/sbin/gpt/gpt.c @@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -46,7 +47,8 @@ __FBSDID("$FreeBSD$"); #include "map.h" #include "gpt.h" -char device_name[MAXPATHLEN]; +char device_path[MAXPATHLEN]; +char *device_name; off_t mediasz; @@ -374,24 +376,26 @@ int gpt_open(const char *dev) { struct stat sb; - int fd; + int fd, mode; - if (!stat(dev, &sb)) { - strlcpy(device_name, dev, sizeof(device_name)); - goto found; - } + mode = readonly ? O_RDONLY : O_RDWR|O_EXCL; - snprintf(device_name, sizeof(device_name), "/dev/%s", dev); - if (!stat(device_name, &sb)) + strlcpy(device_path, dev, sizeof(device_path)); + device_name = device_path; + + if ((fd = open(device_path, mode)) != -1) + goto found; + + snprintf(device_path, sizeof(device_path), "%s%s", _PATH_DEV, dev); + device_name = device_path + strlen(_PATH_DEV); + if ((fd = open(device_path, mode)) != -1) goto found; - strlcpy(device_name, dev, sizeof(device_name)); return (-1); found: - fd = open(device_name, (readonly) ? O_RDONLY : O_RDWR|O_EXCL); - if (fd == -1) - return (-1); + if (fstat(fd, &sb) == -1) + goto close; if ((sb.st_mode & S_IFMT) != S_IFREG) { if (ioctl(fd, DIOCGSECTORSIZE, &secsz) == -1 || diff --git a/sbin/gpt/gpt.h b/sbin/gpt/gpt.h index edbb0821703b..b6a4c8081f5a 100644 --- a/sbin/gpt/gpt.h +++ b/sbin/gpt/gpt.h @@ -59,7 +59,7 @@ struct mbr { #define MBR_SIG 0xAA55 }; -extern char device_name[]; +extern char *device_name; extern off_t mediasz; extern u_int parts; extern u_int secsz; diff --git a/sbin/gpt/remove.c b/sbin/gpt/remove.c index 42e112837a2a..9949d0043d1e 100644 --- a/sbin/gpt/remove.c +++ b/sbin/gpt/remove.c @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include "map.h" #include "gpt.h" +static int all; static uuid_t type; static off_t block, size; static unsigned int entry; @@ -48,8 +49,9 @@ usage_remove(void) { fprintf(stderr, - "usage: %s [-b lba] [-i index] [-s lba] [-t uuid] device\n", - getprogname()); + "usage: %s -a device\n" + " %s [-b lba] [-i index] [-s lba] [-t uuid] device\n", + getprogname(), getprogname()); exit(1); } @@ -130,6 +132,8 @@ rem(int fd) gpt_write(fd, lbt); gpt_write(fd, tpg); + printf("%sp%u removed\n", device_name, m->map_index); + removed++; } @@ -144,8 +148,13 @@ cmd_remove(int argc, char *argv[]) uint32_t status; /* Get the remove options */ - while ((ch = getopt(argc, argv, "b:i:s:t:")) != -1) { + while ((ch = getopt(argc, argv, "ab:i:s:t:")) != -1) { switch(ch) { + case 'a': + if (all > 0) + usage_remove(); + all = 1; + break; case 'b': if (block > 0) usage_remove(); @@ -194,6 +203,10 @@ cmd_remove(int argc, char *argv[]) } } + if (!all ^ + (block > 0 || entry > 0 || size > 0 || !uuid_is_nil(&type, NULL))) + usage_remove(); + if (argc == optind) usage_remove();