summaryrefslogtreecommitdiffstats
path: root/examples/to-xml.c
diff options
context:
space:
mode:
authorRichard Jones <rjones@redhat.com>2009-04-22 15:27:42 +0100
committerRichard Jones <rjones@redhat.com>2009-04-22 15:27:42 +0100
commit92c2c33d6162ae0781be47472051305bae332252 (patch)
tree2bf97d9fce7ef2fe97bbedd01af6500b621606c2 /examples/to-xml.c
parenta8d25362435121ada85656c08cd79642f79f9f7b (diff)
downloadlibguestfs-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.c18
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");