summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard W.M. Jones <rjones@redhat.com>2012-03-07 17:30:48 +0000
committerRichard W.M. Jones <rjones@redhat.com>2012-03-07 18:36:46 +0000
commit518cdb596e3d1e75e30d8df8fff5835aa2842479 (patch)
treeb4779e0cda78933f4e68b87c89b6c2869ad94214
parent4d8ae8f5a2e309a6a518fdb0b6f65685aa9137e0 (diff)
downloadlibguestfs-518cdb596e3d1e75e30d8df8fff5835aa2842479.tar.gz
libguestfs-518cdb596e3d1e75e30d8df8fff5835aa2842479.tar.xz
libguestfs-518cdb596e3d1e75e30d8df8fff5835aa2842479.zip
Add 'display_icon' example program.
Running this on a disk image displays the guest icon (using external 'display' program).
-rw-r--r--.gitignore1
-rw-r--r--examples/Makefile.am10
-rw-r--r--examples/display_icon.c131
3 files changed, 141 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore
index db2ba9d1..3e371631 100644
--- a/.gitignore
+++ b/.gitignore
@@ -74,6 +74,7 @@ erlang/examples/stamp-guestfs-erlang.pod
erlang/guestfs.beam
erlang/guestfs.erl
examples/create_disk
+examples/display_icon
examples/guestfs-examples.3
examples/guestfs-recipes.1
examples/guestfs-testing.1
diff --git a/examples/Makefile.am b/examples/Makefile.am
index 7577d636..ef4a581a 100644
--- a/examples/Makefile.am
+++ b/examples/Makefile.am
@@ -26,7 +26,7 @@ CLEANFILES = \
stamp-guestfs-recipes.pod \
stamp-guestfs-testing.pod
-noinst_PROGRAMS = create_disk inspect_vm
+noinst_PROGRAMS = create_disk display_icon inspect_vm
if HAVE_HIVEX
noinst_PROGRAMS += virt-dhcp-address
endif
@@ -39,6 +39,14 @@ create_disk_CFLAGS = \
create_disk_LDADD = \
$(top_builddir)/src/libguestfs.la
+display_icon_SOURCES = display_icon.c
+display_icon_CFLAGS = \
+ -DGUESTFS_WARN_DEPRECATED=1 \
+ -I$(top_srcdir)/src -I$(top_builddir)/src \
+ $(WARN_CFLAGS) $(WERROR_CFLAGS)
+display_icon_LDADD = \
+ $(top_builddir)/src/libguestfs.la
+
inspect_vm_SOURCES = inspect_vm.c
inspect_vm_CFLAGS = \
-DGUESTFS_WARN_DEPRECATED=1 \
diff --git a/examples/display_icon.c b/examples/display_icon.c
new file mode 100644
index 00000000..5166a7b7
--- /dev/null
+++ b/examples/display_icon.c
@@ -0,0 +1,131 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <guestfs.h>
+
+static int
+compare_keys_len (const void *p1, const void *p2)
+{
+ const char *key1 = * (char * const *) p1;
+ const char *key2 = * (char * const *) p2;
+ return strlen (key1) - strlen (key2);
+}
+
+static size_t
+count_strings (char *const *argv)
+{
+ size_t c;
+
+ for (c = 0; argv[c]; ++c)
+ ;
+ return c;
+}
+
+int
+main (int argc, char *argv[])
+{
+ guestfs_h *g;
+ const char *disk;
+ char **roots, *root, **mountpoints, *icon;
+ size_t i, j, icon_size;
+ FILE *fp;
+
+ if (argc != 2) {
+ fprintf (stderr, "usage: display_icon disk.img\n");
+ exit (EXIT_FAILURE);
+ }
+ disk = argv[1];
+
+ g = guestfs_create ();
+ if (g == NULL) {
+ perror ("failed to create libguestfs handle");
+ exit (EXIT_FAILURE);
+ }
+
+ /* Attach the disk image read-only to libguestfs. */
+ if (guestfs_add_drive_opts (g, disk,
+ /* GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw", */
+ GUESTFS_ADD_DRIVE_OPTS_READONLY, 1,
+ -1) /* this marks end of optional arguments */
+ == -1)
+ exit (EXIT_FAILURE);
+
+ /* Run the libguestfs back-end. */
+ if (guestfs_launch (g) == -1)
+ exit (EXIT_FAILURE);
+
+ /* Ask libguestfs to inspect for operating systems. */
+ roots = guestfs_inspect_os (g);
+ if (roots == NULL)
+ exit (EXIT_FAILURE);
+ if (roots[0] == NULL) {
+ fprintf (stderr, "display_icon: no operating systems found\n");
+ exit (EXIT_FAILURE);
+ }
+
+ for (j = 0; roots[j] != NULL; ++j) {
+ root = roots[j];
+
+ /* Mount up the disks, like guestfish -i.
+ *
+ * Sort keys by length, shortest first, so that we end up
+ * mounting the filesystems in the correct order.
+ */
+ mountpoints = guestfs_inspect_get_mountpoints (g, root);
+ if (mountpoints == NULL)
+ exit (EXIT_FAILURE);
+
+ qsort (mountpoints, count_strings (mountpoints) / 2, 2 * sizeof (char *),
+ compare_keys_len);
+ for (i = 0; mountpoints[i] != NULL; i += 2) {
+ /* Ignore failures from this call, since bogus entries can
+ * appear in the guest's /etc/fstab.
+ */
+ guestfs_mount_ro (g, mountpoints[i+1], mountpoints[i]);
+ free (mountpoints[i]);
+ free (mountpoints[i+1]);
+ }
+ free (mountpoints);
+
+ /* Get the icon.
+ * This function returns a buffer ('icon'). Normally it is a png
+ * file, returned as a string, but it can also be a zero length
+ * buffer which has a special meaning, or NULL which means there
+ * was an error.
+ */
+ icon = guestfs_inspect_get_icon (g, root, &icon_size, -1);
+ if (!icon) /* actual libguestfs error */
+ exit (EXIT_FAILURE);
+ if (icon_size == 0) /* no icon available */
+ fprintf (stderr, "%s: %s: no icon available for this operating system\n",
+ disk, root);
+ else {
+ /* Display the icon. */
+ fp = popen ("display -", "w");
+ if (fp == NULL) {
+ perror ("display");
+ exit (EXIT_FAILURE);
+ }
+ if (fwrite (icon, 1, icon_size, fp) != icon_size) {
+ perror ("write");
+ exit (EXIT_FAILURE);
+ }
+ if (pclose (fp) == -1) {
+ perror ("pclose");
+ exit (EXIT_FAILURE);
+ }
+ }
+ free (icon);
+
+ /* Unmount everything. */
+ if (guestfs_umount_all (g) == -1)
+ exit (EXIT_FAILURE);
+
+ free (root);
+ }
+ free (roots);
+
+ guestfs_close (g);
+
+ exit (EXIT_SUCCESS);
+}