summaryrefslogtreecommitdiffstats
path: root/daemon
diff options
context:
space:
mode:
authorRichard Jones <rjones@redhat.com>2009-05-18 17:16:24 +0100
committerRichard Jones <rjones@redhat.com>2009-05-18 17:16:24 +0100
commit85ed8cef99c19b4143844991d14e0b848fecc5da (patch)
tree61e34886d4ec4b59a37c8e4ab6779e7ef7834f34 /daemon
parentadf0974245af914c46b48766d0efdd5ee8608dda (diff)
downloadlibguestfs-85ed8cef99c19b4143844991d14e0b848fecc5da.tar.gz
libguestfs-85ed8cef99c19b4143844991d14e0b848fecc5da.tar.xz
libguestfs-85ed8cef99c19b4143844991d14e0b848fecc5da.zip
Add vg-activate{,-all} commands, and resize recipe.
Diffstat (limited to 'daemon')
-rw-r--r--daemon/actions.h2
-rw-r--r--daemon/lvm.c39
-rw-r--r--daemon/sfdisk.c5
-rw-r--r--daemon/stubs.c63
4 files changed, 108 insertions, 1 deletions
diff --git a/daemon/actions.h b/daemon/actions.h
index 3e6589e2..dcffd2a2 100644
--- a/daemon/actions.h
+++ b/daemon/actions.h
@@ -123,3 +123,5 @@ extern int do_sfdisk_N (const char *device, int n, int cyls, int heads, int sect
extern char *do_sfdisk_l (const char *device);
extern char *do_sfdisk_kernel_geometry (const char *device);
extern char *do_sfdisk_disk_geometry (const char *device);
+extern int do_vg_activate_all (int activate);
+extern int do_vg_activate (int activate, char * const* const volgroups);
diff --git a/daemon/lvm.c b/daemon/lvm.c
index d1a6cd60..63a3e7e5 100644
--- a/daemon/lvm.c
+++ b/daemon/lvm.c
@@ -376,3 +376,42 @@ do_pvresize (const char *device)
free (err);
return 0;
}
+
+int
+do_vg_activate (int activate, char * const* const volgroups)
+{
+ char *err;
+ int r, i, argc;
+ const char **argv;
+
+ argc = count_strings (volgroups) + 4;
+ argv = malloc (sizeof (char *) * (argc+1));
+ if (argv == NULL) {
+ reply_with_perror ("malloc");
+ return -1;
+ }
+
+ argv[0] = "/sbin/lvm";
+ argv[1] = "vgchange";
+ argv[2] = "-a";
+ argv[3] = activate ? "y" : "n";
+ for (i = 4; i <= argc; ++i)
+ argv[i] = volgroups[i-4];
+
+ r = commandv (NULL, &err, argv);
+ if (r == -1) {
+ reply_with_error ("vgchange: %s", err);
+ free (err);
+ return -1;
+ }
+
+ free (err);
+ return 0;
+}
+
+int
+do_vg_activate_all (int activate)
+{
+ char *empty[] = { NULL };
+ return do_vg_activate (activate, empty);
+}
diff --git a/daemon/sfdisk.c b/daemon/sfdisk.c
index 9d7a220f..2f5206ed 100644
--- a/daemon/sfdisk.c
+++ b/daemon/sfdisk.c
@@ -39,7 +39,7 @@ sfdisk (const char *device, int n, int cyls, int heads, int sectors,
IS_DEVICE (device, -1);
- strcpy (buf, "/sbin/sfdisk --no-reread");
+ strcpy (buf, "/sbin/sfdisk");
if (n > 0)
sprintf (buf + strlen (buf), " -N %d", n);
if (cyls)
@@ -51,6 +51,9 @@ sfdisk (const char *device, int n, int cyls, int heads, int sectors,
/* Safe because of IS_DEVICE above: */
sprintf (buf + strlen (buf), " %s", device);
+ if (verbose)
+ printf ("%s\n", buf);
+
fp = popen (buf, "w");
if (fp == NULL) {
reply_with_perror (buf);
diff --git a/daemon/stubs.c b/daemon/stubs.c
index e80ba9be..2fd2da93 100644
--- a/daemon/stubs.c
+++ b/daemon/stubs.c
@@ -2560,6 +2560,63 @@ done:
xdr_free ((xdrproc_t) xdr_guestfs_sfdisk_disk_geometry_args, (char *) &args);
}
+static void vg_activate_all_stub (XDR *xdr_in)
+{
+ int r;
+ struct guestfs_vg_activate_all_args args;
+ int activate;
+
+ memset (&args, 0, sizeof args);
+
+ if (!xdr_guestfs_vg_activate_all_args (xdr_in, &args)) {
+ reply_with_error ("%s: daemon failed to decode procedure arguments", "vg_activate_all");
+ return;
+ }
+ activate = args.activate;
+
+ r = do_vg_activate_all (activate);
+ if (r == -1)
+ /* do_vg_activate_all has already called reply_with_error */
+ goto done;
+
+ reply (NULL, NULL);
+done:
+ xdr_free ((xdrproc_t) xdr_guestfs_vg_activate_all_args, (char *) &args);
+}
+
+static void vg_activate_stub (XDR *xdr_in)
+{
+ int r;
+ struct guestfs_vg_activate_args args;
+ int activate;
+ char **volgroups;
+
+ memset (&args, 0, sizeof args);
+
+ if (!xdr_guestfs_vg_activate_args (xdr_in, &args)) {
+ reply_with_error ("%s: daemon failed to decode procedure arguments", "vg_activate");
+ return;
+ }
+ activate = args.activate;
+ volgroups = realloc (args.volgroups.volgroups_val,
+ sizeof (char *) * (args.volgroups.volgroups_len+1));
+ if (volgroups == NULL) {
+ reply_with_perror ("realloc");
+ goto done;
+ }
+ volgroups[args.volgroups.volgroups_len] = NULL;
+ args.volgroups.volgroups_val = volgroups;
+
+ r = do_vg_activate (activate, volgroups);
+ if (r == -1)
+ /* do_vg_activate has already called reply_with_error */
+ goto done;
+
+ reply (NULL, NULL);
+done:
+ xdr_free ((xdrproc_t) xdr_guestfs_vg_activate_args, (char *) &args);
+}
+
void dispatch_incoming_message (XDR *xdr_in)
{
switch (proc_nr) {
@@ -2869,6 +2926,12 @@ void dispatch_incoming_message (XDR *xdr_in)
case GUESTFS_PROC_SFDISK_DISK_GEOMETRY:
sfdisk_disk_geometry_stub (xdr_in);
break;
+ case GUESTFS_PROC_VG_ACTIVATE_ALL:
+ vg_activate_all_stub (xdr_in);
+ break;
+ case GUESTFS_PROC_VG_ACTIVATE:
+ vg_activate_stub (xdr_in);
+ break;
default:
reply_with_error ("dispatch_incoming_message: unknown procedure number %d", proc_nr);
}