X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=daemon%2Fntfs.c;h=076e297c0b5918a4a4037acb07956c1034956788;hp=46b8333e064b57c3c46e545be214e1208c75c18a;hb=HEAD;hpb=7cb6fac3074c52ac3c3e9ead5d99e4a2887cf7b1 diff --git a/daemon/ntfs.c b/daemon/ntfs.c index 46b8333..076e297 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 @@ -13,7 +13,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include @@ -28,18 +28,18 @@ #include "actions.h" #include "optgroups.h" +#define MAX_ARGS 64 + 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) { - int r = access ("/usr/sbin/ntfsresize", X_OK); - return r == 0; + return prog_exists ("ntfsresize"); } int @@ -58,41 +58,60 @@ do_ntfs_3g_probe (int rw, const char *device) return -1; } + free (err); 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[MAX_ARGS]; + size_t i = 0; + char size_str[32]; + + ADD_ARG (argv, i, "ntfsresize"); + ADD_ARG (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); + ADD_ARG (argv, i, "--size"); + ADD_ARG (argv, i, size_str); + } - r = command (NULL, &err, "ntfsresize", "-P", device, NULL); + if (optargs_bitmask & GUESTFS_NTFSRESIZE_OPTS_FORCE_BITMASK && force) + ADD_ARG (argv, i, "--force"); + + ADD_ARG (argv, i, device); + ADD_ARG (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_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); +} - 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); }