Blame libvirt-gconfig/libvirt-gconfig-domain-os.c

Packit a07778
/*
Packit a07778
 * libvirt-gconfig-domain-os.c: libvirt domain OS configuration
Packit a07778
 *
Packit a07778
 * Copyright (C) 2011 Red Hat, Inc.
Packit a07778
 *
Packit a07778
 * This library is free software; you can redistribute it and/or
Packit a07778
 * modify it under the terms of the GNU Lesser General Public
Packit a07778
 * License as published by the Free Software Foundation; either
Packit a07778
 * version 2.1 of the License, or (at your option) any later version.
Packit a07778
 *
Packit a07778
 * This library is distributed in the hope that it will be useful,
Packit a07778
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit a07778
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit a07778
 * Lesser General Public License for more details.
Packit a07778
 *
Packit a07778
 * You should have received a copy of the GNU Lesser General Public
Packit a07778
 * License along with this library. If not, see
Packit a07778
 * <http://www.gnu.org/licenses/>.
Packit a07778
 *
Packit a07778
 * Author: Christophe Fergeau <cfergeau@gmail.com>
Packit a07778
 */
Packit a07778
Packit a07778
#include <config.h>
Packit a07778
Packit a07778
#include "libvirt-gconfig/libvirt-gconfig.h"
Packit a07778
#include "libvirt-gconfig/libvirt-gconfig-private.h"
Packit a07778
Packit a07778
#define GVIR_CONFIG_DOMAIN_OS_GET_PRIVATE(obj)                         \
Packit a07778
        (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_CONFIG_TYPE_DOMAIN_OS, GVirConfigDomainOsPrivate))
Packit a07778
Packit a07778
struct _GVirConfigDomainOsPrivate
Packit a07778
{
Packit a07778
    gboolean unused;
Packit a07778
};
Packit a07778
Packit a07778
G_DEFINE_TYPE_WITH_PRIVATE(GVirConfigDomainOs, gvir_config_domain_os, GVIR_CONFIG_TYPE_OBJECT);
Packit a07778
Packit a07778
Packit a07778
static void gvir_config_domain_os_class_init(GVirConfigDomainOsClass *klass G_GNUC_UNUSED)
Packit a07778
{
Packit a07778
}
Packit a07778
Packit a07778
Packit a07778
static void gvir_config_domain_os_init(GVirConfigDomainOs *os)
Packit a07778
{
Packit a07778
    os->priv = GVIR_CONFIG_DOMAIN_OS_GET_PRIVATE(os);
Packit a07778
}
Packit a07778
Packit a07778
Packit a07778
GVirConfigDomainOs *gvir_config_domain_os_new(void)
Packit a07778
{
Packit a07778
    GVirConfigObject *object;
Packit a07778
Packit a07778
    object = gvir_config_object_new(GVIR_CONFIG_TYPE_DOMAIN_OS, "os", NULL);
Packit a07778
    return GVIR_CONFIG_DOMAIN_OS(object);
Packit a07778
}
Packit a07778
Packit a07778
GVirConfigDomainOs *gvir_config_domain_os_new_from_xml(const gchar *xml, GError **error)
Packit a07778
{
Packit a07778
    GVirConfigObject *object;
Packit a07778
Packit a07778
    object = gvir_config_object_new_from_xml(GVIR_CONFIG_TYPE_DOMAIN_OS, "os",
Packit a07778
                                             NULL, xml, error);
Packit a07778
    return GVIR_CONFIG_DOMAIN_OS(object);
Packit a07778
}
Packit a07778
Packit a07778
void gvir_config_domain_os_set_os_type(GVirConfigDomainOs *os,
Packit a07778
                                       GVirConfigDomainOsType type)
Packit a07778
{
Packit a07778
    const char *type_str;
Packit a07778
Packit a07778
    g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os));
Packit a07778
Packit a07778
    type_str = gvir_config_genum_get_nick(GVIR_CONFIG_TYPE_DOMAIN_OS_TYPE, type);
Packit a07778
    g_return_if_fail(type_str != NULL);
Packit a07778
Packit a07778
    gvir_config_object_set_node_content(GVIR_CONFIG_OBJECT(os),
Packit a07778
                                        "type", type_str);
Packit a07778
}
Packit a07778
Packit a07778
GVirConfigDomainOsType gvir_config_domain_os_get_os_type(GVirConfigDomainOs *os)
Packit a07778
{
Packit a07778
    g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os),
Packit a07778
                         GVIR_CONFIG_DOMAIN_OS_TYPE_HVM);
Packit a07778
Packit a07778
    return gvir_config_object_get_node_content_genum
