diff options
author | Richard W.M. Jones <rjones@redhat.com> | 2012-03-07 17:30:48 +0000 |
---|---|---|
committer | Richard W.M. Jones <rjones@redhat.com> | 2012-03-07 18:36:46 +0000 |
commit | 518cdb596e3d1e75e30d8df8fff5835aa2842479 (patch) | |
tree | b4779e0cda78933f4e68b87c89b6c2869ad94214 | |
parent | 4d8ae8f5a2e309a6a518fdb0b6f65685aa9137e0 (diff) | |
download | libguestfs-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-- | .gitignore | 1 | ||||
-rw-r--r-- | examples/Makefile.am | 10 | ||||
-rw-r--r-- | examples/display_icon.c | 131 |
3 files changed, 141 insertions, 1 deletions
@@ -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); +} |