X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=daemon%2Fntfs.c;h=589126362fb9661d988de439ed0ebf32f12c0229;hp=b35300848a11334f3b7fbf59b7eea8ee2b33244f;hb=782a2e0299b0c22155f0c115f94903c519040247;hpb=2d9953097b6d3b71122d444a4550047e97aee009 diff --git a/daemon/ntfs.c b/daemon/ntfs.c index b353008..5891263 100644 --- a/daemon/ntfs.c +++ b/daemon/ntfs.c @@ -1,5 +1,5 @@ /* libguestfs - the guestfsd daemon - * Copyright (C) 2009 Red Hat Inc. + * Copyright (C) 2009-2010 Red Hat Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,6 +20,7 @@ #include #include +#include #include #include @@ -30,8 +31,13 @@ int optgroup_ntfs3g_available (void) { - int r = access ("/bin/ntfs-3g.probe", X_OK); - return r == 0; + return prog_exists ("ntfs-3g.probe"); +} + +int +optgroup_ntfsprogs_available (void) +{ + return prog_exists ("ntfsresize"); } int @@ -45,10 +51,65 @@ do_ntfs_3g_probe (int rw, const char *device) r = commandr (NULL, &err, "ntfs-3g.probe", rw_flag, device, NULL); if (r == -1) { - reply_with_error ("ntfs-3g.probe: %s: %s", device, err); + reply_with_error ("%s: %s", device, err); free (err); return -1; } + free (err); return r; } + +/* Takes optional arguments, consult optargs_bitmask. */ +int +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"; + + argv[i++] = device; + argv[i++] = NULL; + + r = commandv (NULL, &err, argv); + if (r == -1) { + reply_with_error ("%s: %s", device, err); + free (err); + return -1; + } + + free (err); + return 0; +} + +int +do_ntfsresize (const char *device) +{ + return do_ntfsresize_opts (device, 0, 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); +}