Packit a07778
            (GVIR_CONFIG_OBJECT(os),
Packit a07778
             "type",
Packit a07778
             GVIR_CONFIG_TYPE_DOMAIN_OS_TYPE,
Packit a07778
             GVIR_CONFIG_DOMAIN_OS_TYPE_HVM);
Packit a07778
}
Packit a07778
Packit a07778
/**
Packit a07778
 * gvir_config_domain_os_set_kernel:
Packit a07778
 * @os: a #GVirConfigDomainOs
Packit a07778
 * @kernel: (allow-none): The kernel path
Packit a07778
 */
Packit a07778
void gvir_config_domain_os_set_kernel(GVirConfigDomainOs *os,
Packit a07778
                                      const char * kernel)
Packit a07778
{
Packit a07778
    gvir_config_object_set_node_content(GVIR_CONFIG_OBJECT(os),
Packit a07778
                                        "kernel", kernel);
Packit a07778
}
Packit a07778
Packit a07778
/**
Packit a07778
 * gvir_config_domain_os_set_ramdisk:
Packit a07778
 * @os: a #GVirConfigDomainOs
Packit a07778
 * @ramdisk: (allow-none): The ramdisk path
Packit a07778
 */
Packit a07778
void gvir_config_domain_os_set_ramdisk(GVirConfigDomainOs *os,
Packit a07778
                                       const char * ramdisk)
Packit a07778
{
Packit a07778
    gvir_config_object_set_node_content(GVIR_CONFIG_OBJECT(os),
Packit a07778
                                        "initrd", ramdisk);
Packit a07778
}
Packit a07778
Packit a07778
/**
Packit a07778
 * gvir_config_domain_os_set_cmdline:
Packit a07778
 * @os: a #GVirConfigDomainOs
Packit a07778
 * @cmdline: (allow-none): The direct boot commandline
Packit a07778
 */
Packit a07778
void gvir_config_domain_os_set_cmdline(GVirConfigDomainOs *os,
Packit a07778
                                       const char * cmdline)
Packit a07778
{
Packit a07778
    gvir_config_object_set_node_content(GVIR_CONFIG_OBJECT(os),
Packit a07778
                                        "cmdline", cmdline);
Packit a07778
}
Packit a07778
Packit a07778
/**
Packit a07778
 * gvir_config_domain_os_set_init:
Packit a07778
 * @os: a #GVirConfigDomainOs
Packit a07778
 * @init: (allow-none):
Packit a07778
 */
Packit a07778
void gvir_config_domain_os_set_init(GVirConfigDomainOs *os,
Packit a07778
                                    const char * init)
Packit a07778
{
Packit a07778
    gvir_config_object_set_node_content(GVIR_CONFIG_OBJECT(os),
Packit a07778
                                        "init", init);
Packit a07778
}
Packit a07778
Packit a07778
/**
Packit a07778
 * gvir_config_domain_os_set_loader:
Packit a07778
 * @os: a #GVirConfigDomainOs
Packit a07778
 * @loader: (allow-none):
Packit a07778
 */
Packit a07778
void gvir_config_domain_os_set_loader(GVirConfigDomainOs *os,
Packit a07778
                                      const char * loader)
Packit a07778
{
Packit a07778
    gvir_config_object_set_node_content(GVIR_CONFIG_OBJECT(os),
Packit a07778
                                        "loader", loader);
Packit a07778
}
Packit a07778
Packit a07778
void gvir_config_domain_os_enable_boot_menu(GVirConfigDomainOs *os,
Packit a07778
                                            gboolean enable)
Packit a07778
{
Packit a07778
    GVirConfigObject *node;
Packit a07778
Packit a07778
    g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os));
Packit a07778
Packit a07778
    node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(os), "bootmenu");
Packit a07778
    g_return_if_fail(GVIR_CONFIG_IS_OBJECT(node));
Packit a07778
    gvir_config_object_set_attribute_with_type(node, "enable",
Packit a07778
                                               G_TYPE_BOOLEAN, enable,
Packit a07778
                                               NULL);
Packit a07778
    g_object_unref(G_OBJECT(node));
Packit a07778
}
Packit a07778
Packit a07778
void gvir_config_domain_os_bios_enable_serial(GVirConfigDomainOs *os,
Packit a07778
                                              gboolean enable)
Packit a07778
{
Packit a07778
    GVirConfigObject *node;
Packit a07778
Packit a07778
    g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os));
Packit a07778
Packit a07778
    node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(os), "bios");
Packit a07778
    g_return_if_fail(GVIR_CONFIG_IS_OBJECT(node));
Packit a07778
    gvir_config_object_set_attribute_with_type(node, "useserial",
Packit a07778
                                               G_TYPE_BOOLEAN, enable,
Packit a07778
                                               NULL);
