X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=examples%2Fto-xml.c;h=d6422e080dd5ed752d1c80a3dd17dd20e4aef7ce;hp=eba3a7a3d6d8ebb8ee8289ad1a42cb9f62936f13;hb=d43dac69483e8ec62e8356d93f761684ce2f5cc8;hpb=7fe2b338e4102a23ecd2f89b447b7618f0e93312 diff --git a/examples/to-xml.c b/examples/to-xml.c index eba3a7a..d6422e0 100644 --- a/examples/to-xml.c +++ b/examples/to-xml.c @@ -10,7 +10,10 @@ #include #include #include +#include +#include #include +#include #include @@ -23,6 +26,7 @@ static void display_partition (guestfs_h *g, const char *dev); static void display_partitions (guestfs_h *g, const char *dev); +static void display_ext234 (guestfs_h *g, const char *dev, const char *fstype); int main (int argc, char *argv[]) @@ -55,8 +59,10 @@ main (int argc, char *argv[]) CALL (devices = guestfs_list_devices (g), NULL); printf ("\n"); for (i = 0; devices[i] != NULL; ++i) { - printf ("\n", devices[i]); - display_partition (g, devices[i]); + int64_t size; + CALL (size = guestfs_blockdev_getsize64 (g, devices[i]), -1); + printf ("\n", devices[i], size); + display_partitions (g, devices[i]); free (devices[i]); printf ("\n"); } @@ -82,7 +88,9 @@ main (int argc, char *argv[]) if (strncmp (lvs[j], "/dev/", 5) == 0 && strncmp (&lvs[j][5], vgs[i], len) == 0 && lvs[j][len+5] == '/') { - printf ("\n", lvs[j]); + int64_t size; + CALL (size = guestfs_blockdev_getsize64 (g, lvs[j]), -1); + printf ("\n", lvs[j], size); display_partition (g, lvs[j]); printf ("\n"); free (lvs[j]); @@ -110,14 +118,21 @@ 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 ("\n"); + else if (strstr (what, "boot sector") != NULL) display_partitions (g, dev); else if (strncmp (what, "LVM2", 4) == 0) printf ("\n"); - else if (strstr (what, "ext2 filesystem data") == 0) - printf ("\n"); - else if (strstr (what, "ext3 filesystem data") == 0) - printf ("\n"); + else if (strstr (what, "ext2 filesystem data") != NULL) + display_ext234 (g, dev, "ext2"); + else if (strstr (what, "ext3 filesystem data") != NULL) + display_ext234 (g, dev, "ext3"); + else if (strstr (what, "ext4 filesystem data") != NULL) + display_ext234 (g, dev, "ext4"); + else if (strstr (what, "Linux/i386 swap file") != NULL) + printf ("\n"); else printf ("\n"); @@ -128,11 +143,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 ("\n", dev); return; } @@ -146,7 +161,9 @@ display_partitions (guestfs_h *g, const char *dev) for (i = 0; parts[i] != NULL; ++i) { /* Only display partition if it's in the device. */ if (strncmp (parts[i], dev, len) == 0) { - printf ("\n", parts[i]); + int64_t size; + CALL (size = guestfs_blockdev_getsize64 (g, parts[i]), -1); + printf ("\n", parts[i], size); display_partition (g, parts[i]); printf ("\n"); } @@ -156,3 +173,30 @@ display_partitions (guestfs_h *g, const char *dev) free (parts); printf ("\n"); } + +/* Display some details on the ext2/3/4 filesystem on dev. */ +static void +display_ext234 (guestfs_h *g, const char *dev, const char *fstype) +{ + char **sbfields; + int i; + + printf ("\n", fstype); + CALL (sbfields = guestfs_tune2fs_l (g, dev), NULL); + + for (i = 0; sbfields[i] != NULL; i += 2) { + /* Just pick out a few important fields to display. There + * is much more that could be displayed here. + */ + if (strcmp (sbfields[i], "Filesystem UUID") == 0) + printf ("%s\n", sbfields[i+1]); + else if (strcmp (sbfields[i], "Block size") == 0) + printf ("%s\n", sbfields[i+1]); + + free (sbfields[i]); + free (sbfields[i+1]); + } + free (sbfields); + + printf ("\n"); +}