Add API to read and write domain/devices/hostdev nodes. This patch only adds the baseclass and hence is not useful on it's own. A more specific subclass to represent PCI devices will be added in a following patch. --- libvirt-gconfig/Makefile.am | 2 + .../libvirt-gconfig-domain-device-private.h | 3 + libvirt-gconfig/libvirt-gconfig-domain-device.c | 2 +- libvirt-gconfig/libvirt-gconfig-domain-hostdev.c | 180 +++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-domain-hostdev.h | 76 +++++++++ libvirt-gconfig/libvirt-gconfig.h | 1 + libvirt-gconfig/libvirt-gconfig.sym | 11 ++ 7 files changed, 274 insertions(+), 1 deletion(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-domain-hostdev.c create mode 100644 libvirt-gconfig/libvirt-gconfig-domain-hostdev.h diff --git a/libvirt-gconfig/Makefile.am b/libvirt-gconfig/Makefile.am index 77b2032..4294bab 100644 --- a/libvirt-gconfig/Makefile.am +++ b/libvirt-gconfig/Makefile.am @@ -50,6 +50,7 @@ GCONFIG_HEADER_FILES = \ libvirt-gconfig-domain-graphics-sdl.h \ libvirt-gconfig-domain-graphics-spice.h \ libvirt-gconfig-domain-graphics-vnc.h \ + libvirt-gconfig-domain-hostdev.h \ libvirt-gconfig-domain-input.h \ libvirt-gconfig-domain-interface.h \ libvirt-gconfig-domain-interface-bridge.h \ @@ -141,6 +142,7 @@ GCONFIG_SOURCE_FILES = \ libvirt-gconfig-domain-graphics-sdl.c \ libvirt-gconfig-domain-graphics-spice.c \ libvirt-gconfig-domain-graphics-vnc.c \ + libvirt-gconfig-domain-hostdev.c \ libvirt-gconfig-domain-input.c \ libvirt-gconfig-domain-interface.c \ libvirt-gconfig-domain-interface-bridge.c \ diff --git a/libvirt-gconfig/libvirt-gconfig-domain-device-private.h b/libvirt-gconfig/libvirt-gconfig-domain-device-private.h index 062c0e2..c45e1df 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-device-private.h +++ b/libvirt-gconfig/libvirt-gconfig-domain-device-private.h @@ -43,6 +43,9 @@ GVirConfigDomainDevice * gvir_config_domain_graphics_new_from_tree(GVirConfigXmlDoc *doc, xmlNodePtr tree); GVirConfigDomainDevice * +gvir_config_domain_hostdev_new_from_tree(GVirConfigXmlDoc *doc, + xmlNodePtr tree); +GVirConfigDomainDevice * gvir_config_domain_interface_new_from_tree(GVirConfigXmlDoc *doc, xmlNodePtr tree); GVirConfigDomainDevice * diff --git a/libvirt-gconfig/libvirt-gconfig-domain-device.c b/libvirt-gconfig/libvirt-gconfig-domain-device.c index 3d2b9b3..8a75cea 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-device.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-device.c @@ -66,7 +66,7 @@ gvir_config_domain_device_new_from_tree(GVirConfigXmlDoc *doc, } else if (xmlStrEqual(tree->name, (xmlChar*)"lease")) { goto unimplemented; } else if (xmlStrEqual(tree->name, (xmlChar*)"hostdev")) { - goto unimplemented; + return gvir_config_domain_hostdev_new_from_tree(doc, tree); } else if (xmlStrEqual(tree->name, (xmlChar*)"redirdev")) { type = GVIR_CONFIG_TYPE_DOMAIN_REDIRDEV; } else if (xmlStrEqual(tree->name, (xmlChar*)"smartcard")) { diff --git a/libvirt-gconfig/libvirt-gconfig-domain-hostdev.c b/libvirt-gconfig/libvirt-gconfig-domain-hostdev.c new file mode 100644 index 0000000..42eb184 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-domain-hostdev.c @@ -0,0 +1,180 @@ +/* + * libvirt-gconfig-domain-hostdev.c: libvirt domain hostdev configuration + * + * Copyright (C) 2012 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: Zeeshan Ali (Khattak) <zeeshanak@xxxxxxxxx> + * Christophe Fergeau <cfergeau@xxxxxxxxxx> + */ + +#include <config.h> + +#include "libvirt-gconfig/libvirt-gconfig.h" +#include "libvirt-gconfig/libvirt-gconfig-private.h" + +#define GVIR_CONFIG_DOMAIN_HOSTDEV_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_CONFIG_TYPE_DOMAIN_HOSTDEV, GVirConfigDomainHostdevPrivate)) + +struct _GVirConfigDomainHostdevPrivate +{ + gboolean unused; +}; + +G_DEFINE_ABSTRACT_TYPE(GVirConfigDomainHostdev, gvir_config_domain_hostdev, GVIR_CONFIG_TYPE_DOMAIN_DEVICE); + + +static void gvir_config_domain_hostdev_class_init(GVirConfigDomainHostdevClass *klass) +{ + g_type_class_add_private(klass, sizeof(GVirConfigDomainHostdevPrivate)); +} + + +static void gvir_config_domain_hostdev_init(GVirConfigDomainHostdev *hostdev) +{ + hostdev->priv = GVIR_CONFIG_DOMAIN_HOSTDEV_GET_PRIVATE(hostdev); +} + +G_GNUC_INTERNAL GVirConfigDomainDevice * +gvir_config_domain_hostdev_new_from_tree(GVirConfigXmlDoc *doc, + xmlNodePtr tree) +{ + const char *type; + GType gtype; + + type = gvir_config_xml_get_attribute_content(tree, "type"); + if (type == NULL) + return NULL; + + if (g_str_equal(type, "usb")) { + goto unimplemented; + } else if (g_str_equal(type, "pci")) { + goto unimplemented; + } else if (g_str_equal(type, "scsi")) { + goto unimplemented; + } else { + g_debug("Unknown domain hostdev node: %s", type); + return NULL; + } + + return GVIR_CONFIG_DOMAIN_DEVICE(gvir_config_object_new_from_tree(gtype, doc, NULL, tree)); + +unimplemented: + g_debug("Parsing of '%s' domain hostdev nodes is unimplemented", type); + return NULL; +} + +void gvir_config_domain_hostdev_set_boot_order(GVirConfigDomainHostdev *hostdev, + gint order) +{ + g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_HOSTDEV(hostdev)); + + if (order >= 0) { + char *order_str = g_strdup_printf("%u", order); + + gvir_config_object_replace_child_with_attribute(GVIR_CONFIG_OBJECT(hostdev), + "boot", + "order", + order_str); + g_free(order_str); + } else { + gvir_config_object_delete_child(GVIR_CONFIG_OBJECT(hostdev), + "boot", + NULL); + } +} + +gint gvir_config_domain_hostdev_get_boot_order(GVirConfigDomainHostdev *hostdev) +{ + xmlNodePtr hostdev_node; + xmlNodePtr boot_node; + const char *order_str; + char *end; + guint order; + + g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_HOSTDEV(hostdev), -1); + + hostdev_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(hostdev)); + g_return_val_if_fail(hostdev_node != NULL, -1); + + boot_node = gvir_config_xml_get_element(hostdev_node, "boot", NULL); + if (boot_node == NULL) + return -1; + + order_str = gvir_config_xml_get_attribute_content(boot_node, "order"); + g_return_val_if_fail(order_str != NULL, -1); + + order = strtoul(order_str, &end, 0); + g_return_val_if_fail(*end == '\0', -1); + + return order; +} + +void gvir_config_domain_hostdev_set_readonly(GVirConfigDomainHostdev *hostdev, + gboolean readonly) +{ + g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_HOSTDEV(hostdev)); + + if (readonly) { + GVirConfigObject *node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(hostdev), "readonly"); + g_object_unref(node); + } else { + gvir_config_object_delete_child(GVIR_CONFIG_OBJECT(hostdev), "readonly", NULL); + } +} + +gboolean gvir_config_domain_hostdev_get_readonly(GVirConfigDomainHostdev *hostdev) +{ + xmlNodePtr hostdev_node; + xmlNodePtr ro_node; + + g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_HOSTDEV(hostdev), FALSE); + + hostdev_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(hostdev)); + g_return_val_if_fail(hostdev_node != NULL, FALSE); + + ro_node = gvir_config_xml_get_element(hostdev_node, "readonly", NULL); + + return (ro_node != NULL); +} + +void gvir_config_domain_hostdev_set_shareable(GVirConfigDomainHostdev *hostdev, + gboolean shareable) +{ + g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_HOSTDEV(hostdev)); + + if (shareable) { + GVirConfigObject *node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(hostdev), "shareable"); + g_object_unref(node); + } else { + gvir_config_object_delete_child(GVIR_CONFIG_OBJECT(hostdev), "shareable", NULL); + } +} + +gboolean gvir_config_domain_hostdev_get_shareable(GVirConfigDomainHostdev *hostdev) +{ + xmlNodePtr hostdev_node; + xmlNodePtr shareable_node; + + g_return_val_if_fail(GVIR_CONFIG_IS_DOMAIN_HOSTDEV(hostdev), FALSE); + + hostdev_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(hostdev)); + g_return_val_if_fail(hostdev_node != NULL, FALSE); + + shareable_node = gvir_config_xml_get_element(hostdev_node, "shareable", NULL); + + return (shareable_node != NULL); +} diff --git a/libvirt-gconfig/libvirt-gconfig-domain-hostdev.h b/libvirt-gconfig/libvirt-gconfig-domain-hostdev.h new file mode 100644 index 0000000..b26100f --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-domain-hostdev.h @@ -0,0 +1,76 @@ +/* + * libvirt-gconfig-domain-hostdev.h: libvirt domain hostdev configuration + * + * Copyright (C) 2012 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: Zeeshan Ali (Khattak) <zeeshanak@xxxxxxxxx> + * Christophe Fergeau <cfergeau@xxxxxxxxxx> + */ + +#if !defined(__LIBVIRT_GCONFIG_H__) && !defined(LIBVIRT_GCONFIG_BUILD) +#error "Only <libvirt-gconfig/libvirt-gconfig.h> can be included directly." +#endif + +#ifndef __LIBVIRT_GCONFIG_DOMAIN_HOSTDEV_H__ +#define __LIBVIRT_GCONFIG_DOMAIN_HOSTDEV_H__ + +G_BEGIN_DECLS + +#define GVIR_CONFIG_TYPE_DOMAIN_HOSTDEV (gvir_config_domain_hostdev_get_type ()) +#define GVIR_CONFIG_DOMAIN_HOSTDEV(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GVIR_CONFIG_TYPE_DOMAIN_HOSTDEV, GVirConfigDomainHostdev)) +#define GVIR_CONFIG_DOMAIN_HOSTDEV_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GVIR_CONFIG_TYPE_DOMAIN_HOSTDEV, GVirConfigDomainHostdevClass)) +#define GVIR_CONFIG_IS_DOMAIN_HOSTDEV(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GVIR_CONFIG_TYPE_DOMAIN_HOSTDEV)) +#define GVIR_CONFIG_IS_DOMAIN_HOSTDEV_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GVIR_CONFIG_TYPE_DOMAIN_HOSTDEV)) +#define GVIR_CONFIG_DOMAIN_HOSTDEV_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GVIR_CONFIG_TYPE_DOMAIN_HOSTDEV, GVirConfigDomainHostdevClass)) + +typedef struct _GVirConfigDomainHostdev GVirConfigDomainHostdev; +typedef struct _GVirConfigDomainHostdevPrivate GVirConfigDomainHostdevPrivate; +typedef struct _GVirConfigDomainHostdevClass GVirConfigDomainHostdevClass; + +struct _GVirConfigDomainHostdev +{ + GVirConfigDomainDevice parent; + + GVirConfigDomainHostdevPrivate *priv; + + /* Do not add fields to this struct */ +}; + +struct _GVirConfigDomainHostdevClass +{ + GVirConfigDomainDeviceClass parent_class; + + gpointer padding[20]; +}; + +GType gvir_config_domain_hostdev_get_type(void); + +void gvir_config_domain_hostdev_set_boot_order(GVirConfigDomainHostdev *hostdev, + gint order); +gint gvir_config_domain_hostdev_get_boot_order(GVirConfigDomainHostdev *hostdev); + +void gvir_config_domain_hostdev_set_readonly(GVirConfigDomainHostdev *hostdev, + gboolean readonly); +gboolean gvir_config_domain_hostdev_get_readonly(GVirConfigDomainHostdev *hostdev); + +void gvir_config_domain_hostdev_set_shareable(GVirConfigDomainHostdev *hostdev, + gboolean shareable); +gboolean gvir_config_domain_hostdev_get_shareable(GVirConfigDomainHostdev *hostdev); + +G_END_DECLS + +#endif /* __LIBVIRT_GCONFIG_DOMAIN_HOSTDEV_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig.h b/libvirt-gconfig/libvirt-gconfig.h index 4624003..cfa9dd3 100644 --- a/libvirt-gconfig/libvirt-gconfig.h +++ b/libvirt-gconfig/libvirt-gconfig.h @@ -67,6 +67,7 @@ #include <libvirt-gconfig/libvirt-gconfig-domain-graphics-sdl.h> #include <libvirt-gconfig/libvirt-gconfig-domain-graphics-spice.h> #include <libvirt-gconfig/libvirt-gconfig-domain-graphics-vnc.h> +#include <libvirt-gconfig/libvirt-gconfig-domain-hostdev.h> #include <libvirt-gconfig/libvirt-gconfig-domain-input.h> #include <libvirt-gconfig/libvirt-gconfig-domain-interface.h> #include <libvirt-gconfig/libvirt-gconfig-domain-interface-bridge.h> diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 89dd589..0a12ce4 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -733,4 +733,15 @@ global: gvir_config_domain_video_set_vgamem; } LIBVIRT_GCONFIG_0.2.1; +LIBVIRT_GCONFIG_0.2.3 { +global: + gvir_config_domain_hostdev_get_boot_order; + gvir_config_domain_hostdev_get_readonly; + gvir_config_domain_hostdev_get_shareable; + gvir_config_domain_hostdev_get_type; + gvir_config_domain_hostdev_set_boot_order; + gvir_config_domain_hostdev_set_readonly; + gvir_config_domain_hostdev_set_shareable; +} LIBVIRT_GCONFIG_0.2.2; + # .... define new API here using predicted next version number .... -- 2.5.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list