[Libosinfo] [libosinfo PATCH 2/6] Introduce OsinfoImage object

Fabiano Fidêncio fidencio at redhat.com
Wed Oct 31 21:45:34 UTC 2018


OsinfoImage object has been created to represent pre-installed images
distributed by the OSes.

This commit introduce libguestfs as dependency for libosinfo on linux
and the rationale for using libguestfs was to be able to provide a
similar approach for identifying the image as the approach we currently
have for medias and trees.

When creating a media from location, we use libguestfs to get:
- osinfo: guestfs API returns "osinfo", which matches the distro's
          short-id
- product-name: guestfs API returns what I assume to be the PRETTY_NAME
                in /etc/os-release and this will be used to actually
                identify the image (thus, requires explicit user-input
                when filling in the image element in osinfo-db

Apart from that, osinfo_image_create_from_location() may be far from
optimal as libguestfs doesn't offer an async API that we could take
advantage of and simply makes no sense to try to re-implement what's
already done (and well done) by libguestfs on our side just to gain an
async API for _create_from_location().

https://gitlab.com/libosinfo/osinfo-db/issues/10

Signed-off-by: Fabiano Fidêncio <fidencio at redhat.com>
---
 configure.ac                  |   9 +
 osinfo/Makefile.am            |   7 +-
 osinfo/libosinfo.syms         |   8 +
 osinfo/osinfo.h               |   1 +
 osinfo/osinfo_image.c         | 410 ++++++++++++++++++++++++++++++++++
 osinfo/osinfo_image.h         |  91 ++++++++
 osinfo/osinfo_image_private.h |  43 ++++
 po/POTFILES.in                |   1 +
 8 files changed, 569 insertions(+), 1 deletion(-)
 create mode 100644 osinfo/osinfo_image.c
 create mode 100644 osinfo/osinfo_image.h
 create mode 100644 osinfo/osinfo_image_private.h

diff --git a/configure.ac b/configure.ac
index 00547a5..a885f40 100644
--- a/configure.ac
+++ b/configure.ac
@@ -43,6 +43,15 @@ GLIB_ENCODED_VERSION="GLIB_VERSION_2_38"
 PKG_CHECK_MODULES([LIBXML], [libxml-2.0 >= 2.6.0])
 PKG_CHECK_MODULES([LIBXSLT], [libxslt >= 1.0.0])
 
+have_guestfs=no
+PKG_CHECK_MODULES([GUESTFS], [libguestfs], [have_guestfs=yes], [:])
+AC_SUBST(GUESTFS_CFLAGS)
+AC_SUBST(GUESTFS_LIBS)
+
+if test "x$have_guestfs" = "xyes"; then
+  AC_DEFINE([HAVE_GUESTFS], 1, [libguestfs is present])
+fi
+
 PKG_CHECK_MODULES([GLIB], [glib-2.0 >= $GLIB_MINIMUM_VERSION gobject-2.0 gio-2.0])
 GLIB_CFLAGS="$GLIB_CFLAGS -DGLIB_VERSION_MIN_REQUIRED=$GLIB_ENCODED_VERSION"
 GLIB_CFLAGS="$GLIB_CFLAGS -DGLIB_VERSION_MAX_ALLOWED=$GLIB_ENCODED_VERSION"
diff --git a/osinfo/Makefile.am b/osinfo/Makefile.am
index 86f6344..b53acd1 100644
--- a/osinfo/Makefile.am
+++ b/osinfo/Makefile.am
@@ -36,6 +36,7 @@ libosinfo_1_0_la_CFLAGS = \
 	$(GOBJECT_CFLAGS) \
 	$(GLIB_CFLAGS) \
 	$(GIO_CFLAGS) \
+	$(GUESTFS_CFLAGS) \
 	-DDATA_DIR='"$(datadir)"' \
 	-DPKG_DATA_DIR='"$(pkgdatadir)"' \
 	-DSYS_CONF_DIR='"$(sysconfdir)"' \
@@ -47,7 +48,8 @@ libosinfo_1_0_la_LIBADD = \
 	$(LIBXSLT_LIBS) \
 	$(GOBJECT_LIBS) \
 	$(GLIB_LIBS) \
-	$(GIO_LIBS)
+	$(GIO_LIBS) \
+	$(GUESTFS_LIBS)
 
 libosinfo_1_0_la_LDFLAGS = \
 	$(COVERAGE_LDFLAGS) \
@@ -98,6 +100,7 @@ libosinfo_1_0_include_HEADERS =		\
   osinfo_resourceslist.h		\
   osinfo_tree.h				\
   osinfo_treelist.h			\
+  osinfo_image.h			\
   $(NULL)
 
 nodist_libosinfo_1_0_include_HEADERS =	\
@@ -141,6 +144,7 @@ libosinfo_c_files =		\
   osinfo_resourceslist.c		\
   osinfo_tree.c				\
   osinfo_treelist.c			\
+  osinfo_image.c			\
   osinfo_db.c				\
   osinfo_loader.c			\
   $(NULL)
@@ -150,6 +154,7 @@ libosinfo_private_header_files =	\
   osinfo_install_script_private.h	\
   osinfo_product_private.h		\
   osinfo_media_private.h		\
+  osinfo_image_private.h		\
   ignore-value.h			\
   $(NULL)
 
diff --git a/osinfo/libosinfo.syms b/osinfo/libosinfo.syms
index db9b8b2..fdbaaf3 100644
--- a/osinfo/libosinfo.syms
+++ b/osinfo/libosinfo.syms
@@ -532,6 +532,14 @@ LIBOSINFO_0.2.13 {
 LIBOSINFO_1.3.0 {
     global:
 	osinfo_error_quark;
+
+	osinfo_image_create_from_location;
+	osinfo_image_error_quark;
+	osinfo_image_get_architecture;
+	osinfo_image_get_os;
+	osinfo_image_get_type;
+	osinfo_image_get_url;
+	osinfo_image_new;
 } LIBOSINFO_0.2.13;
 
 /* Symbols in next release...
diff --git a/osinfo/osinfo.h b/osinfo/osinfo.h
index 8d0a595..9e8e604 100644
--- a/osinfo/osinfo.h
+++ b/osinfo/osinfo.h
@@ -65,6 +65,7 @@
 #include <osinfo/osinfo_loader.h>
 #include <osinfo/osinfo_os_variant.h>
 #include <osinfo/osinfo_os_variantlist.h>
+#include <osinfo/osinfo_image.h>
 #include <osinfo/osinfo_version.h>
 
 #endif
diff --git a/osinfo/osinfo_image.c b/osinfo/osinfo_image.c
new file mode 100644
index 0000000..e83160e
--- /dev/null
+++ b/osinfo/osinfo_image.c
@@ -0,0 +1,410 @@
+/*
+ * libosinfo: An installed image of a (guest) OS
+ *
+ * Copyright (C) 2018 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Authors:
+ *  Fabiano Fidêncio <fidencio at redhat.com>
+ */
+
+#include <config.h>
+
+#include <osinfo/osinfo.h>
+#include "osinfo_image_private.h"
+#include <gio/gio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <glib/gi18n-lib.h>
+#ifdef HAVE_GUESTFS
+# include <guestfs.h>
+#endif /* HAVE_GUESTFS */
+
+GQuark
+osinfo_image_error_quark(void)
+{
+    static GQuark quark = 0;
+
+    if (!quark)
+        quark = g_quark_from_static_string("osinfo-image-error");
+
+    return quark;
+}
+
+G_DEFINE_TYPE(OsinfoImage, osinfo_image, OSINFO_TYPE_ENTITY);
+
+#define OSINFO_IMAGE_GET_PRIVATE(obj)                    \
+    (G_TYPE_INSTANCE_GET_PRIVATE((obj),                \
+                                  OSINFO_TYPE_IMAGE,     \
+                                  OsinfoImagePrivate))
+
+/**
+ * SECTION:osinfo_image
+ * @short_description: An installation image for a (guest) OS
+ * @see_also: #OsinfoOs
+ *
+ * #OsinfoImage is an entity representing an installation image
+ * a (guest) operating system.
+ */
+
+struct _OsinfoImagePrivate
+{
+    GWeakRef os;
+};
+
+enum {
+    PROP_0,
+
+    PROP_ARCHITECTURE,
+    PROP_URL,
+    PROP_OS,
+    PROP_OSINFO,
+    PROP_PRODUCT_NAME,
+};
+
+static void
+osinfo_image_get_property(GObject *object,
+                         guint property_id,
+                         GValue *value,
+                         GParamSpec *pspec)
+{
+    OsinfoImage *image = OSINFO_IMAGE(object);
+
+    switch (property_id) {
+    case PROP_ARCHITECTURE:
+        g_value_set_string(value, osinfo_image_get_architecture(image));
+        break;
+
+    case PROP_URL:
+        g_value_set_string(value, osinfo_image_get_url(image));
+        break;
+
+    case PROP_OS:
+        g_value_take_object(value, osinfo_image_get_os(image));
+        break;
+
+    case PROP_OSINFO:
+        g_value_set_string(value, osinfo_image_get_osinfo(image));
+        break;
+
+    case PROP_PRODUCT_NAME:
+        g_value_set_string(value, osinfo_image_get_product_name(image));
+        break;
+
+    default:
+        /* We don't have any other property... */
+        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
+        break;
+    }
+}
+
+static void
+osinfo_image_set_property(GObject      *object,
+                         guint         property_id,
+                         const GValue *value,
+                         GParamSpec   *pspec)
+{
+    OsinfoImage *image = OSINFO_IMAGE(object);
+
+    switch (property_id) {
+    case PROP_ARCHITECTURE:
+        osinfo_entity_set_param(OSINFO_ENTITY(image),
+                                OSINFO_IMAGE_PROP_ARCHITECTURE,
+                                g_value_get_string(value));
+        break;
+
+    case PROP_URL:
+        osinfo_entity_set_param(OSINFO_ENTITY(image),
+                                OSINFO_IMAGE_PROP_URL,
+                                g_value_get_string(value));
+        break;
+
+    case PROP_OS:
+        osinfo_image_set_os(image, g_value_get_object(value));
+        break;
+
+    case PROP_OSINFO:
+        osinfo_entity_set_param(OSINFO_ENTITY(image),
+                                OSINFO_IMAGE_PROP_OSINFO,
+                                g_value_get_string(value));
+        break;
+
+    case PROP_PRODUCT_NAME:
+        osinfo_entity_set_param(OSINFO_ENTITY(image),
+                                OSINFO_IMAGE_PROP_PRODUCT_NAME,
+                                g_value_get_string(value));
+        break;
+
+    default:
+        /* We don't have any other property... */
+        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
+        break;
+    }
+}
+
+static void
+osinfo_image_finalize(GObject *object)
+{
+    /* Chain up to the parent class */
+    G_OBJECT_CLASS(osinfo_image_parent_class)->finalize(object);
+}
+
+/* Init functions */
+static void
+osinfo_image_class_init(OsinfoImageClass *klass)
+{
+    GObjectClass *g_klass = G_OBJECT_CLASS(klass);
+    GParamSpec *pspec;
+
+    g_klass->finalize = osinfo_image_finalize;
+    g_klass->get_property = osinfo_image_get_property;
+    g_klass->set_property = osinfo_image_set_property;
+    g_type_class_add_private(klass, sizeof(OsinfoImagePrivate));
+
+    /**
+     * OsinfoImage:architecture:
+     *
+     * The target hardware architecture of this image.
+     */
+    pspec = g_param_spec_string("architecture",
+                                "ARCHITECTURE",
+                                _("CPU Architecture"),
+                                NULL /* default value */,
+                                G_PARAM_READWRITE |
+                                G_PARAM_STATIC_STRINGS);
+    g_object_class_install_property(g_klass, PROP_ARCHITECTURE, pspec);
+
+    /**
+     * OsinfoImage:url:
+     *
+     * The URL to this image.
+     */
+    pspec = g_param_spec_string("url",
+                                "URL",
+                                _("The URL to this image"),
+                                NULL /* default value */,
+                                G_PARAM_READWRITE |
+                                G_PARAM_STATIC_STRINGS);
+    g_object_class_install_property(g_klass, PROP_URL, pspec);
+
+    /**
+     * OsinfoImage:os:
+     *
+     * Os information for the current image. For image stored in an
+     * #OsinfoDB, it will be filled when the database is loaded, otherwise
+     * the property will be filled after a successful call to
+     * osinfo_db_identify_image().
+     */
+    pspec = g_param_spec_object("os",
+                                "Os",
+                                _("Information about the operating system on this image"),
+                                OSINFO_TYPE_OS,
+                                G_PARAM_READWRITE |
+                                G_PARAM_STATIC_STRINGS);
+    g_object_class_install_property(g_klass, PROP_OS, pspec);
+}
+
+static void
+osinfo_image_init(OsinfoImage *image)
+{
+    image->priv = OSINFO_IMAGE_GET_PRIVATE(image);
+}
+
+OsinfoImage *osinfo_image_new(const gchar *id,
+                              const gchar *architecture)
+{
+    OsinfoImage *image;
+
+    image = g_object_new(OSINFO_TYPE_IMAGE,
+                        "id", id,
+                        NULL);
+
+    osinfo_entity_set_param(OSINFO_ENTITY(image),
+                            OSINFO_IMAGE_PROP_ARCHITECTURE,
+                            architecture);
+
+    return image;
+}
+
+static gboolean osinfo_image_get_guestfs_info(const gchar *location,
+                                              gchar **arch,
+                                              gchar **osinfo,
+                                              gchar **product_name)
+{
+    gboolean ret = FALSE;
+
+#ifdef HAVE_GUESTFS
+    gchar **roots = NULL;
+    guestfs_h *guest;
+
+    guest = guestfs_create();
+    if (guest == NULL)
+        return FALSE;
+
+    if (guestfs_add_drive_opts(guest, location,
+                               GUESTFS_ADD_DRIVE_OPTS_READONLY, 1,
+                               -1) == -1)
+        goto done;
+
+    if (guestfs_launch(guest) == -1)
+        goto done;
+
+    roots = guestfs_inspect_os(guest);
+    if (roots == NULL || roots[0] == NULL)
+        goto done;
+
+    *arch = guestfs_inspect_get_arch(guest, roots[0]);
+    *osinfo = guestfs_inspect_get_osinfo(guest, roots[0]);
+    *product_name = guestfs_inspect_get_product_name(guest, roots[0]);
+
+    ret = TRUE;
+
+ done:
+    if (roots != NULL) {
+        for (int i = 0; roots[i] != NULL; i++)
+            g_free(roots[i]);
+    }
+    g_free(roots);
+    guestfs_close(guest);
+#endif /* HAVE_GUESTFS */
+
+    return ret;
+}
+
+/**
+ * osinfo_image_create_from_location:
+ * @location: the location of an installation image
+ *
+ * Creates a new #OsinfoImage for installation image at @location. The @location
+ * could be any URI that GIO can handle or a local path.
+ *
+ * Returns: (transfer full): a new #OsinfoImage , or NULL on error
+ */
+OsinfoImage *osinfo_image_create_from_location(const gchar *location)
+{
+    OsinfoImage *ret = NULL;
+    gchar *arch = NULL;
+    gchar *product_name = NULL;
+    gchar *osinfo = NULL;
+
+    if (!osinfo_image_get_guestfs_info(location, &arch, &osinfo, &product_name))
+        return NULL;
+
+    ret = osinfo_image_new(location, arch ? arch : "i386");
+
+    osinfo_entity_set_param(OSINFO_ENTITY(ret),
+                            OSINFO_IMAGE_PROP_URL,
+                            location);
+
+    if (osinfo != NULL)
+        osinfo_entity_set_param(OSINFO_ENTITY(ret),
+                                OSINFO_IMAGE_PROP_OSINFO,
+                                osinfo);
+
+    if (product_name != NULL)
+        osinfo_entity_set_param(OSINFO_ENTITY(ret),
+                                OSINFO_IMAGE_PROP_PRODUCT_NAME,
+                                product_name);
+
+    g_free(arch);
+    g_free(osinfo);
+    g_free(product_name);
+
+    return ret;
+}
+
+/**
+ * osinfo_image_get_architecture:
+ * @image: an #OsinfoImage instance
+ *
+ * Retrieves the target hardware architecture of the OS @image provides.
+ *
+ * Returns: (transfer none): the hardware architecture, or NULL
+ */
+const gchar *osinfo_image_get_architecture(OsinfoImage *image)
+{
+    return osinfo_entity_get_param_value(OSINFO_ENTITY(image),
+                                         OSINFO_IMAGE_PROP_ARCHITECTURE);
+}
+
+/**
+ * osinfo_image_get_url:
+ * @image: an #OsinfoImage instance
+ *
+ * The URL to the @image
+ *
+ * Returns: (transfer none): the URL, or NULL
+ */
+const gchar *osinfo_image_get_url(OsinfoImage *image)
+{
+    return osinfo_entity_get_param_value(OSINFO_ENTITY(image),
+                                         OSINFO_IMAGE_PROP_URL);
+}
+
+/**
+ * osinfo_image_get_os:
+ * @image: an #OsinfoImage instance
+ *
+ * Returns: (transfer full): the operating system, or NULL
+ */
+OsinfoOs *osinfo_image_get_os(OsinfoImage *image)
+{
+    g_return_val_if_fail(OSINFO_IS_IMAGE(image), NULL);
+
+    return g_weak_ref_get(&image->priv->os);
+}
+
+void osinfo_image_set_os(OsinfoImage *image, OsinfoOs *os)
+{
+    g_return_if_fail(OSINFO_IS_IMAGE(image));
+
+    g_object_ref(os);
+    g_weak_ref_set(&image->priv->os, os);
+    g_object_unref(os);
+}
+
+/**
+ * osinfo_image_get_product_name:
+ * @image: an #OsinfoImage instance
+ *
+ * Returns: (transfer none): the image's product name, or NULL
+ */
+const gchar *osinfo_image_get_product_name(OsinfoImage *image)
+{
+    return osinfo_entity_get_param_value(OSINFO_ENTITY(image),
+                                         OSINFO_IMAGE_PROP_PRODUCT_NAME);
+}
+
+
+/**
+ * osinfo_image_get_osinfo:
+ * @image: an #OsinfoImage instance
+ *
+ * Returns: (transfer none): the image's osinfo, or NULL
+ */
+const gchar *osinfo_image_get_osinfo(OsinfoImage *image)
+{
+    return osinfo_entity_get_param_value(OSINFO_ENTITY(image),
+                                         OSINFO_IMAGE_PROP_OSINFO);
+}
+
+/*
+ * Local variables:
+ *  indent-tabs-mode: nil
+ *  c-indent-level: 4
+ *  c-basic-offset: 4
+ * End:
+ */
diff --git a/osinfo/osinfo_image.h b/osinfo/osinfo_image.h
new file mode 100644
index 0000000..1941afb
--- /dev/null
+++ b/osinfo/osinfo_image.h
@@ -0,0 +1,91 @@
+/*
+ * libosinfo: An installed image of a (guest) OS
+ *
+ * Copyright (C) 2018 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Authors:
+ *  Fabiano Fidêncio <fidencio at redhat.com>
+ */
+
+#include <glib-object.h>
+#include <gio/gio.h>
+#include <osinfo/osinfo_entity.h>
+
+#ifndef __OSINFO_IMAGE_H__
+#define __OSINFO_IMAGE_H__
+
+GQuark
+osinfo_image_error_quark (void) G_GNUC_CONST;
+
+#define OSINFO_IMAGE_ERROR (osinfo_image_error_quark ())
+
+
+/*
+ * Type macros.
+ */
+#define OSINFO_TYPE_IMAGE                  (osinfo_image_get_type ())
+#define OSINFO_IMAGE(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), OSINFO_TYPE_IMAGE, OsinfoImage))
+#define OSINFO_IS_IMAGE(obj)               (G_TYPE_CHECK_INSTANCE_TYPE ((obj), OSINFO_TYPE_IMAGE))
+#define OSINFO_IMAGE_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), OSINFO_TYPE_IMAGE, OsinfoImageClass))
+#define OSINFO_IS_IMAGE_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE ((klass), OSINFO_TYPE_IMAGE))
+#define OSINFO_IMAGE_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS ((obj), OSINFO_TYPE_IMAGE, OsinfoImageClass))
+
+typedef struct _OsinfoImage        OsinfoImage;
+
+typedef struct _OsinfoImageClass   OsinfoImageClass;
+
+typedef struct _OsinfoImagePrivate OsinfoImagePrivate;
+
+#define OSINFO_IMAGE_PROP_ARCHITECTURE      "architecture"
+#define OSINFO_IMAGE_PROP_URL               "url"
+
+/* object */
+struct _OsinfoImage
+{
+    OsinfoEntity parent_instance;
+
+    /* public */
+
+    /* private */
+    OsinfoImagePrivate *priv;
+};
+
+/* class */
+struct _OsinfoImageClass
+{
+    /*< private >*/
+    OsinfoEntityClass parent_class;
+
+    /* class members */
+};
+
+GType osinfo_image_get_type(void);
+
+OsinfoImage *osinfo_image_new(const gchar *id, const gchar *architecture);
+OsinfoImage *osinfo_image_create_from_location(const gchar *location);
+OsinfoOs *osinfo_image_get_os(OsinfoImage *image);
+const gchar *osinfo_image_get_architecture(OsinfoImage *image);
+const gchar *osinfo_image_get_url(OsinfoImage *image);
+
+#endif /* __OSINFO_IMAGE_H__ */
+/*
+ * Local variables:
+ *  indent-tabs-mode: nil
+ *  c-indent-level: 4
+ *  c-basic-offset: 4
+ * End:
+ */
diff --git a/osinfo/osinfo_image_private.h b/osinfo/osinfo_image_private.h
new file mode 100644
index 0000000..3398649
--- /dev/null
+++ b/osinfo/osinfo_image_private.h
@@ -0,0 +1,43 @@
+/*
+ * libosinfo: An installed image of a (guest) OS
+ *
+ * Copyright (C) 2018 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Authors:
+ *   Fabiano Fidêncio <fidencio at redhat.com>
+ */
+
+#include <osinfo/osinfo_image.h>
+
+#ifndef __OSINFO_IMAGE_PRIVATE_H__
+#define __OSINFO_IMAGE_PRIVATE_H__
+
+#define OSINFO_IMAGE_PROP_OSINFO            "osinfo"
+#define OSINFO_IMAGE_PROP_PRODUCT_NAME      "product-name"
+
+void osinfo_image_set_os(OsinfoImage *image, OsinfoOs *os);
+const gchar *osinfo_image_get_osinfo(OsinfoImage* image);
+const gchar *osinfo_image_get_product_name(OsinfoImage* image);
+
+#endif /* __OSINFO_IMAGE_PRIVATE_H__ */
+/*
+ * Local variables:
+ *  indent-tabs-mode: nil
+ *  c-indent-level: 4
+ *  c-basic-offset: 4
+ * End:
+ */
diff --git a/po/POTFILES.in b/po/POTFILES.in
index fc81f42..2a714df 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -3,6 +3,7 @@ osinfo/osinfo_deployment.c
 osinfo/osinfo_devicelink.c
 osinfo/osinfo_devicelinkfilter.c
 osinfo/osinfo_entity.c
+osinfo/osinfo_image.c
 osinfo/osinfo_install_config_param.c
 osinfo/osinfo_install_script.c
 osinfo/osinfo_list.c
-- 
2.19.1




More information about the Libosinfo mailing list