summaryrefslogtreecommitdiffstats
path: root/daemon
diff options
context:
space:
mode:
authorRichard W.M. Jones <rjones@redhat.com>2012-11-19 15:43:52 +0000
committerRichard W.M. Jones <rjones@redhat.com>2012-11-20 10:44:10 +0000
commit3454cfb73c74b4fd3fba9d834c13685b166d9d3f (patch)
tree11beddc079737f8ee54f91e7fb0407fac1042a8c /daemon
parentb5b475ab827b862cce07ab095e4cb8b4ab1a954a (diff)
downloadlibguestfs-3454cfb73c74b4fd3fba9d834c13685b166d9d3f.tar.gz
libguestfs-3454cfb73c74b4fd3fba9d834c13685b166d9d3f.tar.xz
libguestfs-3454cfb73c74b4fd3fba9d834c13685b166d9d3f.zip
daemon: wipefs: Use --force option if available.
See https://bugzilla.redhat.com/show_bug.cgi?id=872831 and https://bugzilla.redhat.com/show_bug.cgi?id=865961
Diffstat (limited to 'daemon')
-rw-r--r--daemon/zero.c42
1 files changed, 40 insertions, 2 deletions
diff --git a/daemon/zero.c b/daemon/zero.c
index 1a668812..4997583c 100644
--- a/daemon/zero.c
+++ b/daemon/zero.c
@@ -82,14 +82,52 @@ optgroup_wipefs_available (void)
return prog_exists (str_wipefs);
}
+/* See RHBZ#872831 */
+static int
+wipefs_has_force_option (void)
+{
+ static int flag = -1;
+ int r;
+ char *out, *err;
+
+ if (flag == -1) {
+ r = command (&out, &err, "wipefs", "--help", NULL);
+ if (r == -1) {
+ reply_with_error ("%s", err);
+ free (out);
+ free (err);
+ return -1;
+ }
+ free (err);
+ flag = strstr (out, "--force") != NULL;
+ free (out);
+ }
+
+ return flag;
+}
+
int
do_wipefs (const char *device)
{
+ int force;
int r;
char *err = NULL;
+ const size_t MAX_ARGS = 16;
+ const char *argv[MAX_ARGS];
+ size_t i = 0;
+
+ force = wipefs_has_force_option ();
+ if (force == -1)
+ return -1;
+
+ ADD_ARG (argv, i, str_wipefs);
+ ADD_ARG (argv, i, "-a");
+ if (force)
+ ADD_ARG (argv, i, "--force");
+ ADD_ARG (argv, i, device);
+ ADD_ARG (argv, i, NULL);
- const char *wipefs[] = {str_wipefs, "-a", device, NULL};
- r = commandv (NULL, &err, wipefs);
+ r = commandv (NULL, &err, argv);
if (r == -1) {
reply_with_error ("%s", err);
free (err);