diff options
author | Richard Jones <rjones@redhat.com> | 2009-04-15 17:47:34 +0100 |
---|---|---|
committer | Richard Jones <rjones@redhat.com> | 2009-04-15 17:47:34 +0100 |
commit | e038597ebd1e43c83a8ddde21c4f1898eb7a9a98 (patch) | |
tree | dcd476dbd7b0b3f8b1501995c98b70f641c5eb70 /daemon | |
parent | 706c75629733d05a891a81eebe373d124409cfb8 (diff) | |
download | libguestfs-e038597ebd1e43c83a8ddde21c4f1898eb7a9a98.tar.gz libguestfs-e038597ebd1e43c83a8ddde21c4f1898eb7a9a98.tar.xz libguestfs-e038597ebd1e43c83a8ddde21c4f1898eb7a9a98.zip |
Added blockdev_* calls. RInt64 type. Enhanced tests.
Diffstat (limited to 'daemon')
-rw-r--r-- | daemon/Makefile.am | 1 | ||||
-rw-r--r-- | daemon/blockdev.c | 144 |
2 files changed, 145 insertions, 0 deletions
diff --git a/daemon/Makefile.am b/daemon/Makefile.am index 6da149be..75de0663 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am @@ -21,6 +21,7 @@ noinst_PROGRAMS = guestfsd guestfsd_SOURCES = \ actions.h \ augeas.c \ + blockdev.c \ command.c \ daemon.h \ devsparts.c \ diff --git a/daemon/blockdev.c b/daemon/blockdev.c new file mode 100644 index 00000000..094ad5e6 --- /dev/null +++ b/daemon/blockdev.c @@ -0,0 +1,144 @@ +/* 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 <stdint.h> +#include <inttypes.h> +#include <unistd.h> + +#include "daemon.h" +#include "actions.h" + +/* These functions are all about using the blockdev command, so + * we centralize it in one call. + */ +static int64_t +call_blockdev (const char *device, const char *switc, int extraarg, int prints) +{ + int r; + int64_t rv; + char *out, *err; + const char *argv[] = { + "/sbin/blockdev", + switc, + NULL, + NULL, + NULL + }; + char buf[64]; + + IS_DEVICE (device, -1); + + if (extraarg > 0) { + snprintf (buf, sizeof buf, "%d", extraarg); + argv[2] = buf; + argv[3] = device; + } else + argv[2] = device; + + r = commandv (&out, &err, argv); + + if (r == -1) { + reply_with_error ("%s: %s", argv[0], err); + free (err); + free (out); + return -1; + } + + rv = 0; + + if (prints) { + if (sscanf (out, "%" SCNi64, &rv) != 1) { + reply_with_error ("%s: expected output, but got nothing"); + free (out); + return -1; + } + } + + free (out); + + return rv; +} + +int +do_blockdev_setro (const char *device) +{ + return (int) call_blockdev (device, "--setro", 0, 0); +} + +int +do_blockdev_setrw (const char *device) +{ + return (int) call_blockdev (device, "--setrw", 0, 0); +} + +int +do_blockdev_getro (const char *device) +{ + return (int) call_blockdev (device, "--getro", 0, 1); +} + +int +do_blockdev_getss (const char *device) +{ + return (int) call_blockdev (device, "--getss", 0, 1); +} + +int +do_blockdev_getbsz (const char *device) +{ + return (int) call_blockdev (device, "--getbsz", 0, 1); +} + +int +do_blockdev_setbsz (const char *device, int blocksize) +{ + if (blocksize <= 0 /* || blocksize >= what? */) { + reply_with_error ("blockdev_setbsz: blocksize must be > 0"); + return -1; + } + return (int) call_blockdev (device, "--setbsz", blocksize, 0); +} + +int64_t +do_blockdev_getsz (const char *device) +{ + return call_blockdev (device, "--getsz", 0, 1); +} + +int64_t +do_blockdev_getsize64 (const char *device) +{ + return call_blockdev (device, "--getsize64", 0, 1); +} + +int +do_blockdev_flushbufs (const char *device) +{ + return call_blockdev (device, "--flushbufs", 0, 0); +} + +int +do_blockdev_rereadpt (const char *device) +{ + return call_blockdev (device, "--rereadpt", 0, 0); +} |