Packit a07778
    g_object_unref(G_OBJECT(node));
Packit a07778
}
Packit a07778
Packit a07778
void gvir_config_domain_os_set_smbios_mode(GVirConfigDomainOs *os,
Packit a07778
                                           GVirConfigDomainOsSmBiosMode mode)
Packit a07778
{
Packit a07778
    GVirConfigObject *node;
Packit a07778
Packit a07778
    g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os));
Packit a07778
Packit a07778
    node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(os), "smbios");
Packit a07778
    g_return_if_fail(GVIR_CONFIG_IS_OBJECT(node));
Packit a07778
    gvir_config_object_set_attribute_with_type(node, "mode",
Packit a07778
                                               GVIR_CONFIG_TYPE_DOMAIN_OS_SM_BIOS_MODE,
Packit a07778
                                               mode, NULL);
Packit a07778
    g_object_unref(G_OBJECT(node));
Packit a07778
}
Packit a07778
Packit a07778
/**
Packit a07778
 * gvir_config_domain_os_set_boot_devices:
Packit a07778
 * @os: a #GVirConfigDomainOs
Packit a07778
 * @boot_devices: (in) (element-type LibvirtGConfig.DomainOsBootDevice):
Packit a07778
 */
Packit a07778
void gvir_config_domain_os_set_boot_devices(GVirConfigDomainOs *os, GList *boot_devices)
Packit a07778
{
Packit a07778
    GList *it;
Packit a07778
    xmlNodePtr os_node;
Packit a07778
    xmlNodePtr node;
Packit a07778
Packit a07778
    g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os));
Packit a07778
Packit a07778
    os_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(os));
Packit a07778
    g_return_if_fail(os_node != NULL);
Packit a07778
Packit a07778
    node = os_node->children;
Packit a07778
    while (node != NULL) {
Packit a07778
        xmlNodePtr next_node;
Packit a07778
        next_node = node->next;
Packit a07778
        if (g_strcmp0("boot", (char *)node->name) == 0) {
Packit a07778
            xmlUnlinkNode(node);
Packit a07778
            xmlFreeNode(node);
Packit a07778
        }
Packit a07778
        node = next_node;
Packit a07778
    }
Packit a07778
Packit a07778
    for (it = boot_devices; it != NULL; it = it->next) {
Packit a07778
        const char *dev;
Packit a07778
Packit a07778
        dev = gvir_config_genum_get_nick(GVIR_CONFIG_TYPE_DOMAIN_OS_BOOT_DEVICE,
Packit a07778
                                         GPOINTER_TO_INT(it->data));
Packit a07778
        g_warn_if_fail(dev != NULL);
Packit a07778
        if (dev != NULL) {
Packit a07778
            node = xmlNewDocNode(NULL, NULL, (xmlChar*)"boot", NULL);
Packit a07778
            xmlNewProp(node, (xmlChar*)"dev", (xmlChar*)dev);
Packit a07778
            xmlAddChild(os_node, node);
Packit a07778
        }
Packit a07778
    }
Packit a07778
}
Packit a07778
Packit a07778
static gboolean add_boot_device(xmlNodePtr node, gpointer opaque)
Packit a07778
{
Packit a07778
    GList **devices = (GList **)opaque;
Packit a07778
    const gchar *value;
Packit a07778
Packit a07778
    if (g_strcmp0((const gchar *)node->name, "boot") != 0)
Packit a07778
        return TRUE;
Packit a07778
Packit a07778
    value = gvir_config_xml_get_attribute_content(node, "dev");
Packit a07778
    if (value != NULL) {
Packit a07778
        GVirConfigDomainOsBootDevice device;
Packit a07778
Packit a07778
        device = gvir_config_genum_get_value
Packit a07778
                        (GVIR_CONFIG_TYPE_DOMAIN_OS_BOOT_DEVICE,
Packit a07778
                         value,
Packit a07778
                         GVIR_CONFIG_DOMAIN_OS_BOOT_DEVICE_HD);
Packit a07778
        *devices = g_list_append(*devices, GINT_TO_POINTER(device));
Packit a07778
    } else
Packit a07778
        g_debug("Failed to parse attribute 'dev' of node 'boot'");
Packit a07778
Packit a07778
    return TRUE;
Packit a07778
}
Packit a07778
Packit a07778
/**
Packit a07778
 * gvir_config_domain_os_get_boot_devices:
Packit a07778
 * @os: a #GVirConfigDomainOs
Packit a07778
 *
Packit a07778
 * Gets the list of devices attached to @os. The returned list should be
Packit a07778
 * freed with g_list_free().
Packit a07778
 *
Packit a07778
 * Returns: (element-type LibvirtGConfig.DomainOsBootDevice) (transfer container):
Packit a07778
 * a newly allocated #GList of #GVirConfigDomainOsBootDevice.
Packit a07778
 */
