diff options
author | Richard W.M. Jones <rjones@redhat.com> | 2012-09-04 08:58:21 +0100 |
---|---|---|
committer | Richard W.M. Jones <rjones@redhat.com> | 2012-09-04 10:02:53 +0100 |
commit | 4ed981bd5f0a158db3cfb87794628806bf00d443 (patch) | |
tree | 1f748577677c4a211a370fe0972b947c270196bd /src/info.c | |
parent | e388c4f3fd26c8756ac33e94b02f8435a0179bc1 (diff) | |
download | libguestfs-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.c | 63 |
1 files changed, 63 insertions, 0 deletions
@@ -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 |