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 @@ -129,6 +129,18 @@ before a new partition table is created. See also .BR wipefs (8) 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 #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 wipe signatures (auto, always or never)\n"), out); + fputs(_(" -W, --wipe-partitions wipe signatures from new partitions (auto, always or never)\n"), out); fputs(USAGE_SEPARATOR, out); fputs(_(" -C, --cylinders 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)