Packit a07778
GList *gvir_config_domain_os_get_boot_devices(GVirConfigDomainOs *os)
Packit a07778
{
Packit a07778
    GList *devices = NULL;
Packit a07778
Packit a07778
    g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os), NULL);
Packit a07778
Packit a07778
    gvir_config_object_foreach_child(GVIR_CONFIG_OBJECT(os),
Packit a07778
                                     NULL,
Packit a07778
                                     add_boot_device,
Packit a07778
                                     &devices);
Packit a07778
Packit a07778
    return devices;
Packit a07778
}
Packit a07778
Packit a07778
const char *gvir_config_domain_os_get_arch(GVirConfigDomainOs *os)
Packit a07778
{
Packit a07778
    return gvir_config_object_get_attribute(GVIR_CONFIG_OBJECT(os),
Packit a07778
                                            "type",
Packit a07778
                                            "arch");
Packit a07778
}
Packit a07778
Packit a07778
void gvir_config_domain_os_set_arch(GVirConfigDomainOs *os, const char *arch)
Packit a07778
{
Packit a07778
    xmlNodePtr os_node;
Packit a07778
    xmlNodePtr os_type_node;
Packit a07778
Packit a07778
    g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os));
Packit a07778
Packit a07778
    os_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(os));
Packit a07778
    g_return_if_fail(os_node != NULL);
Packit a07778
Packit a07778
    os_type_node = gvir_config_xml_get_element(os_node, "type", NULL);
Packit a07778
    g_return_if_fail(os_type_node != NULL);
Packit a07778
Packit a07778
    xmlNewProp(os_type_node, (xmlChar*)"arch", (xmlChar*)arch);
Packit a07778
}
Packit a07778
Packit a07778
const char *gvir_config_domain_os_get_machine(GVirConfigDomainOs *os)
Packit a07778
{
Packit a07778
    return gvir_config_object_get_attribute(GVIR_CONFIG_OBJECT(os),
Packit a07778
                                            "type",
Packit a07778
                                            "machine");
Packit a07778
}
Packit a07778
Packit a07778
void gvir_config_domain_os_set_machine(GVirConfigDomainOs *os, const char *machine)
Packit a07778
{
Packit a07778
    xmlNodePtr os_node;
Packit a07778
    xmlNodePtr os_type_node;
Packit a07778
Packit a07778
    g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os));
Packit a07778
Packit a07778
    os_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(os));
Packit a07778
    g_return_if_fail(os_node != NULL);
Packit a07778
Packit a07778
    os_type_node = gvir_config_xml_get_element(os_node, "type", NULL);
Packit a07778
    g_return_if_fail(os_type_node != NULL);
Packit a07778
Packit a07778
    xmlNewProp(os_type_node, (xmlChar*)"machine", (xmlChar*)machine);
Packit a07778
}
Packit a07778
Packit a07778
void gvir_config_domain_os_set_firmware(GVirConfigDomainOs *os, GVirConfigDomainOsFirmware firmware)
Packit a07778
{
Packit a07778
    xmlNodePtr node;
Packit a07778
    const gchar *firmware_str;
Packit a07778
Packit a07778
    g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os));
Packit a07778
Packit a07778
    node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(os));
Packit a07778
    g_return_if_fail(node != NULL);
Packit a07778
Packit a07778
    firmware_str = gvir_config_genum_get_nick(GVIR_CONFIG_TYPE_DOMAIN_OS_FIRMWARE,
Packit a07778
                   firmware);
Packit a07778
    g_return_if_fail(firmware_str != NULL);
Packit a07778
Packit a07778
    xmlNewProp(node, (xmlChar*)"firmware", (xmlChar*)firmware_str);
Packit a07778
}
Packit a07778
Packit a07778
GVirConfigDomainOsFirmware gvir_config_domain_os_get_firmware(GVirConfigDomainOs *os)
Packit a07778
{
Packit a07778
    g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_OS(os),
Packit a07778
                         GVIR_CONFIG_DOMAIN_OS_FIRMWARE_BIOS);
Packit a07778
Packit a07778
    return gvir_config_object_get_attribute_genum
Packit a07778
            (GVIR_CONFIG_OBJECT(os),
Packit a07778
             NULL, "firmware",
Packit a07778
             GVIR_CONFIG_TYPE_DOMAIN_OS_FIRMWARE,
Packit a07778
             GVIR_CONFIG_DOMAIN_OS_FIRMWARE_BIOS);
Packit a07778
}