-- v2: merged several related commits use safer g_strcmp0 for string comparison use g_return_if_fail to test function args for sanity --- libvirt-gconfig/libvirt-gconfig-os.c | 138 ++++++++++++++++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-os.h | 27 +++++++ libvirt-gconfig/libvirt-gconfig.sym | 11 +++ 3 files changed, 176 insertions(+), 0 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-os.c b/libvirt-gconfig/libvirt-gconfig-os.c index c09e32a..b430eb6 100644 --- a/libvirt-gconfig/libvirt-gconfig-os.c +++ b/libvirt-gconfig/libvirt-gconfig-os.c @@ -27,6 +27,8 @@ #include <libxml/tree.h> #include "libvirt-gconfig/libvirt-gconfig.h" +#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" +#include "libvirt-gconfig/libvirt-gconfig-object-private.h" extern gboolean debugFlag; @@ -77,3 +79,139 @@ GVirConfigOs *gvir_config_os_new_from_xml(const gchar *xml, GError **error) NULL, xml, error); return GVIR_CONFIG_OS(object); } + +void gvir_config_os_set_os_type(GVirConfigOs *os, GVirConfigOsType type) +{ + xmlNodePtr node; + const char *type_str; + + g_return_if_fail(GVIR_IS_CONFIG_OS(os)); + + node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(os), "type"); + g_return_if_fail(node != NULL); + type_str = gvir_config_genum_get_nick(GVIR_TYPE_CONFIG_OS_TYPE, type); + g_return_if_fail(type_str != NULL); + xmlNodeSetContent(node, (xmlChar*)type_str); +} + +void gvir_config_os_set_loader(GVirConfigOs *os, const char * loader) +{ + gvir_config_object_set_node_content(GVIR_CONFIG_OBJECT(os), + "loader", loader); +} + +void gvir_config_os_enable_boot_menu(GVirConfigOs *os, gboolean enable) +{ + xmlNodePtr node; + + g_return_if_fail(GVIR_IS_CONFIG_OS(os)); + + node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(os), "bootmenu"); + g_return_if_fail(node != NULL); + if (enable) + xmlNewProp(node, (xmlChar*)"enable", (xmlChar*)"yes"); + else + xmlNewProp(node, (xmlChar*)"enable", (xmlChar*)"no"); +} + +void gvir_config_os_bios_enable_serial(GVirConfigOs *os, gboolean enable) +{ + xmlNodePtr node; + + g_return_if_fail(GVIR_IS_CONFIG_OS(os)); + + node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(os), "bios"); + g_return_if_fail(node != NULL); + if (enable) + xmlNewProp(node, (xmlChar*)"useserial", (xmlChar*)"yes"); + else + xmlNewProp(node, (xmlChar*)"useserial", (xmlChar*)"no"); +} + +void gvir_config_os_set_smbios_mode(GVirConfigOs *os, + GVirConfigOsSmBiosMode mode) +{ + xmlNodePtr node; + const char *mode_str; + + g_return_if_fail(GVIR_IS_CONFIG_OS(os)); + + node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(os), "smbios"); + g_return_if_fail(node != NULL); + mode_str = gvir_config_genum_get_nick(GVIR_TYPE_CONFIG_OS_SM_BIOS_MODE, + mode); + if (mode_str != NULL) + xmlNewProp(node, (xmlChar*)"mode", (xmlChar*)mode_str); +} + +/** + * gvir_config_os_set_boot_devices: + * @boot_devices: (in) (element-type LibvirtGConfig.OsBootDevice): + */ +void gvir_config_os_set_boot_devices(GVirConfigOs *os, GList *boot_devices) +{ + GList *it; + xmlNodePtr os_node; + xmlNodePtr node; + + g_return_if_fail(GVIR_IS_CONFIG_OS(os)); + + os_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(os)); + g_return_if_fail(os_node != NULL); + + node = os_node->children; + while (node != NULL) { + xmlNodePtr next_node; + next_node = node->next; + if (g_strcmp0("boot", (char *)node->name) == 0) { + xmlUnlinkNode(node); + xmlFreeNode(node); + } + node = next_node; + } + + for (it = boot_devices; it != NULL; it = it->next) { + const char *dev; + + dev = gvir_config_genum_get_nick(GVIR_TYPE_CONFIG_OS_BOOT_DEVICE, + GPOINTER_TO_INT(it->data)); + g_warn_if_fail(dev != NULL); + if (dev != NULL) { + node = xmlNewDocNode(NULL, NULL, (xmlChar*)"boot", NULL); + xmlNewProp(node, (xmlChar*)"dev", (xmlChar*)dev); + xmlAddChild(os_node, node); + } + } +} + +void gvir_config_os_set_arch(GVirConfigOs *os, const char *arch) +{ + xmlNodePtr os_node; + xmlNodePtr os_type_node; + + g_return_if_fail(GVIR_IS_CONFIG_OS(os)); + + os_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(os)); + g_return_if_fail(os_node != NULL); + + os_type_node = gvir_config_xml_get_element(os_node, "type", NULL); + g_return_if_fail(os_type_node != NULL); + + xmlNewProp(os_type_node, (xmlChar*)"arch", (xmlChar*)arch); +} + +void gvir_config_os_set_machine(GVirConfigOs *os, const char *machine) +{ + xmlNodePtr os_node; + xmlNodePtr os_type_node; + + g_return_if_fail(GVIR_IS_CONFIG_OS(os)); + + os_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(os)); + g_return_if_fail(os_node != NULL); + + os_type_node = gvir_config_xml_get_element(os_node, "type", NULL); + g_return_if_fail(os_type_node != NULL); + + xmlNewProp(os_type_node, (xmlChar*)"machine", (xmlChar*)machine); +} diff --git a/libvirt-gconfig/libvirt-gconfig-os.h b/libvirt-gconfig/libvirt-gconfig-os.h index 716f588..b789eb3 100644 --- a/libvirt-gconfig/libvirt-gconfig-os.h +++ b/libvirt-gconfig/libvirt-gconfig-os.h @@ -56,12 +56,39 @@ struct _GVirConfigOsClass gpointer padding[20]; }; +typedef enum { + GVIR_CONFIG_OS_TYPE_HVM, + GVIR_CONFIG_OS_TYPE_LINUX +} GVirConfigOsType; + +typedef enum { + GVIR_CONFIG_OS_SMBIOS_MODE_EMULATE, + GVIR_CONFIG_OS_SMBIOS_MODE_HOST, + GVIR_CONFIG_OS_SMBIOS_MODE_SYSINFO +} GVirConfigOsSmBiosMode; + +typedef enum { + GVIR_CONFIG_OS_BOOT_DEVICE_FD, + GVIR_CONFIG_OS_BOOT_DEVICE_HD, + GVIR_CONFIG_OS_BOOT_DEVICE_CDROM, + GVIR_CONFIG_OS_BOOT_DEVICE_NETWORK +} GVirConfigOsBootDevice; GType gvir_config_os_get_type(void); GVirConfigOs *gvir_config_os_new(void); GVirConfigOs *gvir_config_os_new_from_xml(const gchar *xml, GError **error); +void gvir_config_os_set_os_type(GVirConfigOs *os, GVirConfigOsType type); +void gvir_config_os_set_arch(GVirConfigOs *os, const char *arch); +void gvir_config_os_set_boot_devices(GVirConfigOs *os, GList *boot_devices); +void gvir_config_os_set_loader(GVirConfigOs *os, const char * loader); +void gvir_config_os_set_machine(GVirConfigOs *os, const char *machine); +void gvir_config_os_set_smbios_mode(GVirConfigOs *os, + GVirConfigOsSmBiosMode mode); +void gvir_config_os_enable_boot_menu(GVirConfigOs *os, gboolean enable); +void gvir_config_os_bios_enable_serial(GVirConfigOs *os, gboolean enable); + G_END_DECLS #endif /* __LIBVIRT_GCONFIG_OS_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 138b80f..1a924c1 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -51,8 +51,19 @@ LIBVIRT_GOBJECT_0.0.1 { gvir_config_object_validate; gvir_config_os_get_type; + gvir_config_os_boot_device_get_type; + gvir_config_os_sm_bios_mode_get_type; + gvir_config_os_type_get_type; gvir_config_os_new; gvir_config_os_new_from_xml; + gvir_config_os_set_os_type; + gvir_config_os_set_boot_devices; + gvir_config_os_set_loader; + gvir_config_os_set_smbios_mode; + gvir_config_os_enable_boot_menu; + gvir_config_os_bios_enable_serial; + gvir_config_os_set_machine; + gvir_config_os_set_arch; gvir_config_secret_get_type; gvir_config_secret_new; -- 1.7.7.3 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list