summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRichard Jones <rjones@redhat.com>2010-11-12 12:29:14 +0000
committerRichard W.M. Jones <rjones@redhat.com>2010-11-12 14:01:38 +0000
commit3fd2b9d0b6d2bac5e9267fbcf1556f459d7313fe (patch)
tree07843464b247536e54d23f28b3ebee22fcacbe1d /src
parent6ab57837216f498a08d33240c429ed678968fb78 (diff)
downloadlibguestfs-3fd2b9d0b6d2bac5e9267fbcf1556f459d7313fe.tar.gz
libguestfs-3fd2b9d0b6d2bac5e9267fbcf1556f459d7313fe.tar.xz
libguestfs-3fd2b9d0b6d2bac5e9267fbcf1556f459d7313fe.zip
New APIs: inspect-get-package-format, inspect-get-package-management.
This APIs reimplement some parts of virt-inspector in C.
Diffstat (limited to 'src')
-rw-r--r--src/guestfs-internal.h21
-rw-r--r--src/inspect.c146
2 files changed, 167 insertions, 0 deletions
diff --git a/src/guestfs-internal.h b/src/guestfs-internal.h
index 6dbbeecb..65ca4f20 100644
--- a/src/guestfs-internal.h
+++ b/src/guestfs-internal.h
@@ -181,6 +181,25 @@ enum inspect_os_distro {
OS_DISTRO_MEEGO,
};
+enum inspect_os_package_format {
+ OS_PACKAGE_FORMAT_UNKNOWN = 0,
+ OS_PACKAGE_FORMAT_RPM,
+ OS_PACKAGE_FORMAT_DEB,
+ OS_PACKAGE_FORMAT_PACMAN,
+ OS_PACKAGE_FORMAT_EBUILD,
+ OS_PACKAGE_FORMAT_PISI
+};
+
+enum inspect_os_package_management {
+ OS_PACKAGE_MANAGEMENT_UNKNOWN = 0,
+ OS_PACKAGE_MANAGEMENT_YUM,
+ OS_PACKAGE_MANAGEMENT_UP2DATE,
+ OS_PACKAGE_MANAGEMENT_APT,
+ OS_PACKAGE_MANAGEMENT_PACMAN,
+ OS_PACKAGE_MANAGEMENT_PORTAGE,
+ OS_PACKAGE_MANAGEMENT_PISI,
+};
+
struct inspect_fs {
int is_root;
char *device;
@@ -189,6 +208,8 @@ struct inspect_fs {
enum inspect_fs_content content;
enum inspect_os_type type;
enum inspect_os_distro distro;
+ enum inspect_os_package_format package_format;
+ enum inspect_os_package_management package_management;
char *product_name;
int major_version;
int minor_version;
diff --git a/src/inspect.c b/src/inspect.c
index 2b61a757..3b2720c7 100644
--- a/src/inspect.c
+++ b/src/inspect.c
@@ -197,6 +197,8 @@ static int parse_unsigned_int (guestfs_h *g, const char *str);
static int add_fstab_entry (guestfs_h *g, struct inspect_fs *fs,
const char *spec, const char *mp);
static char *resolve_fstab_device (guestfs_h *g, const char *spec);
+static void check_package_format (guestfs_h *g, struct inspect_fs *fs);
+static void check_package_management (guestfs_h *g, struct inspect_fs *fs);
static int
check_for_filesystem_on (guestfs_h *g, const char *device)
@@ -516,6 +518,10 @@ check_linux_root (guestfs_h *g, struct inspect_fs *fs)
skip_release_checks:;
+ /* If distro test above was successful, work out the package format. */
+ check_package_format (g, fs);
+ check_package_management (g, fs);
+
/* Determine the architecture. */
const char *binaries[] =
{ "/bin/bash", "/bin/ls", "/bin/echo", "/bin/rm", "/bin/sh" };
@@ -776,6 +782,9 @@ check_windows_root (guestfs_h *g, struct inspect_fs *fs)
if (check_windows_registry (g, fs) == -1)
return -1;
+ check_package_format (g, fs);
+ check_package_management (g, fs);
+
return 0;
}
@@ -972,6 +981,84 @@ parse_unsigned_int (guestfs_h *g, const char *str)
return ret;
}
+/* At the moment, package format and package management is just a
+ * simple function of the distro and major_version fields, so these
+ * can never return an error. We might be cleverer in future.
+ */
+static void
+check_package_format (guestfs_h *g, struct inspect_fs *fs)
+{
+ switch (fs->distro) {
+ case OS_DISTRO_FEDORA:
+ case OS_DISTRO_MEEGO:
+ case OS_DISTRO_REDHAT_BASED:
+ case OS_DISTRO_RHEL:
+ fs->package_format = OS_PACKAGE_FORMAT_RPM;
+ break;
+
+ case OS_DISTRO_DEBIAN:
+ case OS_DISTRO_UBUNTU:
+ fs->package_format = OS_PACKAGE_FORMAT_DEB;
+ break;
+
+ case OS_DISTRO_ARCHLINUX:
+ fs->package_format = OS_PACKAGE_FORMAT_PACMAN;
+ break;
+ case OS_DISTRO_GENTOO:
+ fs->package_format = OS_PACKAGE_FORMAT_EBUILD;
+ break;
+ case OS_DISTRO_PARDUS:
+ fs->package_format = OS_PACKAGE_FORMAT_PISI;
+ break;
+
+ case OS_DISTRO_WINDOWS:
+ case OS_DISTRO_UNKNOWN:
+ default:
+ fs->package_format = OS_PACKAGE_FORMAT_UNKNOWN;
+ break;
+ }
+}
+
+static void
+check_package_management (guestfs_h *g, struct inspect_fs *fs)
+{
+ switch (fs->distro) {
+ case OS_DISTRO_FEDORA:
+ case OS_DISTRO_MEEGO:
+ fs->package_management = OS_PACKAGE_MANAGEMENT_YUM;
+ break;
+
+ case OS_DISTRO_REDHAT_BASED:
+ case OS_DISTRO_RHEL:
+ if (fs->major_version >= 5)
+ fs->package_management = OS_PACKAGE_MANAGEMENT_YUM;
+ else
+ fs->package_management = OS_PACKAGE_MANAGEMENT_UP2DATE;
+ break;
+
+ case OS_DISTRO_DEBIAN:
+ case OS_DISTRO_UBUNTU:
+ fs->package_management = OS_PACKAGE_MANAGEMENT_APT;
+ break;
+
+ case OS_DISTRO_ARCHLINUX:
+ fs->package_management = OS_PACKAGE_MANAGEMENT_PACMAN;
+ break;
+ case OS_DISTRO_GENTOO:
+ fs->package_management = OS_PACKAGE_MANAGEMENT_PORTAGE;
+ break;
+ case OS_DISTRO_PARDUS:
+ fs->package_management = OS_PACKAGE_MANAGEMENT_PISI;
+ break;
+
+ case OS_DISTRO_WINDOWS:
+ case OS_DISTRO_UNKNOWN:
+ default:
+ fs->package_management = OS_PACKAGE_MANAGEMENT_UNKNOWN;
+ break;
+ }
+}
+
static struct inspect_fs *
search_for_root (guestfs_h *g, const char *root)
{
@@ -1194,6 +1281,53 @@ guestfs__inspect_get_filesystems (guestfs_h *g, const char *root)
return ret;
}
+char *
+guestfs__inspect_get_package_format (guestfs_h *g, const char *root)
+{
+ struct inspect_fs *fs = search_for_root (g, root);
+ if (!fs)
+ return NULL;
+
+ char *ret;
+ switch (fs->package_format) {
+ case OS_PACKAGE_FORMAT_RPM: ret = safe_strdup (g, "rpm"); break;
+ case OS_PACKAGE_FORMAT_DEB: ret = safe_strdup (g, "deb"); break;
+ case OS_PACKAGE_FORMAT_PACMAN: ret = safe_strdup (g, "pacman"); break;
+ case OS_PACKAGE_FORMAT_EBUILD: ret = safe_strdup (g, "ebuild"); break;
+ case OS_PACKAGE_FORMAT_PISI: ret = safe_strdup (g, "pisi"); break;
+ case OS_PACKAGE_FORMAT_UNKNOWN:
+ default:
+ ret = safe_strdup (g, "unknown");
+ break;
+ }
+
+ return ret;
+}
+
+char *
+guestfs__inspect_get_package_management (guestfs_h *g, const char *root)
+{
+ struct inspect_fs *fs = search_for_root (g, root);
+ if (!fs)
+ return NULL;
+
+ char *ret;
+ switch (fs->package_management) {
+ case OS_PACKAGE_MANAGEMENT_YUM: ret = safe_strdup (g, "yum"); break;
+ case OS_PACKAGE_MANAGEMENT_UP2DATE: ret = safe_strdup (g, "up2date"); break;
+ case OS_PACKAGE_MANAGEMENT_APT: ret = safe_strdup (g, "apt"); break;
+ case OS_PACKAGE_MANAGEMENT_PACMAN: ret = safe_strdup (g, "pacman"); break;
+ case OS_PACKAGE_MANAGEMENT_PORTAGE: ret = safe_strdup (g, "portage"); break;
+ case OS_PACKAGE_MANAGEMENT_PISI: ret = safe_strdup (g, "pisi"); break;
+ case OS_PACKAGE_MANAGEMENT_UNKNOWN:
+ default:
+ ret = safe_strdup (g, "unknown");
+ break;
+ }
+
+ return ret;
+}
+
#else /* no PCRE or hivex at compile time */
/* XXX These functions should be in an optgroup. */
@@ -1268,6 +1402,18 @@ guestfs__inspect_get_filesystems (guestfs_h *g, const char *root)
NOT_IMPL(NULL);
}
+char *
+guestfs__inspect_get_package_format (guestfs_h *g, const char *root)
+{
+ NOT_IMPL(NULL);
+}
+
+char *
+guestfs__inspect_get_package_management (guestfs_h *g, const char *root)
+{
+ NOT_IMPL(NULL);
+}
+
#endif /* no PCRE or hivex at compile time */
void