Hi, On Mon, Jul 18, 2016 at 3:54 PM, Christophe Fergeau <cfergeau@xxxxxxxxxx> wrote: > Please add a gconfig: prefix to the subject line. I have a custom git command to add 'libvirt-glib' prefix but I keep forgetting that --subject-prefix gets overriden by the second --subject-prefix I manually specify for adding patch series version. > Acked-by: Christophe Fergeau <cfergeau@xxxxxxxxxx> > > Christophe > > On Wed, Jul 06, 2016 at 10:45:52PM +0100, Zeeshan Ali (Khattak) wrote: >> 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..ce5f8aa >> --- /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 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.7.4 >> >> -- >> libvir-list mailing list >> libvir-list@xxxxxxxxxx >> https://www.redhat.com/mailman/listinfo/libvir-list -- Regards, Zeeshan Ali (Khattak) -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list