summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--disk-utils/fdisk-menu.c38
-rw-r--r--disk-utils/fdisk.812
-rw-r--r--disk-utils/fdisk.c11
-rw-r--r--disk-utils/fdisk.h2
4 files changed, 61 insertions, 2 deletions
diff --git a/disk-utils/fdisk-menu.c b/disk-utils/fdisk-menu.c
index becdb40e4..b099cc3c2 100644
--- a/disk-utils/fdisk-menu.c
+++ b/disk-utils/fdisk-menu.c
@@ -516,6 +516,37 @@ done:
return rc;
}
+static int ask_for_wipe(struct fdisk_context *cxt, size_t partno)
+{
+ struct fdisk_partition *tmp = NULL;
+ char *fstype = NULL;
+ int rc, yes = 0;
+
+ rc = fdisk_get_partition(cxt, partno, &tmp);
+ if (rc)
+ goto done;
+
+ rc = fdisk_partition_to_string(tmp, cxt, FDISK_FIELD_FSTYPE, &fstype);
+ if (rc || fstype == NULL)
+ goto done;
+
+ fdisk_warnx(cxt, _("Partition #%zu contains a %s signature."), partno + 1, fstype);
+
+ if (pwipemode == WIPEMODE_AUTO && isatty(STDIN_FILENO))
+ fdisk_ask_yesno(cxt, _("Do you want to remove the signature?"), &yes);
+ else if (pwipemode == WIPEMODE_ALWAYS)
+ yes = 1;
+
+ if (yes) {
+ fdisk_info(cxt, _("The signature will be removed by a write command."));
+ rc = fdisk_wipe_partition(cxt, partno, TRUE);
+ }
+done:
+ fdisk_unref_partition(tmp);
+ free(fstype);
+ return rc;
+}
+
/*
* Basic fdisk actions
*/
@@ -610,8 +641,13 @@ static int generic_menu_cb(struct fdisk_context **cxt0,
list_partition_types(cxt);
break;
case 'n':
- rc = fdisk_add_partition(cxt, NULL, NULL);
+ {
+ size_t partno;
+ rc = fdisk_add_partition(cxt, NULL, &partno);
+ if (!rc)
+ rc = ask_for_wipe(cxt, partno);
break;
+ }
case 't':
change_partition_type(cxt);
break;
diff --git a/disk-utils/fdisk.8 b/disk-utils/fdisk.8
index 41069dd7a..5d644d8d6 100644
--- a/disk-utils/fdisk.8
+++ b/disk-utils/fdisk.8
@@ -130,6 +130,18 @@ before a new partition table is created. See also
command.
.TP
+\fB\-W\fR, \fB\-\-wipe-partition\fR \fIwhen\fR
+Wipe filesystem, RAID and partition-table signatures from a newly created
+partitions, in order to avoid possible collisions. The argument \fIwhen\fR can
+be \fBauto\fR, \fBnever\fR or \fBalways\fR. When this option is not given, the
+default is \fBauto\fR, in which case signatures are wiped only when in
+interactive mode and after confirmation by user. In all cases detected
+signatures are reported by warning messages before a new partition is
+created. See also
+.BR wipefs (8)
+command.
+
+.TP
\fB\-V\fR, \fB\-\-version\fR
Display version information and exit.
diff --git a/disk-utils/fdisk.c b/disk-utils/fdisk.c
index 73d82eb4c..1f1f9ba6b 100644
--- a/disk-utils/fdisk.c
+++ b/disk-utils/fdisk.c
@@ -49,6 +49,8 @@
# include <linux/blkpg.h>
#endif
+int pwipemode = WIPEMODE_AUTO;
+
/*
* fdisk debug stuff (see fdisk.h and include/debug.h)
*/
@@ -741,6 +743,7 @@ static void __attribute__ ((__noreturn__)) usage(FILE *out)
fputs(_(" -s, --getsz display device size in 512-byte sectors [DEPRECATED]\n"), out);
fputs(_(" --bytes print SIZE in bytes rather than in human readable format\n"), out);
fputs(_(" -w, --wipe <mode> wipe signatures (auto, always or never)\n"), out);
+ fputs(_(" -W, --wipe-partitions <mode> wipe signatures from new partitions (auto, always or never)\n"), out);
fputs(USAGE_SEPARATOR, out);
fputs(_(" -C, --cylinders <number> specify the number of cylinders\n"), out);
@@ -791,6 +794,7 @@ int main(int argc, char **argv)
{ "output", no_argument, NULL, 'o' },
{ "protect-boot", no_argument, NULL, 'B' },
{ "wipe", required_argument, NULL, 'w' },
+ { "wipe-partitions",required_argument, NULL, 'W' },
{ NULL, 0, NULL, 0 }
};
@@ -809,7 +813,7 @@ int main(int argc, char **argv)
fdisk_set_ask(cxt, ask_callback, NULL);
- while ((c = getopt_long(argc, argv, "b:Bc::C:hH:lL::o:sS:t:u::vVw:",
+ while ((c = getopt_long(argc, argv, "b:Bc::C:hH:lL::o:sS:t:u::vVw:W:",
longopts, NULL)) != -1) {
switch (c) {
case 'b':
@@ -905,6 +909,11 @@ int main(int argc, char **argv)
if (wipemode < 0)
errx(EXIT_FAILURE, _("unsupported wipe mode"));
break;
+ case 'W':
+ pwipemode = wipemode_from_string(optarg);
+ if (pwipemode < 0)
+ errx(EXIT_FAILURE, _("unsupported wipe mode"));
+ break;
case 'h':
usage(stdout);
case OPT_BYTES:
diff --git a/disk-utils/fdisk.h b/disk-utils/fdisk.h
index f66404d04..7a7fb85d3 100644
--- a/disk-utils/fdisk.h
+++ b/disk-utils/fdisk.h
@@ -24,6 +24,8 @@
#define FDISKPROG_DEBUG_ASK (1 << 5)
#define FDISKPROG_DEBUG_ALL 0xFFFF
+extern int pwipemode;
+
UL_DEBUG_DECLARE_MASK(fdisk);
#define DBG(m, x) __UL_DBG(fdisk, FDISKPROG_DEBUG_, m, x)
#define ON_DBG(m, x) __UL_DBG_CALL(fdisk, FDISKPROG_DEBUG_, m, x)