summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard W.M. Jones <rjones@redhat.com>2012-03-07 14:11:53 +0000
committerRichard W.M. Jones <rjones@redhat.com>2012-03-07 18:36:46 +0000
commitb9061ddf2d337fcc42cfeae0ac8ec4e329a1a421 (patch)
tree61823717fc45cc45ddef70ea78bed5552f6c8047
parentb106dda97c9e18563bb27a44a025016fef6dec97 (diff)
downloadlibguestfs-b9061ddf2d337fcc42cfeae0ac8ec4e329a1a421.tar.gz
libguestfs-b9061ddf2d337fcc42cfeae0ac8ec4e329a1a421.tar.xz
libguestfs-b9061ddf2d337fcc42cfeae0ac8ec4e329a1a421.zip
Add support for Buildroot and Cirros distributions.
-rw-r--r--generator/generator_actions.ml8
-rw-r--r--src/guestfs-internal.h2
-rw-r--r--src/inspect.c2
-rw-r--r--src/inspect_fs.c4
-rw-r--r--src/inspect_fs_unix.c15
-rw-r--r--src/inspect_icon.c61
6 files changed, 92 insertions, 0 deletions
diff --git a/generator/generator_actions.ml b/generator/generator_actions.ml
index 70ab359d..31b36cc9 100644
--- a/generator/generator_actions.ml
+++ b/generator/generator_actions.ml
@@ -791,10 +791,18 @@ Currently defined distros are:
Arch Linux.
+=item \"buildroot\"
+
+Buildroot-derived distro, but not one we specifically recognize.
+
=item \"centos\"
CentOS.
+=item \"cirros\"
+
+Cirros.
+
=item \"debian\"
Debian.
diff --git a/src/guestfs-internal.h b/src/guestfs-internal.h
index a72c320a..452a1b66 100644
--- a/src/guestfs-internal.h
+++ b/src/guestfs-internal.h
@@ -295,6 +295,8 @@ enum inspect_os_distro {
OS_DISTRO_TTYLINUX,
OS_DISTRO_MAGEIA,
OS_DISTRO_OPENSUSE,
+ OS_DISTRO_BUILDROOT,
+ OS_DISTRO_CIRROS,
};
enum inspect_os_package_format {
diff --git a/src/inspect.c b/src/inspect.c
index aeceed9f..46e1e4d5 100644
--- a/src/inspect.c
+++ b/src/inspect.c
@@ -219,7 +219,9 @@ guestfs__inspect_get_distro (guestfs_h *g, const char *root)
char *ret;
switch (fs->distro) {
case OS_DISTRO_ARCHLINUX: ret = safe_strdup (g, "archlinux"); break;
+ case OS_DISTRO_BUILDROOT: ret = safe_strdup (g, "buildroot"); break;
case OS_DISTRO_CENTOS: ret = safe_strdup (g, "centos"); break;
+ case OS_DISTRO_CIRROS: ret = safe_strdup (g, "cirros"); break;
case OS_DISTRO_DEBIAN: ret = safe_strdup (g, "debian"); break;
case OS_DISTRO_FEDORA: ret = safe_strdup (g, "fedora"); break;
case OS_DISTRO_GENTOO: ret = safe_strdup (g, "gentoo"); break;
diff --git a/src/inspect_fs.c b/src/inspect_fs.c
index fa7aaa84..211f94df 100644
--- a/src/inspect_fs.c
+++ b/src/inspect_fs.c
@@ -422,6 +422,8 @@ check_package_format (guestfs_h *g, struct inspect_fs *fs)
case OS_DISTRO_SLACKWARE:
case OS_DISTRO_TTYLINUX:
case OS_DISTRO_WINDOWS:
+ case OS_DISTRO_BUILDROOT:
+ case OS_DISTRO_CIRROS:
case OS_DISTRO_UNKNOWN:
default:
fs->package_format = OS_PACKAGE_FORMAT_UNKNOWN;
@@ -475,6 +477,8 @@ check_package_management (guestfs_h *g, struct inspect_fs *fs)
case OS_DISTRO_SLACKWARE:
case OS_DISTRO_TTYLINUX:
case OS_DISTRO_WINDOWS:
+ case OS_DISTRO_BUILDROOT:
+ case OS_DISTRO_CIRROS:
case OS_DISTRO_UNKNOWN:
default:
fs->package_management = OS_PACKAGE_MANAGEMENT_UNKNOWN;
diff --git a/src/inspect_fs_unix.c b/src/inspect_fs_unix.c
index f34075d5..252cce3c 100644
--- a/src/inspect_fs_unix.c
+++ b/src/inspect_fs_unix.c
@@ -464,7 +464,22 @@ guestfs___check_linux_root (guestfs_h *g, struct inspect_fs *fs)
if (guestfs___parse_major_minor (g, fs) == -1)
return -1;
}
+ /* Buildroot (http://buildroot.net) is an embedded Linux distro
+ * toolkit. It is used by specific distros such as Cirros.
+ */
+ else if (guestfs_exists (g, "/etc/br-version") > 0) {
+ if (guestfs_exists (g, "/usr/share/cirros/logo") > 0)
+ fs->distro = OS_DISTRO_CIRROS;
+ else
+ fs->distro = OS_DISTRO_BUILDROOT;
+
+ /* /etc/br-version has the format YYYY.MM[-git/hg/svn release] */
+ if (parse_release_file (g, fs, "/etc/br-version") == -1)
+ return -1;
+ if (guestfs___parse_major_minor (g, fs) == -1)
+ return -1;
+ }
skip_release_checks:;
diff --git a/src/inspect_icon.c b/src/inspect_icon.c
index 5c3628ab..3a29c47d 100644
--- a/src/inspect_icon.c
+++ b/src/inspect_icon.c
@@ -56,6 +56,7 @@ static char *icon_debian (guestfs_h *g, struct inspect_fs *fs, size_t *size_r);
static char *icon_ubuntu (guestfs_h *g, struct inspect_fs *fs, size_t *size_r);
static char *icon_mageia (guestfs_h *g, struct inspect_fs *fs, size_t *size_r);
static char *icon_opensuse (guestfs_h *g, struct inspect_fs *fs, size_t *size_r);
+static char *icon_cirros (guestfs_h *g, struct inspect_fs *fs, size_t *size_r);
static char *icon_windows (guestfs_h *g, struct inspect_fs *fs, size_t *size_r);
/* Dummy static object. */
@@ -142,8 +143,13 @@ guestfs__inspect_get_icon (guestfs_h *g, const char *root, size_t *size_r,
r = icon_opensuse (g, fs, &size);
break;
+ case OS_DISTRO_CIRROS:
+ r = icon_cirros (g, fs, &size);
+ break;
+
/* These are just to keep gcc warnings happy. */
case OS_DISTRO_ARCHLINUX:
+ case OS_DISTRO_BUILDROOT:
case OS_DISTRO_GENTOO:
case OS_DISTRO_LINUX_MINT:
case OS_DISTRO_MANDRIVA:
@@ -325,6 +331,61 @@ icon_opensuse (guestfs_h *g, struct inspect_fs *fs, size_t *size_r)
return get_png (g, fs, OPENSUSE_ICON, size_r, 2048);
}
+/* Cirros's logo is a text file! */
+#define CIRROS_LOGO "/usr/share/cirros/logo"
+
+static char *
+icon_cirros (guestfs_h *g, struct inspect_fs *fs, size_t *size_r)
+{
+ char *ret = NOT_FOUND;
+ char *type = NULL;
+ char *local = NULL;
+ char *pngfile = NULL;
+ char *cmd = NULL;
+ int r;
+
+ r = guestfs_exists (g, CIRROS_LOGO);
+ if (r == -1) {
+ ret = NULL; /* a real error */
+ goto out;
+ }
+ if (r == 0) goto out;
+
+ /* Check the file type and geometry. */
+ type = guestfs_file (g, CIRROS_LOGO);
+ if (!type) goto out;
+
+ if (!STRPREFIX (type, "ASCII text")) goto out;
+
+ local = guestfs___download_to_tmp (g, fs, CIRROS_LOGO, "icon", 1024);
+ if (!local) goto out;
+
+ /* Use pbmtext to render it. */
+ pngfile = safe_asprintf (g, "%s/cirros.png", g->tmpdir);
+
+ cmd = safe_asprintf (g, "pbmtext < %s | pnmtopng > %s",
+ local, pngfile);
+ r = system (cmd);
+ if (r == -1 || WEXITSTATUS (r) != 0) {
+ debug (g, "external command failed: %s", cmd);
+ goto out;
+ }
+
+ /* Read it into memory. */
+ if (read_whole_file (g, pngfile, &ret, size_r) == -1) {
+ ret = NULL;
+ goto out;
+ }
+
+ out:
+ free (pngfile);
+ free (cmd);
+ free (local);
+ free (type);
+
+ return ret;
+}
+
/* Windows, as usual, has to be much more complicated and stupid than
* anything else.
*