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 | 190 +++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-domain-hostdev.h | 76 +++++++++ libvirt-gconfig/libvirt-gconfig.h | 1 + libvirt-gconfig/libvirt-gconfig.sym | 10 ++ 7 files changed, 283 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 f308539..a7c6c4e 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..205878e --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-domain-hostdev.c @@ -0,0 +1,190 @@ +/* + * libvirt-gconfig-domain-hostdev.c: libvirt domain hostdev configuration + * + * Copyright (C) 2016 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; +} + +/** + * gvir_config_domain_hostdev_set_boot_order: + * @hostdev: the host device + * @order: the boot order + * + * If a positive integer is passed as @order, @hostdev is marked bootable and + * boot order set to @order, otherwise @hostdev is marked to be unbootable. + */ +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); + } +} + +/** + * gvir_config_domain_hostdev_get_boot_order: + * @hostdev: the host device + * + * Returns: The boot order if @hostdev is bootable, otherwise a negative integer. + */ +gint gvir_config_domain_hostdev_get_boot_order(GVirConfigDomainHostdev *hostdev) +{ + return gvir_config_object_get_attribute_uint64(GVIR_CONFIG_OBJECT(hostdev), + "boot", "order", -1); +} + +/** + * gvir_config_domain_hostdev_set_readonly: + * @hostdev: the host device + * @readonly: the new readonly status + * + * Set the readonly status of @hostdev to @readonly. + */ +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; + + 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); + } +} + +/** + * gvir_config_domain_hostdev_get_readonly: + * @hostdev: the host device + * + * Returns: %TRUE if @hostdev is readonly, %FALSE otherwise. + */ +gboolean gvir_config_domain_hostdev_get_readonly(GVirConfigDomainHostdev *hostdev) +{ + return gvir_config_object_has_child(GVIR_CONFIG_OBJECT(hostdev), + "readonly"); +} + +/** + * gvir_config_domain_hostdev_set_shareable: + * @hostdev: the host device + * @shareable: the new shareable status + * + * Set the whether or not @hostdev is shared between domains. + */ +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; + + 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); + } +} + +/** + * gvir_config_domain_hostdev_get_shareable: + * @hostdev: the host device + * + * Returns: %TRUE if @hostdev is shared between domains, %FALSE otherwise. + */ +gboolean gvir_config_domain_hostdev_get_shareable(GVirConfigDomainHostdev *hostdev) +{ + return gvir_config_object_has_child(GVIR_CONFIG_OBJECT(hostdev), + "shareable"); +} diff --git a/libvirt-gconfig/libvirt-gconfig-domain-hostdev.h b/libvirt-gconfig/libvirt-gconfig-domain-hostdev.h new file mode 100644 index 0000000..1372552 --- /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) 2016 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 f11f97a..1cfc6eb 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -734,7 +734,17 @@ global: } LIBVIRT_GCONFIG_0.2.1; LIBVIRT_GCONFIG_0.2.4 { +global: gvir_config_domain_graphics_spice_set_gl; + + 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; + gvir_config_domain_video_set_accel3d; } LIBVIRT_GCONFIG_0.2.2; -- 2.5.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list