summaryrefslogtreecommitdiffstats
path: root/src/info.c
diff options
context:
space:
mode:
authorRichard W.M. Jones <rjones@redhat.com>2012-09-04 08:58:21 +0100
committerRichard W.M. Jones <rjones@redhat.com>2012-09-04 10:02:53 +0100
commit4ed981bd5f0a158db3cfb87794628806bf00d443 (patch)
tree1f748577677c4a211a370fe0972b947c270196bd /src/info.c
parente388c4f3fd26c8756ac33e94b02f8435a0179bc1 (diff)
downloadlibguestfs-4ed981bd5f0a158db3cfb87794628806bf00d443.tar.gz
libguestfs-4ed981bd5f0a158db3cfb87794628806bf00d443.tar.xz
libguestfs-4ed981bd5f0a158db3cfb87794628806bf00d443.zip
New APIs: disk-virtual-size and disk-has-backing-file.
Diffstat (limited to 'src/info.c')
-rw-r--r--src/info.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/info.c b/src/info.c
index 3eb7d2fd..9185cecc 100644
--- a/src/info.c
+++ b/src/info.c
@@ -20,6 +20,8 @@
#include <stdio.h>
#include <stdlib.h>
+#include <stdint.h>
+#include <inttypes.h>
#include <limits.h>
#include <fcntl.h>
#include <unistd.h>
@@ -37,6 +39,8 @@
static int run_qemu_img_info (guestfs_h *g, const char *filename, int (*fn) (guestfs_h *g, char *line, void *data), void *data);
static int check_disk_format (guestfs_h *h, char *line, void *data);
+static int check_disk_virtual_size (guestfs_h *h, char *line, void *data);
+static int check_disk_has_backing_file (guestfs_h *h, char *line, void *data);
char *
guestfs__disk_format (guestfs_h *g, const char *filename)
@@ -73,6 +77,65 @@ check_disk_format (guestfs_h *g, char *line, void *retpv)
return 1; /* continue processing */
}
+int64_t
+guestfs__disk_virtual_size (guestfs_h *g, const char *filename)
+{
+ int64_t ret = -1;
+
+ if (run_qemu_img_info (g, filename, check_disk_virtual_size, &ret) == -1)
+ return -1;
+
+ if (ret == -1)
+ error (g, _("%s: cannot detect virtual size of disk image"), filename);
+
+ return ret;
+}
+
+static int
+check_disk_virtual_size (guestfs_h *g, char *line, void *retpv)
+{
+ int64_t *retp = retpv;
+ char *p;
+
+ if (STRPREFIX (line, "virtual size: ")) {
+ /* "virtual size: 500M (524288000 bytes)\n" */
+ p = &line[14];
+ p = strchr (p, ' ');
+ if (!p || p[1] != '(' || sscanf (&p[2], "%" SCNi64, retp) != 1) {
+ error (g, _("cannot parse output of qemu-img info: '%s'"),
+ line);
+ return -1;
+ }
+ return 0; /* finish processing */
+ }
+
+ return 1; /* continue processing */
+}
+
+int
+guestfs__disk_has_backing_file (guestfs_h *g, const char *filename)
+{
+ int ret = 0;
+
+ if (run_qemu_img_info (g, filename, check_disk_has_backing_file, &ret) == -1)
+ return -1;
+
+ return ret;
+}
+
+static int
+check_disk_has_backing_file (guestfs_h *g, char *line, void *retpv)
+{
+ int *retp = retpv;
+
+ if (STRPREFIX (line, "backing file: ")) {
+ *retp = 1;
+ return 0; /* finish processing */
+ }
+
+ return 1; /* continue processing */
+}
+
/* It's hard to use 'qemu-img info' safely. See:
* https://lists.gnu.org/archive/html/qemu-devel/2012-09/msg00137.html
* Eventually we should switch to the JSON output format, when it