diff options
-rw-r--r-- | generator/generator_actions.ml | 8 | ||||
-rw-r--r-- | src/guestfs-internal.h | 2 | ||||
-rw-r--r-- | src/inspect.c | 2 | ||||
-rw-r--r-- | src/inspect_fs.c | 4 | ||||
-rw-r--r-- | src/inspect_fs_unix.c | 15 | ||||
-rw-r--r-- | src/inspect_icon.c | 61 |
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. * |