summaryrefslogtreecommitdiffstats
path: root/daemon
diff options
context:
space:
mode:
authorRichard W.M. Jones <rjones@redhat.com>2009-05-15 14:01:28 +0100
committerRichard W.M. Jones <rjones@redhat.com>2009-05-15 14:52:34 +0100
commit5cd39c83e23eb300d1bdfa806902a31b409ff420 (patch)
treea47e2bf9afc16cb9404ae996f512a9d3f22e553b /daemon
parentb8e5f51c79f539a740827506cc9da3ffcb6c87f8 (diff)
downloadlibguestfs-5cd39c83e23eb300d1bdfa806902a31b409ff420.tar.gz
libguestfs-5cd39c83e23eb300d1bdfa806902a31b409ff420.tar.xz
libguestfs-5cd39c83e23eb300d1bdfa806902a31b409ff420.zip
Add: pvresize, sfdisk-N, sfdisk-l, sfdisk-kernel-geomtry, sfdisk-disk-geometry commands. Pass --no-reread flag to sfdisk.
Diffstat (limited to 'daemon')
-rw-r--r--daemon/Makefile.am1
-rw-r--r--daemon/actions.h5
-rw-r--r--daemon/devsparts.c43
-rw-r--r--daemon/lvm.c18
-rw-r--r--daemon/sfdisk.c130
-rw-r--r--daemon/stubs.c154
6 files changed, 308 insertions, 43 deletions
diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index d6ae6c38..ac1f8c58 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -43,6 +43,7 @@ guestfsd_SOURCES = \
mount.c \
pingdaemon.c \
proto.c \
+ sfdisk.c \
stat.c \
strings.c \
stubs.c \
diff --git a/daemon/actions.h b/daemon/actions.h
index 37ec1253..3e6589e2 100644
--- a/daemon/actions.h
+++ b/daemon/actions.h
@@ -118,3 +118,8 @@ extern char **do_strings (const char *path);
extern char **do_strings_e (const char *encoding, const char *path);
extern char *do_hexdump (const char *path);
extern int do_zerofree (const char *device);
+extern int do_pvresize (const char *device);
+extern int do_sfdisk_N (const char *device, int n, int cyls, int heads, int sectors, const char *line);
+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);
diff --git a/daemon/devsparts.c b/daemon/devsparts.c
index 0a4d5e46..21854b5c 100644
--- a/daemon/devsparts.c
+++ b/daemon/devsparts.c
@@ -152,46 +152,3 @@ do_mkfs (const char *fstype, const char *device)
free (err);
return 0;
}
-
-int
-do_sfdisk (const char *device, int cyls, int heads, int sectors,
- char * const* const lines)
-{
- FILE *fp;
- char buf[256];
- int i;
-
- IS_DEVICE (device, -1);
-
- /* Safe because of IS_DEVICE above. */
- strcpy (buf, "/sbin/sfdisk");
- if (cyls)
- sprintf (buf + strlen (buf), " -C %d", cyls);
- if (heads)
- sprintf (buf + strlen (buf), " -H %d", heads);
- if (sectors)
- sprintf (buf + strlen (buf), " -S %d", sectors);
- sprintf (buf + strlen (buf), " %s", device);
-
- fp = popen (buf, "w");
- if (fp == NULL) {
- reply_with_perror (buf);
- return -1;
- }
-
- for (i = 0; lines[i] != NULL; ++i) {
- if (fprintf (fp, "%s\n", lines[i]) < 0) {
- reply_with_perror (buf);
- fclose (fp);
- return -1;
- }
- }
-
- if (fclose (fp) == EOF) {
- reply_with_perror (buf);
- fclose (fp);
- return -1;
- }
-
- return 0;
-}
diff --git a/daemon/lvm.c b/daemon/lvm.c
index 326b5830..d1a6cd60 100644
--- a/daemon/lvm.c
+++ b/daemon/lvm.c
@@ -358,3 +358,21 @@ do_pvremove (const char *device)
free (err);
return 0;
}
+
+int
+do_pvresize (const char *device)
+{
+ char *err;
+ int r;
+
+ r = command (NULL, &err,
+ "/sbin/lvm", "pvresize", device, NULL);
+ if (r == -1) {
+ reply_with_error ("pvresize: %s: %s", device, err);
+ free (err);
+ return -1;
+ }
+
+ free (err);
+ return 0;
+}
diff --git a/daemon/sfdisk.c b/daemon/sfdisk.c
new file mode 100644
index 00000000..9d7a220f
--- /dev/null
+++ b/daemon/sfdisk.c
@@ -0,0 +1,130 @@
+/* libguestfs - the guestfsd daemon
+ * Copyright (C) 2009 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 <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <sys/stat.h>
+
+#include "daemon.h"
+#include "actions.h"
+
+static int
+sfdisk (const char *device, int n, int cyls, int heads, int sectors,
+ char * const* const lines)
+{
+ FILE *fp;
+ char buf[256];
+ int i;
+
+ IS_DEVICE (device, -1);
+
+ strcpy (buf, "/sbin/sfdisk --no-reread");
+ if (n > 0)
+ sprintf (buf + strlen (buf), " -N %d", n);
+ if (cyls)
+ sprintf (buf + strlen (buf), " -C %d", cyls);
+ if (heads)
+ sprintf (buf + strlen (buf), " -H %d", heads);
+ if (sectors)
+ sprintf (buf + strlen (buf), " -S %d", sectors);
+ /* Safe because of IS_DEVICE above: */
+ sprintf (buf + strlen (buf), " %s", device);
+
+ fp = popen (buf, "w");
+ if (fp == NULL) {
+ reply_with_perror (buf);
+ return -1;
+ }
+
+ for (i = 0; lines[i] != NULL; ++i) {
+ if (fprintf (fp, "%s\n", lines[i]) < 0) {
+ reply_with_perror (buf);
+ fclose (fp);
+ return -1;
+ }
+ }
+
+ if (fclose (fp) == EOF) {
+ reply_with_perror (buf);
+ fclose (fp);
+ return -1;
+ }
+
+ return 0;
+}
+
+int
+do_sfdisk (const char *device, int cyls, int heads, int sectors,
+ char * const* const lines)
+{
+ return sfdisk (device, 0, cyls, heads, sectors, lines);
+}
+
+int
+do_sfdisk_N (const char *device, int n, int cyls, int heads, int sectors,
+ const char *line)
+{
+ const char *lines[2] = { line, NULL };
+
+ return sfdisk (device, n, cyls, heads, sectors, lines);
+}
+
+static char *
+sfdisk_flag (const char *device, const char *flag)
+{
+ char *out, *err;
+ int r;
+
+ IS_DEVICE (device, NULL);
+
+ r = command (&out, &err, "/sbin/sfdisk", flag, device, NULL);
+ if (r == -1) {
+ reply_with_error ("sfdisk: %s: %s", device, err);
+ free (out);
+ free (err);
+ return NULL;
+ }
+
+ free (err);
+
+ return out; /* caller frees */
+}
+
+char *
+do_sfdisk_l (const char *device)
+{
+ return sfdisk_flag (device, "-l");
+}
+
+char *
+do_sfdisk_kernel_geometry (const char *device)
+{
+ return sfdisk_flag (device, "-g");
+}
+
+char *
+do_sfdisk_disk_geometry (const char *device)
+{
+ return sfdisk_flag (device, "-G");
+}
diff --git a/daemon/stubs.c b/daemon/stubs.c
index 212634fd..e80ba9be 100644
--- a/daemon/stubs.c
+++ b/daemon/stubs.c
@@ -2421,6 +2421,145 @@ done:
xdr_free ((xdrproc_t) xdr_guestfs_zerofree_args, (char *) &args);
}
+static void pvresize_stub (XDR *xdr_in)
+{
+ int r;
+ struct guestfs_pvresize_args args;
+ const char *device;
+
+ memset (&args, 0, sizeof args);
+
+ if (!xdr_guestfs_pvresize_args (xdr_in, &args)) {
+ reply_with_error ("%s: daemon failed to decode procedure arguments", "pvresize");
+ return;
+ }
+ device = args.device;
+
+ r = do_pvresize (device);
+ if (r == -1)
+ /* do_pvresize has already called reply_with_error */
+ goto done;
+
+ reply (NULL, NULL);
+done:
+ xdr_free ((xdrproc_t) xdr_guestfs_pvresize_args, (char *) &args);
+}
+
+static void sfdisk_N_stub (XDR *xdr_in)
+{
+ int r;
+ struct guestfs_sfdisk_N_args args;
+ const char *device;
+ int n;
+ int cyls;
+ int heads;
+ int sectors;
+ const char *line;
+
+ memset (&args, 0, sizeof args);
+
+ if (!xdr_guestfs_sfdisk_N_args (xdr_in, &args)) {
+ reply_with_error ("%s: daemon failed to decode procedure arguments", "sfdisk_N");
+ return;
+ }
+ device = args.device;
+ n = args.n;
+ cyls = args.cyls;
+ heads = args.heads;
+ sectors = args.sectors;
+ line = args.line;
+
+ r = do_sfdisk_N (device, n, cyls, heads, sectors, line);
+ if (r == -1)
+ /* do_sfdisk_N has already called reply_with_error */
+ goto done;
+
+ reply (NULL, NULL);
+done:
+ xdr_free ((xdrproc_t) xdr_guestfs_sfdisk_N_args, (char *) &args);
+}
+
+static void sfdisk_l_stub (XDR *xdr_in)
+{
+ char *r;
+ struct guestfs_sfdisk_l_args args;
+ const char *device;
+
+ memset (&args, 0, sizeof args);
+
+ if (!xdr_guestfs_sfdisk_l_args (xdr_in, &args)) {
+ reply_with_error ("%s: daemon failed to decode procedure arguments", "sfdisk_l");
+ return;
+ }
+ device = args.device;
+
+ r = do_sfdisk_l (device);
+ if (r == NULL)
+ /* do_sfdisk_l has already called reply_with_error */
+ goto done;
+
+ struct guestfs_sfdisk_l_ret ret;
+ ret.partitions = r;
+ reply ((xdrproc_t) &xdr_guestfs_sfdisk_l_ret, (char *) &ret);
+ free (r);
+done:
+ xdr_free ((xdrproc_t) xdr_guestfs_sfdisk_l_args, (char *) &args);
+}
+
+static void sfdisk_kernel_geometry_stub (XDR *xdr_in)
+{
+ char *r;
+ struct guestfs_sfdisk_kernel_geometry_args args;
+ const char *device;
+
+ memset (&args, 0, sizeof args);
+
+ if (!xdr_guestfs_sfdisk_kernel_geometry_args (xdr_in, &args)) {
+ reply_with_error ("%s: daemon failed to decode procedure arguments", "sfdisk_kernel_geometry");
+ return;
+ }
+ device = args.device;
+
+ r = do_sfdisk_kernel_geometry (device);
+ if (r == NULL)
+ /* do_sfdisk_kernel_geometry has already called reply_with_error */
+ goto done;
+
+ struct guestfs_sfdisk_kernel_geometry_ret ret;
+ ret.partitions = r;
+ reply ((xdrproc_t) &xdr_guestfs_sfdisk_kernel_geometry_ret, (char *) &ret);
+ free (r);
+done:
+ xdr_free ((xdrproc_t) xdr_guestfs_sfdisk_kernel_geometry_args, (char *) &args);
+}
+
+static void sfdisk_disk_geometry_stub (XDR *xdr_in)
+{
+ char *r;
+ struct guestfs_sfdisk_disk_geometry_args args;
+ const char *device;
+
+ memset (&args, 0, sizeof args);
+
+ if (!xdr_guestfs_sfdisk_disk_geometry_args (xdr_in, &args)) {
+ reply_with_error ("%s: daemon failed to decode procedure arguments", "sfdisk_disk_geometry");
+ return;
+ }
+ device = args.device;
+
+ r = do_sfdisk_disk_geometry (device);
+ if (r == NULL)
+ /* do_sfdisk_disk_geometry has already called reply_with_error */
+ goto done;
+
+ struct guestfs_sfdisk_disk_geometry_ret ret;
+ ret.partitions = r;
+ reply ((xdrproc_t) &xdr_guestfs_sfdisk_disk_geometry_ret, (char *) &ret);
+ free (r);
+done:
+ xdr_free ((xdrproc_t) xdr_guestfs_sfdisk_disk_geometry_args, (char *) &args);
+}
+
void dispatch_incoming_message (XDR *xdr_in)
{
switch (proc_nr) {
@@ -2715,6 +2854,21 @@ void dispatch_incoming_message (XDR *xdr_in)
case GUESTFS_PROC_ZEROFREE:
zerofree_stub (xdr_in);
break;
+ case GUESTFS_PROC_PVRESIZE:
+ pvresize_stub (xdr_in);
+ break;
+ case GUESTFS_PROC_SFDISK_N:
+ sfdisk_N_stub (xdr_in);
+ break;
+ case GUESTFS_PROC_SFDISK_L:
+ sfdisk_l_stub (xdr_in);
+ break;
+ case GUESTFS_PROC_SFDISK_KERNEL_GEOMETRY:
+ sfdisk_kernel_geometry_stub (xdr_in);
+ break;
+ case GUESTFS_PROC_SFDISK_DISK_GEOMETRY:
+ sfdisk_disk_geometry_stub (xdr_in);
+ break;
default:
reply_with_error ("dispatch_incoming_message: unknown procedure number %d", proc_nr);
}