New API: ntfsresize-opts (RHBZ#685009).
authorRichard W.M. Jones <rjones@redhat.com>
Tue, 12 Jul 2011 17:16:40 +0000 (18:16 +0100)
committerRichard W.M. Jones <rjones@redhat.com>
Tue, 12 Jul 2011 17:44:46 +0000 (18:44 +0100)
This is a more comprehensive fix for RHBZ#685009.  Add a new API which
allows the --force flag to be passed, allowing multiple NTFS resize
operations in a single session.

daemon/ntfs.c
generator/generator_actions.ml
src/MAX_PROC_NR

index 909ea18..5891263 100644 (file)
@@ -60,13 +60,37 @@ do_ntfs_3g_probe (int rw, const char *device)
   return r;
 }
 
+/* Takes optional arguments, consult optargs_bitmask. */
 int
-do_ntfsresize (const char *device)
+do_ntfsresize_opts (const char *device, int64_t size, int force)
 {
   char *err;
   int r;
+  const char *argv[16];
+  size_t i = 0;
+  char size_str[32];
+
+  argv[i++] = "ntfsresize";
+  argv[i++] = "-P";
+
+  if (optargs_bitmask & GUESTFS_NTFSRESIZE_OPTS_SIZE_BITMASK) {
+    if (size <= 0) {
+      reply_with_error ("size is zero or negative");
+      return -1;
+    }
+
+    snprintf (size_str, sizeof size_str, "%" PRIi64, size);
+    argv[i++] = "--size";
+    argv[i++] = size_str;
+  }
+
+  if (optargs_bitmask & GUESTFS_NTFSRESIZE_OPTS_FORCE_BITMASK && force)
+    argv[i++] = "--force";
 
-  r = command (NULL, &err, "ntfsresize", "-P", device, NULL);
+  argv[i++] = device;
+  argv[i++] = NULL;
+
+  r = commandv (NULL, &err, argv);
   if (r == -1) {
     reply_with_error ("%s: %s", device, err);
     free (err);
@@ -78,22 +102,14 @@ do_ntfsresize (const char *device)
 }
 
 int
-do_ntfsresize_size (const char *device, int64_t size)
+do_ntfsresize (const char *device)
 {
-  char *err;
-  int r;
-
-  char buf[32];
-  snprintf (buf, sizeof buf, "%" PRIi64, size);
-
-  r = command (NULL, &err, "ntfsresize", "-P", "--size", buf,
-               device, NULL);
-  if (r == -1) {
-    reply_with_error ("%s: %s", device, err);
-    free (err);
-    return -1;
-  }
+  return do_ntfsresize_opts (device, 0, 0);
+}
 
-  free (err);
-  return 0;
+int
+do_ntfsresize_size (const char *device, int64_t size)
+{
+  optargs_bitmask = GUESTFS_NTFSRESIZE_OPTS_SIZE_BITMASK;
+  return do_ntfsresize_opts (device, size, 0);
 }
index 6b53c34..8592a39 100644 (file)
@@ -5218,7 +5218,7 @@ I<xz compressed> tar file) into C<directory>.");
 This command packs the contents of C<directory> and downloads
 it to local file C<tarball> (as an xz compressed tar archive).");
 
-  ("ntfsresize", (RErr, [Device "device"], []), 231, [Optional "ntfsprogs"],
+  ("ntfsresize", (RErr, [Device "device"], []), 231, [Optional "ntfsprogs"; DeprecatedBy "ntfsresize_opts"],
    [],
    "resize an NTFS filesystem",
    "\
@@ -5456,7 +5456,7 @@ allows you to specify the new size (in bytes) explicitly.");
 This command is the same as C<guestfs_pvresize> except that it
 allows you to specify the new size (in bytes) explicitly.");
 
-  ("ntfsresize_size", (RErr, [Device "device"; Int64 "size"], []), 250, [Optional "ntfsprogs"],
+  ("ntfsresize_size", (RErr, [Device "device"; Int64 "size"], []), 250, [Optional "ntfsprogs"; DeprecatedBy "ntfsresize_opts"],
    [],
    "resize an NTFS filesystem (with size)",
    "\
@@ -6011,6 +6011,38 @@ Device mapper devices which correspond to logical volumes are I<not>
 returned in this list.  Call C<guestfs_lvs> if you want to list logical
 volumes.");
 
+  ("ntfsresize_opts", (RErr, [Device "device"], [Int64 "size"; Bool "force"]), 288, [Optional "ntfsprogs"],
+   [],
+   "resize an NTFS filesystem",
+   "\
+This command resizes an NTFS filesystem, expanding or
+shrinking it to the size of the underlying device.
+
+The optional parameters are:
+
+=over 4
+
+=item C<size>
+
+The new size (in bytes) of the filesystem.  If omitted, the filesystem
+is resized to fit the container (eg. partition).
+
+=item C<force>
+
+If this option is true, then force the resize of the filesystem
+even if the filesystem is marked as requiring a consistency check.
+
+After the resize operation, the filesystem is always marked
+as requiring a consistency check (for safety).  You have to boot
+into Windows to perform this check and clear this condition.
+If you I<don't> set the C<force> option then it is not
+possible to call C<guestfs_ntfsresize_opts> multiple times on a
+single filesystem without booting into Windows between each resize.
+
+=back
+
+See also L<ntfsresize(8)>.");
+
 ]
 
 let all_functions = non_daemon_functions @ daemon_functions
index 209ac45..ea80947 100644 (file)
@@ -1 +1 @@
-287
+288