summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard W.M. Jones <rjones@redhat.com>2011-07-12 18:16:40 +0100
committerRichard W.M. Jones <rjones@redhat.com>2011-07-12 18:44:46 +0100
commitedd747a09060dd191277f1bcae827a94939cfb9d (patch)
treee32c4fb35b581e8ce5c0e9cef7ed192b9a26c675
parent2ba2ddf2113db7bb2afe3f739dc3cbaa5416a4ba (diff)
downloadlibguestfs-edd747a09060dd191277f1bcae827a94939cfb9d.tar.gz
libguestfs-edd747a09060dd191277f1bcae827a94939cfb9d.tar.xz
libguestfs-edd747a09060dd191277f1bcae827a94939cfb9d.zip
New API: ntfsresize-opts (RHBZ#685009).
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.
-rw-r--r--daemon/ntfs.c52
-rw-r--r--generator/generator_actions.ml36
-rw-r--r--src/MAX_PROC_NR2
3 files changed, 69 insertions, 21 deletions
diff --git a/daemon/ntfs.c b/daemon/ntfs.c
index 909ea18b..58912636 100644
--- a/daemon/ntfs.c
+++ b/daemon/ntfs.c
@@ -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);
}
diff --git a/generator/generator_actions.ml b/generator/generator_actions.ml
index 6b53c340..8592a39c 100644
--- a/generator/generator_actions.ml
+++ b/generator/generator_actions.ml
@@ -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
diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR
index 209ac45b..ea809473 100644
--- a/src/MAX_PROC_NR
+++ b/src/MAX_PROC_NR
@@ -1 +1 @@
-287
+288