diff options
author | Richard Jones <rjones@redhat.com> | 2009-04-22 15:27:42 +0100 |
---|---|---|
committer | Richard Jones <rjones@redhat.com> | 2009-04-22 15:27:42 +0100 |
commit | 92c2c33d6162ae0781be47472051305bae332252 (patch) | |
tree | 2bf97d9fce7ef2fe97bbedd01af6500b621606c2 /examples/to-xml.c | |
parent | a8d25362435121ada85656c08cd79642f79f9f7b (diff) | |
download | libguestfs-92c2c33d6162ae0781be47472051305bae332252.tar.gz libguestfs-92c2c33d6162ae0781be47472051305bae332252.tar.xz libguestfs-92c2c33d6162ae0781be47472051305bae332252.zip |
Fix infinite loop encountered when reading Windows disk in example program.
Diffstat (limited to 'examples/to-xml.c')
-rw-r--r-- | examples/to-xml.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/examples/to-xml.c b/examples/to-xml.c index b438d344..5c438f32 100644 --- a/examples/to-xml.c +++ b/examples/to-xml.c @@ -13,6 +13,7 @@ #include <stdint.h> #include <inttypes.h> #include <unistd.h> +#include <ctype.h> #include <guestfs.h> @@ -61,7 +62,7 @@ main (int argc, char *argv[]) int64_t size; CALL (size = guestfs_blockdev_getsize64 (g, devices[i]), -1); printf ("<device dev=\"%s\" size=\"%" PRIi64 "\">\n", devices[i], size); - display_partition (g, devices[i]); + display_partitions (g, devices[i]); free (devices[i]); printf ("</device>\n"); } @@ -117,7 +118,10 @@ display_partition (guestfs_h *g, const char *dev) CALL (what = guestfs_file (g, dev), NULL); - if (strstr (what, "boot sector") != NULL) + if (strcmp (what, "x86 boot sector") == 0) + /* This is what 'file' program shows for Windows/NTFS partitions. */ + printf ("<windows/>\n"); + else if (strstr (what, "boot sector") != NULL) display_partitions (g, dev); else if (strncmp (what, "LVM2", 4) == 0) printf ("<physvol/>\n"); @@ -137,11 +141,11 @@ display_partition (guestfs_h *g, const char *dev) static void display_partitions (guestfs_h *g, const char *dev) { - /* We can't look into a boot sector which is an LV. That's - * a limitation of sorts of the Linux kernel. (Actually, we - * could do this if we add the kpartx program to libguestfs). + /* We can't look into a boot sector which is an LV or partition. + * That's a limitation of sorts of the Linux kernel. (Actually, + * we could do this if we add the kpartx program to libguestfs). */ - if (strncmp (dev, "/dev/sd", 7) != 0) { + if (strncmp (dev, "/dev/sd", 7) != 0 || isdigit (dev[strlen(dev)-1])) { printf ("<vm-image dev=\"%s\"/>\n", dev); return; } @@ -156,7 +160,7 @@ display_partitions (guestfs_h *g, const char *dev) /* Only display partition if it's in the device. */ if (strncmp (parts[i], dev, len) == 0) { int64_t size; - CALL (size = guestfs_blockdev_getsize64 (g, dev), -1); + CALL (size = guestfs_blockdev_getsize64 (g, parts[i]), -1); printf ("<partition dev=\"%s\" size=\"%" PRIi64 "\">\n", parts[i], size); display_partition (g, parts[i]); printf ("</partition>\n"); |