Add a basic support for identifying Minix, extracting its version and hostname. Related to RHBZ#1144137. --- src/guestfs-internal.h | 2 ++ src/inspect-apps.c | 1 + src/inspect-fs-unix.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/inspect-fs.c | 11 ++++++++++ src/inspect-icon.c | 1 + src/inspect.c | 1 + 6 files changed, 73 insertions(+) diff --git a/src/guestfs-internal.h b/src/guestfs-internal.h index 69ea2dc..fd0c4a1 100644 --- a/src/guestfs-internal.h +++ b/src/guestfs-internal.h @@ -513,6 +513,7 @@ enum inspect_os_type { OS_TYPE_HURD, OS_TYPE_DOS, OS_TYPE_OPENBSD, + OS_TYPE_MINIX, }; enum inspect_os_distro { @@ -758,6 +759,7 @@ extern int guestfs___check_linux_root (guestfs_h *g, struct inspect_fs *fs); extern int guestfs___check_freebsd_root (guestfs_h *g, struct inspect_fs *fs); extern int guestfs___check_netbsd_root (guestfs_h *g, struct inspect_fs *fs); extern int guestfs___check_hurd_root (guestfs_h *g, struct inspect_fs *fs); +extern int guestfs___check_minix_root (guestfs_h *g, struct inspect_fs *fs); /* inspect-fs-windows.c */ extern char *guestfs___case_sensitive_path_silently (guestfs_h *g, const char *); diff --git a/src/inspect-apps.c b/src/inspect-apps.c index c199238..a77e9ce 100644 --- a/src/inspect-apps.c +++ b/src/inspect-apps.c @@ -157,6 +157,7 @@ guestfs__inspect_list_applications2 (guestfs_h *g, const char *root) break; case OS_TYPE_FREEBSD: + case OS_TYPE_MINIX: case OS_TYPE_NETBSD: case OS_TYPE_DOS: case OS_TYPE_OPENBSD: diff --git a/src/inspect-fs-unix.c b/src/inspect-fs-unix.c index 89236ab..3f57cd5 100644 --- a/src/inspect-fs-unix.c +++ b/src/inspect-fs-unix.c @@ -77,6 +77,7 @@ static pcre *re_nld; static pcre *re_opensuse_version; static pcre *re_sles_version; static pcre *re_sles_patchlevel; +static pcre *re_minix; static void compile_regexps (void) __attribute__((constructor)); static void free_regexps (void) __attribute__((destructor)); @@ -135,6 +136,7 @@ compile_regexps (void) COMPILE (re_opensuse_version, "^VERSION = (\\d+)\\.(\\d+)", 0); COMPILE (re_sles_version, "^VERSION = (\\d+)", 0); COMPILE (re_sles_patchlevel, "^PATCHLEVEL = (\\d+)", 0); + COMPILE (re_minix, "^(\\d+)\\.(\\d+)(\\.(\\d+))?", 0); } static void @@ -167,6 +169,7 @@ free_regexps (void) pcre_free (re_opensuse_version); pcre_free (re_sles_version); pcre_free (re_sles_patchlevel); + pcre_free (re_minix); } static void check_architecture (guestfs_h *g, struct inspect_fs *fs); @@ -782,6 +785,48 @@ guestfs___check_hurd_root (guestfs_h *g, struct inspect_fs *fs) return 0; } +/* The currently mounted device is maybe to be a Minix root. */ +int +guestfs___check_minix_root (guestfs_h *g, struct inspect_fs *fs) +{ + fs->type = OS_TYPE_MINIX; + + if (guestfs_is_file_opts (g, "/etc/version", + GUESTFS_IS_FILE_OPTS_FOLLOWSYMLINKS, 1, -1) > 0) { + char *major, *minor; + if (parse_release_file (g, fs, "/etc/version") == -1) + return -1; + + if (match2 (g, fs->product_name, re_minix, &major, &minor)) { + fs->major_version = guestfs___parse_unsigned_int (g, major); + free (major); + if (fs->major_version == -1) { + free (minor); + return -1; + } + fs->minor_version = guestfs___parse_unsigned_int (g, minor); + free (minor); + if (fs->minor_version == -1) + return -1; + } + } else { + return -1; + } + + /* Determine the architecture. */ + check_architecture (g, fs); + + /* TODO: enable fstab inspection once resolve_fstab_device implements + * the proper mapping from the Minix device names to the appliance names + */ + + /* Determine hostname. */ + if (check_hostname_unix (g, fs) == -1) + return -1; + + return 0; +} + static void check_architecture (guestfs_h *g, struct inspect_fs *fs) { @@ -863,6 +908,18 @@ check_hostname_unix (guestfs_h *g, struct inspect_fs *fs) } break; + case OS_TYPE_MINIX: + if (guestfs_is_file (g, "/etc/hostname.file")) { + fs->hostname = guestfs___first_line_of_file (g, "/etc/hostname.file"); + if (fs->hostname == NULL) + return -1; + if (STREQ (fs->hostname, "")) { + free (fs->hostname); + fs->hostname = NULL; + } + } + break; + case OS_TYPE_WINDOWS: /* not here, see check_windows_system_registry */ case OS_TYPE_DOS: case OS_TYPE_OPENBSD: diff --git a/src/inspect-fs.c b/src/inspect-fs.c index 21d2a23..539d814 100644 --- a/src/inspect-fs.c +++ b/src/inspect-fs.c @@ -247,6 +247,17 @@ check_filesystem (guestfs_h *g, const char *mountable, if (guestfs___check_hurd_root (g, fs) == -1) return -1; } + /* Minix root? */ + else if (is_dir_etc && + is_dir_bin && + guestfs_is_file (g, "/service/vm") > 0 && + guestfs_is_file (g, "/etc/fstab") > 0 && + guestfs_is_file (g, "/etc/version") > 0) { + fs->is_root = 1; + fs->format = OS_FORMAT_INSTALLED; + if (guestfs___check_minix_root (g, fs) == -1) + return -1; + } /* Linux root? */ else if (is_dir_etc && (is_dir_bin || diff --git a/src/inspect-icon.c b/src/inspect-icon.c index 94b63a2..0ffca72 100644 --- a/src/inspect-icon.c +++ b/src/inspect-icon.c @@ -197,6 +197,7 @@ guestfs__inspect_get_icon (guestfs_h *g, const char *root, size_t *size_r, case OS_TYPE_NETBSD: case OS_TYPE_DOS: case OS_TYPE_OPENBSD: + case OS_TYPE_MINIX: case OS_TYPE_UNKNOWN: ; /* nothing */ } diff --git a/src/inspect.c b/src/inspect.c index 1a9554e..9248b06 100644 --- a/src/inspect.c +++ b/src/inspect.c @@ -118,6 +118,7 @@ guestfs__inspect_get_type (guestfs_h *g, const char *root) case OS_TYPE_FREEBSD: ret = safe_strdup (g, "freebsd"); break; case OS_TYPE_HURD: ret = safe_strdup (g, "hurd"); break; case OS_TYPE_LINUX: ret = safe_strdup (g, "linux"); break; + case OS_TYPE_MINIX: ret = safe_strdup (g, "minix"); break; case OS_TYPE_NETBSD: ret = safe_strdup (g, "netbsd"); break; case OS_TYPE_OPENBSD: ret = safe_strdup (g, "openbsd"); break; case OS_TYPE_WINDOWS: ret = safe_strdup (g, "windows"); break; -- 1.9.3
Richard W.M. Jones
2014-Sep-23 07:52 UTC
Re: [Libguestfs] [PATCH] inspect: basic Minix support
On Mon, Sep 22, 2014 at 08:16:13PM +0200, Pino Toscano wrote:> Add a basic support for identifying Minix, extracting its version and > hostname. > > Related to RHBZ#1144137.ACK. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com libguestfs lets you edit virtual machines. Supports shell scripting, bindings from many languages. http://libguestfs.org
Reasonably Related Threads
- [PATCH 2/5] inspect_os: Add support for detecting OpenBSD
- [PATCH 1/4] inspect_os: Add support for detecting OpenBSD
- [PATCH] inspect: map Hurd devices, and enable fstab introspection
- [PATCH] lib: Add COMPILE_REGEXP macro to hide regexp constructors/destructors.
- [PATCH v12 08/11] daemon: Implement inspection types and utility functions.