diff options
author | Richard W.M. Jones <rjones@redhat.com> | 2011-07-14 11:38:25 +0100 |
---|---|---|
committer | Richard W.M. Jones <rjones@redhat.com> | 2011-07-14 13:03:49 +0100 |
commit | a001a0d710ec61d8bc11841f44ac0d1f296040ea (patch) | |
tree | a9c21fdaa9e0dc24b2e82d51b27adcd9498c83e6 /daemon/btrfs.c | |
parent | 08910ee60cfac9aa648e59dda5dbb429825c561e (diff) | |
download | libguestfs-a001a0d710ec61d8bc11841f44ac0d1f296040ea.tar.gz libguestfs-a001a0d710ec61d8bc11841f44ac0d1f296040ea.tar.xz libguestfs-a001a0d710ec61d8bc11841f44ac0d1f296040ea.zip |
New API: btrfs-filesystem-resize (RHBZ#721160).
This resizes a btrfs filesystem.
Diffstat (limited to 'daemon/btrfs.c')
-rw-r--r-- | daemon/btrfs.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/daemon/btrfs.c b/daemon/btrfs.c new file mode 100644 index 00000000..619ab50f --- /dev/null +++ b/daemon/btrfs.c @@ -0,0 +1,84 @@ +/* libguestfs - the guestfsd daemon + * Copyright (C) 2011 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * 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. + */ + +#include <config.h> + +#include <stdio.h> +#include <stdlib.h> +#include <inttypes.h> +#include <string.h> +#include <unistd.h> + +#include "daemon.h" +#include "actions.h" +#include "optgroups.h" + +int +optgroup_btrfs_available (void) +{ + return prog_exists ("btrfs"); +} + +/* Takes optional arguments, consult optargs_bitmask. */ +int +do_btrfs_filesystem_resize (const char *filesystem, int64_t size) +{ + char *buf; + char *err; + int r; + const char *argv[16]; + size_t i = 0; + char size_str[32]; + + argv[i++] = "btrfs"; + argv[i++] = "filesystem"; + argv[i++] = "resize"; + + if (optargs_bitmask & GUESTFS_BTRFS_FILESYSTEM_RESIZE_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_str; + } + else + argv[i++] = "max"; + + buf = sysroot_path (filesystem); + if (!buf) { + reply_with_error ("malloc"); + return -1; + } + + argv[i++] = buf; + argv[i++] = NULL; + + r = commandv (NULL, &err, argv); + free (buf); + + if (r == -1) { + reply_with_error ("%s: %s", filesystem, err); + free (err); + return -1; + } + + free (err); + return 0; +} |