On Thu, Jan 09, 2014 at 12:19:52PM +0100, Christophe Fergeau wrote: > Hey, > > Wouldn't something like the patch below help to remove the code duplication > in libvirt-sandbox-config-builder-{container,machine}.c ? > > Christophe ACK. This is a good change for sure. Christophe, I see you have commit privs for this repo, can you push these patches? Thanks! Ian > From 0f17bab6c4d9ef495d24d534d4422ae6502cdb8b Mon Sep 17 00:00:00 2001 > From: Christophe Fergeau <cfergeau@xxxxxxxxxx> > Date: Thu, 9 Jan 2014 12:18:53 +0100 > Subject: [libvirt-sandbox] Factor common > libvirt-sandbox-builder-{container,machine}.c > > --- > libvirt-sandbox/Makefile.am | 1 + > .../libvirt-sandbox-builder-container.c | 34 +++--------------- > libvirt-sandbox/libvirt-sandbox-builder-machine.c | 38 +++----------------- > libvirt-sandbox/libvirt-sandbox-builder-private.h | 38 ++++++++++++++++++++ > libvirt-sandbox/libvirt-sandbox-builder.c | 40 ++++++++++++++++++++++ > 5 files changed, 88 insertions(+), 63 deletions(-) > create mode 100644 libvirt-sandbox/libvirt-sandbox-builder-private.h > > diff --git a/libvirt-sandbox/Makefile.am b/libvirt-sandbox/Makefile.am > index 720bb06..7dc2b62 100644 > --- a/libvirt-sandbox/Makefile.am > +++ b/libvirt-sandbox/Makefile.am > @@ -105,6 +105,7 @@ SANDBOX_SOURCE_FILES = \ > libvirt-sandbox-builder-initrd.c \ > libvirt-sandbox-builder-machine.c \ > libvirt-sandbox-builder-container.c \ > + libvirt-sandbox-builder-private.h \ > libvirt-sandbox-console.c \ > libvirt-sandbox-console-raw.c \ > libvirt-sandbox-console-rpc.c \ > diff --git a/libvirt-sandbox/libvirt-sandbox-builder-container.c b/libvirt-sandbox/libvirt-sandbox-builder-container.c > index bac8c70..c3a58b2 100644 > --- a/libvirt-sandbox/libvirt-sandbox-builder-container.c > +++ b/libvirt-sandbox/libvirt-sandbox-builder-container.c > @@ -26,6 +26,7 @@ > #include <glib/gi18n.h> > > #include "libvirt-sandbox/libvirt-sandbox.h" > +#include "libvirt-sandbox/libvirt-sandbox-builder-private.h" > > /** > * SECTION: libvirt-sandbox-builder-container > @@ -325,7 +326,6 @@ static gboolean gvir_sandbox_builder_container_construct_devices(GVirSandboxBuil > const gchar *source, *mac; > GVirSandboxConfigNetwork *network = GVIR_SANDBOX_CONFIG_NETWORK(tmp->data); > GVirSandboxConfigNetworkFilterref *filterref; > - GVirConfigDomainInterfaceFilterref *glib_fref; > > iface = gvir_config_domain_interface_network_new(); > source = gvir_sandbox_config_network_get_source(network); > @@ -344,35 +344,9 @@ static gboolean gvir_sandbox_builder_container_construct_devices(GVirSandboxBuil > > filterref = gvir_sandbox_config_network_get_filterref(network); > if (filterref) { > - GList *param_iter, *parameters; > - const gchar *fref_name = gvir_sandbox_config_network_filterref_get_name(filterref); > - glib_fref = gvir_config_domain_interface_filterref_new(); > - gvir_config_domain_interface_filterref_set_name(glib_fref, fref_name); > - param_iter = parameters = gvir_sandbox_config_network_filterref_get_parameters(filterref); > - while (param_iter) { > - const gchar *name; > - const gchar *value; > - GVirSandboxConfigNetworkFilterrefParameter *param = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(param_iter->data); > - GVirConfigDomainInterfaceFilterrefParameter *glib_param; > - > - name = gvir_sandbox_config_network_filterref_parameter_get_name(param); > - value = gvir_sandbox_config_network_filterref_parameter_get_value(param); > - > - glib_param = gvir_config_domain_interface_filterref_parameter_new(); > - gvir_config_domain_interface_filterref_parameter_set_name(glib_param, name); > - gvir_config_domain_interface_filterref_parameter_set_value(glib_param, value); > - > - gvir_config_domain_interface_filterref_add_parameter(glib_fref, glib_param); > - g_object_unref(glib_param); > - > - param_iter = param_iter->next; > - } > - > - g_list_foreach(parameters, (GFunc)g_object_unref, NULL); > - g_list_free(parameters); > - > - gvir_config_domain_interface_set_filterref(GVIR_CONFIG_DOMAIN_INTERFACE(iface), glib_fref); > - g_object_unref(glib_fref); > + gvir_sandbox_builder_set_filterref(builder, > + GVIR_CONFIG_DOMAIN_INTERFACE(iface), > + filterref); > } > > g_object_unref(iface); > diff --git a/libvirt-sandbox/libvirt-sandbox-builder-machine.c b/libvirt-sandbox/libvirt-sandbox-builder-machine.c > index 542663c..35a5816 100644 > --- a/libvirt-sandbox/libvirt-sandbox-builder-machine.c > +++ b/libvirt-sandbox/libvirt-sandbox-builder-machine.c > @@ -28,6 +28,7 @@ > #include <glib/gi18n.h> > > #include "libvirt-sandbox/libvirt-sandbox.h" > +#include "libvirt-sandbox/libvirt-sandbox-builder-private.h" > > /** > * SECTION: libvirt-sandbox-builder-machine > @@ -582,7 +583,6 @@ static gboolean gvir_sandbox_builder_machine_construct_devices(GVirSandboxBuilde > const gchar *source, *mac; > GVirSandboxConfigNetwork *network = GVIR_SANDBOX_CONFIG_NETWORK(tmp->data); > GVirSandboxConfigNetworkFilterref *filterref; > - GVirConfigDomainInterfaceFilterref *glib_fref; > > source = gvir_sandbox_config_network_get_source(network); > if (source) { > @@ -600,42 +600,14 @@ static gboolean gvir_sandbox_builder_machine_construct_devices(GVirSandboxBuilde > gvir_config_domain_interface_set_model(iface, > "virtio"); > > - gvir_config_domain_add_device(domain, > - GVIR_CONFIG_DOMAIN_DEVICE(iface)); > - > filterref = gvir_sandbox_config_network_get_filterref(network); > if (filterref) { > - GList *param_iter, *parameters; > - const gchar *fref_name = gvir_sandbox_config_network_filterref_get_name(filterref); > - glib_fref = gvir_config_domain_interface_filterref_new(); > - gvir_config_domain_interface_filterref_set_name(glib_fref, fref_name); > - param_iter = parameters = gvir_sandbox_config_network_filterref_get_parameters(filterref); > - while (param_iter) { > - const gchar *name; > - const gchar *value; > - GVirSandboxConfigNetworkFilterrefParameter *param = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(param_iter->data); > - GVirConfigDomainInterfaceFilterrefParameter *glib_param; > - > - name = gvir_sandbox_config_network_filterref_parameter_get_name(param); > - value = gvir_sandbox_config_network_filterref_parameter_get_value(param); > - > - glib_param = gvir_config_domain_interface_filterref_parameter_new(); > - gvir_config_domain_interface_filterref_parameter_set_name(glib_param, name); > - gvir_config_domain_interface_filterref_parameter_set_value(glib_param, value); > - > - gvir_config_domain_interface_filterref_add_parameter(glib_fref, glib_param); > - g_object_unref(glib_param); > - > - param_iter = param_iter->next; > - } > - > - g_list_foreach(parameters, (GFunc)g_object_unref, NULL); > - g_list_free(parameters); > - > - gvir_config_domain_interface_set_filterref(iface, glib_fref); > - g_object_unref(glib_fref); > + gvir_sandbox_builder_set_filterref(builder, iface, filterref); > } > > + gvir_config_domain_add_device(domain, > + GVIR_CONFIG_DOMAIN_DEVICE(iface)); > + > g_object_unref(iface); > > tmp = tmp->next; > diff --git a/libvirt-sandbox/libvirt-sandbox-builder-private.h b/libvirt-sandbox/libvirt-sandbox-builder-private.h > new file mode 100644 > index 0000000..288ec40 > --- /dev/null > +++ b/libvirt-sandbox/libvirt-sandbox-builder-private.h > @@ -0,0 +1,38 @@ > +/* > + * libvirt-sandbox-builder-private.h: libvirt sandbox builder > + * > + * Copyright (C) 2014 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, write to the Free Software > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA > + * > + * Author: Christophe Fergeau <cfergeau@xxxxxxxxxx> > + */ > + > +#if !defined(__LIBVIRT_SANDBOX_H__) && !defined(LIBVIRT_SANDBOX_BUILD) > +#error "Only <libvirt-sandbox/libvirt-sandbox.h> can be included directly." > +#endif > + > +#ifndef __LIBVIRT_SANDBOX_BUILDER_PRIVATE_H__ > +#define __LIBVIRT_SANDBOX_BUILDER_PRIVATE_H__ > + > +G_BEGIN_DECLS > + > +void gvir_sandbox_builder_set_filterref(GVirSandboxBuilder *builder, > + GVirConfigDomainInterface *iface, > + GVirSandboxConfigNetworkFilterref *filterref); > + > +G_END_DECLS > + > +#endif /* __LIBVIRT_SANDBOX_BUILDER_PRIVATE_H__ */ > diff --git a/libvirt-sandbox/libvirt-sandbox-builder.c b/libvirt-sandbox/libvirt-sandbox-builder.c > index ff25a0b..48b3acc 100644 > --- a/libvirt-sandbox/libvirt-sandbox-builder.c > +++ b/libvirt-sandbox/libvirt-sandbox-builder.c > @@ -24,6 +24,7 @@ > #include <string.h> > > #include "libvirt-sandbox/libvirt-sandbox.h" > +#include "libvirt-sandbox/libvirt-sandbox-builder-private.h" > > /** > * SECTION: libvirt-sandbox-builder > @@ -446,6 +447,45 @@ gboolean gvir_sandbox_builder_clean_post_stop(GVirSandboxBuilder *builder, > return klass->clean_post_stop(builder, config, statedir, error); > } > > + > +void gvir_sandbox_builder_set_filterref(GVirSandboxBuilder *builder, > + GVirConfigDomainInterface *iface, > + GVirSandboxConfigNetworkFilterref *filterref) > +{ > + GVirConfigDomainInterfaceFilterref *glib_fref; > + > + GList *param_iter, *parameters; > + const gchar *fref_name = gvir_sandbox_config_network_filterref_get_name(filterref); > + > + glib_fref = gvir_config_domain_interface_filterref_new(); > + gvir_config_domain_interface_filterref_set_name(glib_fref, fref_name); > + param_iter = parameters = gvir_sandbox_config_network_filterref_get_parameters(filterref); > + while (param_iter) { > + const gchar *name; > + const gchar *value; > + GVirSandboxConfigNetworkFilterrefParameter *param = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(param_iter->data); > + GVirConfigDomainInterfaceFilterrefParameter *glib_param; > + > + name = gvir_sandbox_config_network_filterref_parameter_get_name(param); > + value = gvir_sandbox_config_network_filterref_parameter_get_value(param); > + > + glib_param = gvir_config_domain_interface_filterref_parameter_new(); > + gvir_config_domain_interface_filterref_parameter_set_name(glib_param, name); > + gvir_config_domain_interface_filterref_parameter_set_value(glib_param, value); > + > + gvir_config_domain_interface_filterref_add_parameter(glib_fref, glib_param); > + g_object_unref(glib_param); > + > + param_iter = param_iter->next; > + } > + > + g_list_foreach(parameters, (GFunc)g_object_unref, NULL); > + g_list_free(parameters); > + > + gvir_config_domain_interface_set_filterref(iface, glib_fref); > + g_object_unref(glib_fref); > +} > + > /* > * Local variables: > * c-indent-level: 4 > -- > 1.8.4.2 > > On Wed, Jan 08, 2014 at 05:04:10PM -0800, Ian Main wrote: > > This patch adds two new classes, filterref and filterref-parameter. > > Network interfaces can now have an associated filter reference with any > > number of filterref parameters. Also added filter= option to > > virt-sandbox tool. > > > > --- > > V2: > > > > - Changed set_filter to set_name and get_filter to get_name. > > > > V3: > > > > - Added type checks on all public methods. > > - Call setters on property set. > > - Fix install_property flags. > > - Remove unneeded HANDLE defines. > > - Add missing g_list_free(). > > - Add missing unref(). > > - Fixed names in copyright notices. > > - Change order of files in Makefile.am > > > > libvirt-sandbox/Makefile.am | 4 + > > .../libvirt-sandbox-builder-container.c | 36 ++++ > > libvirt-sandbox/libvirt-sandbox-builder-machine.c | 36 ++++ > > ...rt-sandbox-config-network-filterref-parameter.c | 208 ++++++++++++++++++++ > > ...rt-sandbox-config-network-filterref-parameter.h | 73 +++++++ > > .../libvirt-sandbox-config-network-filterref.c | 218 +++++++++++++++++++++ > > .../libvirt-sandbox-config-network-filterref.h | 74 +++++++ > > libvirt-sandbox/libvirt-sandbox-config-network.c | 42 ++++ > > libvirt-sandbox/libvirt-sandbox-config-network.h | 4 + > > libvirt-sandbox/libvirt-sandbox-config.c | 39 ++++ > > libvirt-sandbox/libvirt-sandbox.h | 3 + > > libvirt-sandbox/libvirt-sandbox.sym | 16 ++ > > 12 files changed, 753 insertions(+) > > create mode 100644 libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.c > > create mode 100644 libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.h > > create mode 100644 libvirt-sandbox/libvirt-sandbox-config-network-filterref.c > > create mode 100644 libvirt-sandbox/libvirt-sandbox-config-network-filterref.h > > > > diff --git a/libvirt-sandbox/Makefile.am b/libvirt-sandbox/Makefile.am > > index 0882490..720bb06 100644 > > --- a/libvirt-sandbox/Makefile.am > > +++ b/libvirt-sandbox/Makefile.am > > @@ -57,6 +57,8 @@ SANDBOX_HEADER_FILES = \ > > libvirt-sandbox-config.h \ > > libvirt-sandbox-config-network.h \ > > libvirt-sandbox-config-network-address.h \ > > + libvirt-sandbox-config-network-filterref-parameter.h \ > > + libvirt-sandbox-config-network-filterref.h \ > > libvirt-sandbox-config-network-route.h \ > > libvirt-sandbox-config-mount.h \ > > libvirt-sandbox-config-mount-file.h \ > > @@ -85,6 +87,8 @@ SANDBOX_SOURCE_FILES = \ > > libvirt-sandbox-config.c \ > > libvirt-sandbox-config-network.c \ > > libvirt-sandbox-config-network-address.c \ > > + libvirt-sandbox-config-network-filterref.c \ > > + libvirt-sandbox-config-network-filterref-parameter.c \ > > libvirt-sandbox-config-network-route.c \ > > libvirt-sandbox-config-mount.c \ > > libvirt-sandbox-config-mount-file.c \ > > diff --git a/libvirt-sandbox/libvirt-sandbox-builder-container.c b/libvirt-sandbox/libvirt-sandbox-builder-container.c > > index 43ee5ef..bac8c70 100644 > > --- a/libvirt-sandbox/libvirt-sandbox-builder-container.c > > +++ b/libvirt-sandbox/libvirt-sandbox-builder-container.c > > @@ -324,6 +324,8 @@ static gboolean gvir_sandbox_builder_container_construct_devices(GVirSandboxBuil > > while (tmp) { > > const gchar *source, *mac; > > GVirSandboxConfigNetwork *network = GVIR_SANDBOX_CONFIG_NETWORK(tmp->data); > > + GVirSandboxConfigNetworkFilterref *filterref; > > + GVirConfigDomainInterfaceFilterref *glib_fref; > > > > iface = gvir_config_domain_interface_network_new(); > > source = gvir_sandbox_config_network_get_source(network); > > @@ -339,6 +341,40 @@ static gboolean gvir_sandbox_builder_container_construct_devices(GVirSandboxBuil > > > > gvir_config_domain_add_device(domain, > > GVIR_CONFIG_DOMAIN_DEVICE(iface)); > > + > > + filterref = gvir_sandbox_config_network_get_filterref(network); > > + if (filterref) { > > + GList *param_iter, *parameters; > > + const gchar *fref_name = gvir_sandbox_config_network_filterref_get_name(filterref); > > + glib_fref = gvir_config_domain_interface_filterref_new(); > > + gvir_config_domain_interface_filterref_set_name(glib_fref, fref_name); > > + param_iter = parameters = gvir_sandbox_config_network_filterref_get_parameters(filterref); > > + while (param_iter) { > > + const gchar *name; > > + const gchar *value; > > + GVirSandboxConfigNetworkFilterrefParameter *param = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(param_iter->data); > > + GVirConfigDomainInterfaceFilterrefParameter *glib_param; > > + > > + name = gvir_sandbox_config_network_filterref_parameter_get_name(param); > > + value = gvir_sandbox_config_network_filterref_parameter_get_value(param); > > + > > + glib_param = gvir_config_domain_interface_filterref_parameter_new(); > > + gvir_config_domain_interface_filterref_parameter_set_name(glib_param, name); > > + gvir_config_domain_interface_filterref_parameter_set_value(glib_param, value); > > + > > + gvir_config_domain_interface_filterref_add_parameter(glib_fref, glib_param); > > + g_object_unref(glib_param); > > + > > + param_iter = param_iter->next; > > + } > > + > > + g_list_foreach(parameters, (GFunc)g_object_unref, NULL); > > + g_list_free(parameters); > > + > > + gvir_config_domain_interface_set_filterref(GVIR_CONFIG_DOMAIN_INTERFACE(iface), glib_fref); > > + g_object_unref(glib_fref); > > + } > > + > > g_object_unref(iface); > > > > tmp = tmp->next; > > diff --git a/libvirt-sandbox/libvirt-sandbox-builder-machine.c b/libvirt-sandbox/libvirt-sandbox-builder-machine.c > > index 131b376..542663c 100644 > > --- a/libvirt-sandbox/libvirt-sandbox-builder-machine.c > > +++ b/libvirt-sandbox/libvirt-sandbox-builder-machine.c > > @@ -581,6 +581,8 @@ static gboolean gvir_sandbox_builder_machine_construct_devices(GVirSandboxBuilde > > while (tmp) { > > const gchar *source, *mac; > > GVirSandboxConfigNetwork *network = GVIR_SANDBOX_CONFIG_NETWORK(tmp->data); > > + GVirSandboxConfigNetworkFilterref *filterref; > > + GVirConfigDomainInterfaceFilterref *glib_fref; > > > > source = gvir_sandbox_config_network_get_source(network); > > if (source) { > > @@ -600,6 +602,40 @@ static gboolean gvir_sandbox_builder_machine_construct_devices(GVirSandboxBuilde > > > > gvir_config_domain_add_device(domain, > > GVIR_CONFIG_DOMAIN_DEVICE(iface)); > > + > > + filterref = gvir_sandbox_config_network_get_filterref(network); > > + if (filterref) { > > + GList *param_iter, *parameters; > > + const gchar *fref_name = gvir_sandbox_config_network_filterref_get_name(filterref); > > + glib_fref = gvir_config_domain_interface_filterref_new(); > > + gvir_config_domain_interface_filterref_set_name(glib_fref, fref_name); > > + param_iter = parameters = gvir_sandbox_config_network_filterref_get_parameters(filterref); > > + while (param_iter) { > > + const gchar *name; > > + const gchar *value; > > + GVirSandboxConfigNetworkFilterrefParameter *param = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(param_iter->data); > > + GVirConfigDomainInterfaceFilterrefParameter *glib_param; > > + > > + name = gvir_sandbox_config_network_filterref_parameter_get_name(param); > > + value = gvir_sandbox_config_network_filterref_parameter_get_value(param); > > + > > + glib_param = gvir_config_domain_interface_filterref_parameter_new(); > > + gvir_config_domain_interface_filterref_parameter_set_name(glib_param, name); > > + gvir_config_domain_interface_filterref_parameter_set_value(glib_param, value); > > + > > + gvir_config_domain_interface_filterref_add_parameter(glib_fref, glib_param); > > + g_object_unref(glib_param); > > + > > + param_iter = param_iter->next; > > + } > > + > > + g_list_foreach(parameters, (GFunc)g_object_unref, NULL); > > + g_list_free(parameters); > > + > > + gvir_config_domain_interface_set_filterref(iface, glib_fref); > > + g_object_unref(glib_fref); > > + } > > + > > g_object_unref(iface); > > > > tmp = tmp->next; > > diff --git a/libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.c b/libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.c > > new file mode 100644 > > index 0000000..fabed90 > > --- /dev/null > > +++ b/libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.c > > @@ -0,0 +1,208 @@ > > +/* > > + * libvirt-sandbox-config-network-filterref-parameter.c: libvirt sandbox configuration > > + * > > + * Copyright (C) 2013 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, write to the Free Software > > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA > > + * > > + * Author: Ian Main <imain@xxxxxxxxxx> > > + */ > > + > > +#include <config.h> > > +#include <string.h> > > + > > +#include "libvirt-sandbox/libvirt-sandbox.h" > > + > > +/** > > + * SECTION: libvirt-sandbox-config-network-filterref-parameter > > + * @short_description: Set parameters for a filter reference. > > + * @include: libvirt-sandbox/libvirt-sandbox.h > > + * > > + * Provides an object to store filter parameter name and value. > > + * > > + * The GVirSandboxConfigNetworkFilterrefParameter object stores a > > + * name and value required to set a single parameter of a filter reference. > > + */ > > + > > +#define GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER_GET_PRIVATE(obj) \ > > + (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF_PARAMETER, GVirSandboxConfigNetworkFilterrefParameterPrivate)) > > + > > +struct _GVirSandboxConfigNetworkFilterrefParameterPrivate > > +{ > > + gchar *name; > > + gchar *value; > > +}; > > + > > +G_DEFINE_TYPE(GVirSandboxConfigNetworkFilterrefParameter, gvir_sandbox_config_network_filterref_parameter, G_TYPE_OBJECT); > > + > > + > > +enum { > > + PROP_0, > > + PROP_NAME, > > + PROP_VALUE, > > +}; > > + > > +enum { > > + LAST_SIGNAL > > +}; > > + > > +//static gint signals[LAST_SIGNAL]; > > + > > + > > +static void gvir_sandbox_config_network_filterref_parameter_get_property(GObject *object, > > + guint prop_id, > > + GValue *value, > > + GParamSpec *pspec) > > +{ > > + GVirSandboxConfigNetworkFilterrefParameter *config = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(object); > > + GVirSandboxConfigNetworkFilterrefParameterPrivate *priv = config->priv; > > + > > + switch (prop_id) { > > + case PROP_NAME: > > + g_value_set_string(value, priv->name); > > + break; > > + > > + case PROP_VALUE: > > + g_value_set_string(value, priv->value); > > + break; > > + > > + default: > > + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); > > + } > > +} > > + > > + > > +static void gvir_sandbox_config_network_filterref_parameter_set_property(GObject *object, > > + guint prop_id, > > + const GValue *value, > > + GParamSpec *pspec) > > +{ > > + GVirSandboxConfigNetworkFilterrefParameter *filter = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(object); > > + > > + switch (prop_id) { > > + case PROP_NAME: > > + gvir_sandbox_config_network_filterref_parameter_set_name(filter, g_value_get_string(value)); > > + break; > > + > > + case PROP_VALUE: > > + gvir_sandbox_config_network_filterref_parameter_set_value(filter, g_value_get_string(value)); > > + break; > > + > > + default: > > + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); > > + } > > +} > > + > > + > > +static void gvir_sandbox_config_network_filterref_parameter_finalize(GObject *object) > > +{ > > + GVirSandboxConfigNetworkFilterrefParameter *config = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(object); > > + GVirSandboxConfigNetworkFilterrefParameterPrivate *priv = config->priv; > > + > > + g_free(priv->name); > > + g_free(priv->value); > > + > > + G_OBJECT_CLASS(gvir_sandbox_config_network_filterref_parameter_parent_class)->finalize(object); > > +} > > + > > + > > +static void gvir_sandbox_config_network_filterref_parameter_class_init(GVirSandboxConfigNetworkFilterrefParameterClass *klass) > > +{ > > + GObjectClass *object_class = G_OBJECT_CLASS(klass); > > + > > + object_class->finalize = gvir_sandbox_config_network_filterref_parameter_finalize; > > + object_class->get_property = gvir_sandbox_config_network_filterref_parameter_get_property; > > + object_class->set_property = gvir_sandbox_config_network_filterref_parameter_set_property; > > + > > + g_object_class_install_property(object_class, > > + PROP_NAME, > > + g_param_spec_string("name", > > + "Name", > > + "Name of parameter", > > + NULL, > > + G_PARAM_READWRITE | > > + G_PARAM_STATIC_STRINGS)); > > + > > + g_object_class_install_property(object_class, > > + PROP_VALUE, > > + g_param_spec_string("value", > > + "Value", > > + "Value of parameter", > > + NULL, > > + G_PARAM_READWRITE | > > + G_PARAM_STATIC_STRINGS)); > > + > > + g_type_class_add_private(klass, sizeof(GVirSandboxConfigNetworkFilterrefParameterPrivate)); > > +} > > + > > + > > +static void gvir_sandbox_config_network_filterref_parameter_init(GVirSandboxConfigNetworkFilterrefParameter *param) > > +{ > > + param->priv = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER_GET_PRIVATE(param); > > +} > > + > > + > > +/** > > + * gvir_sandbox_config_network_filterref_parameter_new: > > + * > > + * Create a new network config with DHCP enabled > > + * > > + * Returns: (transfer full): a new sandbox network object > > + */ > > +GVirSandboxConfigNetworkFilterrefParameter *gvir_sandbox_config_network_filterref_parameter_new(void) > > +{ > > + return GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(g_object_new(GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF_PARAMETER, > > + NULL)); > > +} > > + > > +void gvir_sandbox_config_network_filterref_parameter_set_name(GVirSandboxConfigNetworkFilterrefParameter *param, > > + const gchar *name) > > +{ > > + GVirSandboxConfigNetworkFilterrefParameterPrivate *priv; > > + > > + g_return_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF_PARAMETER(param)); > > + priv = param->priv; > > + g_free(priv->name); > > + priv->name = g_strdup(name); > > +} > > + > > +const gchar *gvir_sandbox_config_network_filterref_parameter_get_name(GVirSandboxConfigNetworkFilterrefParameter *param) > > +{ > > + GVirSandboxConfigNetworkFilterrefParameterPrivate *priv; > > + > > + g_return_val_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF_PARAMETER(param), NULL); > > + priv = param->priv; > > + return priv->name; > > +} > > + > > +void gvir_sandbox_config_network_filterref_parameter_set_value(GVirSandboxConfigNetworkFilterrefParameter *param, > > + const gchar *value) > > +{ > > + GVirSandboxConfigNetworkFilterrefParameterPrivate *priv; > > + > > + g_return_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF_PARAMETER(param)); > > + priv = param->priv; > > + g_free(priv->value); > > + priv->value = g_strdup(value); > > +} > > + > > +const gchar *gvir_sandbox_config_network_filterref_parameter_get_value(GVirSandboxConfigNetworkFilterrefParameter *param) > > +{ > > + GVirSandboxConfigNetworkFilterrefParameterPrivate *priv; > > + > > + g_return_val_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF_PARAMETER(param), NULL); > > + priv = param->priv; > > + return priv->value; > > +} > > diff --git a/libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.h b/libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.h > > new file mode 100644 > > index 0000000..9544539 > > --- /dev/null > > +++ b/libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.h > > @@ -0,0 +1,73 @@ > > +/* > > + * libvirt-sandbox-config-network-filterref-parameter.h: libvirt sandbox configuration > > + * > > + * Copyright (C) 2013 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, write to the Free Software > > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA > > + * > > + * Author: Ian Main <imain@xxxxxxxxxx> > > + */ > > + > > +#if !defined(__LIBVIRT_SANDBOX_H__) && !defined(LIBVIRT_SANDBOX_BUILD) > > +#error "Only <libvirt-sandbox/libvirt-sandbox.h> can be included directly." > > +#endif > > + > > +#ifndef __LIBVIRT_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER_H__ > > +#define __LIBVIRT_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER_H__ > > + > > +G_BEGIN_DECLS > > + > > +#define GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF_PARAMETER (gvir_sandbox_config_network_filterref_parameter_get_type ()) > > +#define GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF_PARAMETER, GVirSandboxConfigNetworkFilterrefParameter)) > > +#define GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF_PARAMETER, GVirSandboxConfigNetworkFilterrefParameterClass)) > > +#define GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF_PARAMETER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF_PARAMETER)) > > +#define GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF_PARAMETER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF_PARAMETER)) > > +#define GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF_PARAMETER, GVirSandboxConfigNetworkFilterrefParameterClass)) > > + > > +typedef struct _GVirSandboxConfigNetworkFilterrefParameter GVirSandboxConfigNetworkFilterrefParameter; > > +typedef struct _GVirSandboxConfigNetworkFilterrefParameterPrivate GVirSandboxConfigNetworkFilterrefParameterPrivate; > > +typedef struct _GVirSandboxConfigNetworkFilterrefParameterClass GVirSandboxConfigNetworkFilterrefParameterClass; > > + > > +struct _GVirSandboxConfigNetworkFilterrefParameter > > +{ > > + GObject parent; > > + > > + GVirSandboxConfigNetworkFilterrefParameterPrivate *priv; > > + > > + /* Do not add fields to this struct */ > > +}; > > + > > +struct _GVirSandboxConfigNetworkFilterrefParameterClass > > +{ > > + GObjectClass parent_class; > > + > > + gpointer padding[LIBVIRT_SANDBOX_CLASS_PADDING]; > > +}; > > + > > +GType gvir_sandbox_config_network_filterref_parameter_get_type(void); > > + > > +GVirSandboxConfigNetworkFilterrefParameter *gvir_sandbox_config_network_filterref_parameter_new(void); > > + > > +void gvir_sandbox_config_network_filterref_parameter_set_name(GVirSandboxConfigNetworkFilterrefParameter *param, > > + const gchar *name); > > +const gchar *gvir_sandbox_config_network_filterref_parameter_get_name(GVirSandboxConfigNetworkFilterrefParameter *param); > > + > > +void gvir_sandbox_config_network_filterref_parameter_set_value(GVirSandboxConfigNetworkFilterrefParameter *param, > > + const gchar *value); > > +const gchar *gvir_sandbox_config_network_filterref_parameter_get_value(GVirSandboxConfigNetworkFilterrefParameter *param); > > + > > +G_END_DECLS > > + > > +#endif /* __LIBVIRT_SANDBOX_CONFIG_NETWORK_FILTERREF_PARAMETER_H__ */ > > diff --git a/libvirt-sandbox/libvirt-sandbox-config-network-filterref.c b/libvirt-sandbox/libvirt-sandbox-config-network-filterref.c > > new file mode 100644 > > index 0000000..85b41ae > > --- /dev/null > > +++ b/libvirt-sandbox/libvirt-sandbox-config-network-filterref.c > > @@ -0,0 +1,218 @@ > > +/* > > + * libvirt-sandbox-config-network-filterref.c: libvirt sandbox filterr reference > > + * configuration > > + * > > + * Copyright (C) 2013 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, write to the Free Software > > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA > > + * > > + * Author: Ian Main <imain@xxxxxxxxxx> > > + */ > > + > > +#include <config.h> > > +#include <string.h> > > + > > +#include "libvirt-sandbox/libvirt-sandbox.h" > > + > > +/** > > + * SECTION: libvirt-sandbox-config-network-filterref > > + * @short_description: Add a network filter to a network interface. > > + * @include: libvirt-sandbox/libvirt-sandbox.h > > + * @see_aloso: #GVirSandboxConfig > > + * > > + * Provides an object to store the name of the filter reference. > > + * > > + * The GVirSandboxConfigNetworkFilterref object stores the name of the filter > > + * references associated with a network interface. > > + */ > > + > > +#define GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_GET_PRIVATE(obj) \ > > + (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF, GVirSandboxConfigNetworkFilterrefPrivate)) > > + > > +struct _GVirSandboxConfigNetworkFilterrefPrivate > > +{ > > + gchar *filter; > > + GList *parameters; > > +}; > > + > > +G_DEFINE_TYPE(GVirSandboxConfigNetworkFilterref, gvir_sandbox_config_network_filterref, G_TYPE_OBJECT); > > + > > + > > +enum { > > + PROP_0, > > + PROP_FILTER > > +}; > > + > > +enum { > > + LAST_SIGNAL > > +}; > > + > > +//static gint signals[LAST_SIGNAL]; > > + > > +static void gvir_sandbox_config_network_filterref_get_property(GObject *object, > > + guint prop_id, > > + GValue *value, > > + GParamSpec *pspec) > > +{ > > + GVirSandboxConfigNetworkFilterref *config = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF(object); > > + GVirSandboxConfigNetworkFilterrefPrivate *priv = config->priv; > > + > > + switch (prop_id) { > > + case PROP_FILTER: > > + g_value_set_string(value, priv->filter); > > + break; > > + > > + default: > > + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); > > + } > > +} > > + > > + > > +static void gvir_sandbox_config_network_filterref_set_property(GObject *object, > > + guint prop_id, > > + const GValue *value, > > + GParamSpec *pspec) > > +{ > > + GVirSandboxConfigNetworkFilterref *filterref = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF(object); > > + > > + switch (prop_id) { > > + case PROP_FILTER: > > + gvir_sandbox_config_network_filterref_set_name(filterref, g_value_get_string(value)); > > + break; > > + > > + default: > > + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); > > + } > > +} > > + > > + > > + > > +static void gvir_sandbox_config_network_filterref_finalize(GObject *object) > > +{ > > + GVirSandboxConfigNetworkFilterref *config = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF(object); > > + GVirSandboxConfigNetworkFilterrefPrivate *priv = config->priv; > > + > > + g_free(priv->filter); > > + g_list_foreach(priv->parameters, (GFunc)g_object_unref, NULL); > > + g_list_free(priv->parameters); > > + > > + G_OBJECT_CLASS(gvir_sandbox_config_network_filterref_parent_class)->finalize(object); > > +} > > + > > + > > +static void gvir_sandbox_config_network_filterref_class_init(GVirSandboxConfigNetworkFilterrefClass *klass) > > +{ > > + GObjectClass *object_class = G_OBJECT_CLASS(klass); > > + > > + object_class->finalize = gvir_sandbox_config_network_filterref_finalize; > > + object_class->get_property = gvir_sandbox_config_network_filterref_get_property; > > + object_class->set_property = gvir_sandbox_config_network_filterref_set_property; > > + > > + g_object_class_install_property(object_class, > > + PROP_FILTER, > > + g_param_spec_string("filter", > > + "Filter name", > > + "The filter reference name", > > + NULL, > > + G_PARAM_READWRITE | > > + G_PARAM_STATIC_STRINGS)); > > + > > + g_type_class_add_private(klass, sizeof(GVirSandboxConfigNetworkFilterrefPrivate)); > > +} > > + > > +/** > > + * gvir_sandbox_config_network_filterref_new: > > + * > > + * Create a new network filterref config. > > + * > > + * Returns: (transfer full): a new sandbox network_filterref object > > + */ > > +GVirSandboxConfigNetworkFilterref *gvir_sandbox_config_network_filterref_new(void) > > +{ > > + return GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF(g_object_new(GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF, > > + NULL)); > > +} > > + > > + > > +static void gvir_sandbox_config_network_filterref_init(GVirSandboxConfigNetworkFilterref *config) > > +{ > > + config->priv = GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_GET_PRIVATE(config); > > +} > > + > > + > > +/** > > + * gvir_sandbox_config_network_filterref_get_name: > > + * @config: (transfer none): the network filter reference name > > + * > > + * Retrieves the network filter reference name. > > + * > > + * Returns: (transfer none): the network filter reference name. > > + */ > > +const gchar *gvir_sandbox_config_network_filterref_get_name(GVirSandboxConfigNetworkFilterref *filterref) > > +{ > > + GVirSandboxConfigNetworkFilterrefPrivate *priv; > > + > > + g_return_val_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF(filterref), NULL); > > + priv = filterref->priv; > > + return priv->filter; > > +} > > + > > +void gvir_sandbox_config_network_filterref_set_name(GVirSandboxConfigNetworkFilterref *filterref, > > + const gchar *name) > > +{ > > + GVirSandboxConfigNetworkFilterrefPrivate *priv; > > + > > + g_return_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF(filterref)); > > + priv = filterref->priv; > > + g_free(priv->filter); > > + priv->filter = g_strdup(name); > > +} > > + > > +/** > > + * gvir_sandbox_config_network_filterref_add_parameter: > > + * @filter: (transfer none): the network filter reference. > > + * @param: (transfer none): the filter parameter > > + * > > + * Add a parameter to a network filter reference. > > + */ > > +void gvir_sandbox_config_network_filterref_add_parameter(GVirSandboxConfigNetworkFilterref *filter, > > + GVirSandboxConfigNetworkFilterrefParameter *param) > > +{ > > + GVirSandboxConfigNetworkFilterrefPrivate *priv; > > + > > + g_return_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF(filter)); > > + g_return_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF_PARAMETER(param)); > > + priv = filter->priv; > > + priv->parameters = g_list_append(priv->parameters, g_object_ref(param)); > > +} > > + > > + > > +/** > > + * gvir_sandbox_config_network_filterref_get_parameters: > > + * @filter: (transfer none): the filter reference configuration > > + * > > + * Retrieve the list of parameters associated with a network filter reference > > + * > > + * Returns: (transfer full)(element-type GVirSandboxConfigNetworkFilterrefParameter): the parameter list > > + */ > > +GList *gvir_sandbox_config_network_filterref_get_parameters(GVirSandboxConfigNetworkFilterref *filter) > > +{ > > + GVirSandboxConfigNetworkFilterrefPrivate *priv; > > + > > + g_return_val_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF(filter), NULL); > > + priv = filter->priv; > > + g_list_foreach(priv->parameters, (GFunc)g_object_ref, NULL); > > + return g_list_copy(priv->parameters); > > +} > > diff --git a/libvirt-sandbox/libvirt-sandbox-config-network-filterref.h b/libvirt-sandbox/libvirt-sandbox-config-network-filterref.h > > new file mode 100644 > > index 0000000..e036a93 > > --- /dev/null > > +++ b/libvirt-sandbox/libvirt-sandbox-config-network-filterref.h > > @@ -0,0 +1,74 @@ > > +/* > > + * libvirt-sandbox-config-network-filterref.h: libvirt sandbox filter reference > > + * configuration > > + * > > + * Copyright (C) 2013 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, write to the Free Software > > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA > > + * > > + * Author: Ian Main <imain@xxxxxxxxxx> > > + */ > > + > > +#if !defined(__LIBVIRT_SANDBOX_H__) && !defined(LIBVIRT_SANDBOX_BUILD) > > +#error "Only <libvirt-sandbox/libvirt-sandbox.h> can be included directly." > > +#endif > > + > > +#ifndef __LIBVIRT_SANDBOX_CONFIG_NETWORK_FILTERREF_H__ > > +#define __LIBVIRT_SANDBOX_CONFIG_NETWORK_FILTERREF_H__ > > + > > +G_BEGIN_DECLS > > + > > +#define GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF (gvir_sandbox_config_network_filterref_get_type ()) > > +#define GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF, GVirSandboxConfigNetworkFilterref)) > > +#define GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF, GVirSandboxConfigNetworkFilterrefClass)) > > +#define GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF)) > > +#define GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF)) > > +#define GVIR_SANDBOX_CONFIG_NETWORK_FILTERREF_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GVIR_SANDBOX_TYPE_CONFIG_NETWORK_FILTERREF, GVirSandboxConfigNetworkFilterrefClass)) > > + > > +typedef struct _GVirSandboxConfigNetworkFilterref GVirSandboxConfigNetworkFilterref; > > +typedef struct _GVirSandboxConfigNetworkFilterrefPrivate GVirSandboxConfigNetworkFilterrefPrivate; > > +typedef struct _GVirSandboxConfigNetworkFilterrefClass GVirSandboxConfigNetworkFilterrefClass; > > + > > +struct _GVirSandboxConfigNetworkFilterref > > +{ > > + GObject parent; > > + > > + GVirSandboxConfigNetworkFilterrefPrivate *priv; > > + > > + /* Do not add fields to this struct */ > > +}; > > + > > +struct _GVirSandboxConfigNetworkFilterrefClass > > +{ > > + GObjectClass parent_class; > > + > > + gpointer padding[LIBVIRT_SANDBOX_CLASS_PADDING]; > > +}; > > + > > +GType gvir_sandbox_config_network_filterref_get_type(void); > > + > > +GVirSandboxConfigNetworkFilterref *gvir_sandbox_config_network_filterref_new(void); > > + > > +const gchar *gvir_sandbox_config_network_filterref_get_name(GVirSandboxConfigNetworkFilterref *config); > > +void gvir_sandbox_config_network_filterref_set_name(GVirSandboxConfigNetworkFilterref *filter, const gchar *name); > > + > > +void gvir_sandbox_config_network_filterref_add_parameter(GVirSandboxConfigNetworkFilterref *filter, > > + GVirSandboxConfigNetworkFilterrefParameter *param); > > +GList *gvir_sandbox_config_network_filterref_get_parameters(GVirSandboxConfigNetworkFilterref *filter); > > + > > + > > +G_END_DECLS > > + > > +#endif /* __LIBVIRT_SANDBOX_CONFIG_NETWORK_FILTERREF_H__ */ > > diff --git a/libvirt-sandbox/libvirt-sandbox-config-network.c b/libvirt-sandbox/libvirt-sandbox-config-network.c > > index f04cf4c..2bb55bf 100644 > > --- a/libvirt-sandbox/libvirt-sandbox-config-network.c > > +++ b/libvirt-sandbox/libvirt-sandbox-config-network.c > > @@ -47,6 +47,7 @@ struct _GVirSandboxConfigNetworkPrivate > > gchar *mac; > > GList *routes; > > GList *addrs; > > + GVirSandboxConfigNetworkFilterref *filterref; > > }; > > > > G_DEFINE_TYPE(GVirSandboxConfigNetwork, gvir_sandbox_config_network, G_TYPE_OBJECT); > > @@ -133,6 +134,8 @@ static void gvir_sandbox_config_network_finalize(GObject *object) > > g_list_free(priv->addrs); > > g_list_foreach(priv->routes, (GFunc)g_object_unref, NULL); > > g_list_free(priv->routes); > > + if (priv->filterref) > > + g_object_unref(priv->filterref); > > > > G_OBJECT_CLASS(gvir_sandbox_config_network_parent_class)->finalize(object); > > } > > @@ -287,6 +290,45 @@ GList *gvir_sandbox_config_network_get_addresses(GVirSandboxConfigNetwork *confi > > } > > > > /** > > + * gvir_sandbox_config_network_set_filterref: > > + * @config: (transfer none): the sandbox network configuration > > + * @ref: (transfer none): the network filterref > > + * > > + * Set a network filterref for the given network. > > + */ > > +void gvir_sandbox_config_network_set_filterref(GVirSandboxConfigNetwork *config, > > + GVirSandboxConfigNetworkFilterref *filterref) > > +{ > > + GVirSandboxConfigNetworkPrivate *priv; > > + > > + g_return_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK(config)); > > + g_return_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK_FILTERREF(filterref)); > > + priv = config->priv; > > + if (priv->filterref) > > + g_object_unref(priv->filterref); > > + priv->filterref = g_object_ref(filterref); > > +} > > + > > + > > +/** > > + * gvir_sandbox_config_network_get_filterref: > > + * @config: (transfer none): the sandbox network configuration > > + * > > + * Retrieve the associated filter reference. > > + * > > + * Returns: (transfer none): The associated filter reference. > > + */ > > +GVirSandboxConfigNetworkFilterref *gvir_sandbox_config_network_get_filterref(GVirSandboxConfigNetwork *config) > > +{ > > + GVirSandboxConfigNetworkPrivate *priv; > > + > > + g_return_val_if_fail(GVIR_SANDBOX_IS_CONFIG_NETWORK(config), NULL); > > + priv = config->priv; > > + return priv->filterref; > > +} > > + > > + > > +/** > > * gvir_sandbox_config_network_add_route: > > * @config: (transfer none): the sandbox network configuration > > * @addr: (transfer none): the network route > > diff --git a/libvirt-sandbox/libvirt-sandbox-config-network.h b/libvirt-sandbox/libvirt-sandbox-config-network.h > > index d926fd1..4a52221 100644 > > --- a/libvirt-sandbox/libvirt-sandbox-config-network.h > > +++ b/libvirt-sandbox/libvirt-sandbox-config-network.h > > @@ -78,6 +78,10 @@ void gvir_sandbox_config_network_add_address(GVirSandboxConfigNetwork *config, > > GVirSandboxConfigNetworkAddress *addr); > > GList *gvir_sandbox_config_network_get_addresses(GVirSandboxConfigNetwork *config); > > > > +void gvir_sandbox_config_network_set_filterref(GVirSandboxConfigNetwork *config, > > + GVirSandboxConfigNetworkFilterref *ref); > > +GVirSandboxConfigNetworkFilterref *gvir_sandbox_config_network_get_filterref(GVirSandboxConfigNetwork *config); > > + > > void gvir_sandbox_config_network_add_route(GVirSandboxConfigNetwork *config, > > GVirSandboxConfigNetworkRoute *addr); > > GList *gvir_sandbox_config_network_get_routes(GVirSandboxConfigNetwork *config); > > diff --git a/libvirt-sandbox/libvirt-sandbox-config.c b/libvirt-sandbox/libvirt-sandbox-config.c > > index b1525a1..f996ea5 100644 > > --- a/libvirt-sandbox/libvirt-sandbox-config.c > > +++ b/libvirt-sandbox/libvirt-sandbox-config.c > > @@ -911,6 +911,8 @@ gboolean gvir_sandbox_config_add_network_strv(GVirSandboxConfig *config, > > * source=private,address=192.168.122.1/24%192.168.122.255, > > * address=192.168.122.1/24%192.168.122.255,address=2001:212::204:2/64 > > * route=192.168.122.255/24%192.168.1.1 > > + * filter=clean-traffic > > + * filter.ip=192.168.122.1 > > */ > > gboolean gvir_sandbox_config_add_network_opts(GVirSandboxConfig *config, > > const gchar *network, > > @@ -924,8 +926,10 @@ gboolean gvir_sandbox_config_add_network_opts(GVirSandboxConfig *config, > > gchar **params = g_strsplit(network, ",", 50); > > gsize j = 0; > > GVirSandboxConfigNetwork *net; > > + GVirSandboxConfigNetworkFilterref *filter; > > > > net = gvir_sandbox_config_network_new(); > > + filter = gvir_sandbox_config_network_filterref_new(); > > gvir_sandbox_config_network_set_dhcp(net, FALSE); > > > > while (params && params[j]) { > > @@ -947,6 +951,40 @@ gboolean gvir_sandbox_config_add_network_opts(GVirSandboxConfig *config, > > } else if (g_str_has_prefix(param, "mac=")) { > > gvir_sandbox_config_network_set_mac(net, > > param + strlen("mac=")); > > + } else if (g_str_has_prefix(param, "filter.")) { > > + GVirSandboxConfigNetworkFilterrefParameter *filter_param; > > + gchar *tail = g_strdup(param + strlen("filter.")); > > + gchar *equ = g_strrstr(tail, "="); > > + gchar *name, *name_up, *value; > > + > > + if (equ == NULL) { > > + g_free(tail); > > + g_set_error(error, GVIR_SANDBOX_CONFIG_ERROR, 0, > > + _("No assignment in filter parameter configuration")); > > + g_object_unref(net); > > + goto cleanup; > > + } > > + > > + name = g_strndup(tail, equ - tail); > > + value = g_strdup(equ + 1); > > + /* Convert to upcase for convenience. */ > > + name_up = g_ascii_strup(name, -1); > > + g_free(name); > > + > > + filter_param = gvir_sandbox_config_network_filterref_parameter_new(); > > + gvir_sandbox_config_network_filterref_parameter_set_name(filter_param, name_up); > > + gvir_sandbox_config_network_filterref_parameter_set_value(filter_param, value); > > + gvir_sandbox_config_network_filterref_add_parameter(filter, filter_param); > > + > > + g_free(tail); > > + g_free(name_up); > > + g_free(value); > > + } else if (g_str_has_prefix(param, "filter=")) { > > + gchar *name = g_strdup(param + strlen("filter=")); > > + > > + gvir_sandbox_config_network_filterref_set_name(filter, name); > > + gvir_sandbox_config_network_set_filterref(net, filter); > > + g_free(name); > > } else if (g_str_has_prefix(param, "address=")) { > > GVirSandboxConfigNetworkAddress *addr; > > GInetAddress *primaryaddr; > > @@ -1090,6 +1128,7 @@ gboolean gvir_sandbox_config_add_network_opts(GVirSandboxConfig *config, > > > > ret = TRUE; > > cleanup: > > + g_object_unref(filter); > > return ret; > > } > > > > diff --git a/libvirt-sandbox/libvirt-sandbox.h b/libvirt-sandbox/libvirt-sandbox.h > > index a3f0b2c..adb21a1 100644 > > --- a/libvirt-sandbox/libvirt-sandbox.h > > +++ b/libvirt-sandbox/libvirt-sandbox.h > > @@ -25,6 +25,7 @@ > > > > /* External includes */ > > #include <libvirt-gobject/libvirt-gobject.h> > > +#include <locale.h> > > > > /* Local includes */ > > #include <libvirt-sandbox/libvirt-sandbox-main.h> > > @@ -37,6 +38,8 @@ > > #include <libvirt-sandbox/libvirt-sandbox-config-mount-guest-bind.h> > > #include <libvirt-sandbox/libvirt-sandbox-config-mount-ram.h> > > #include <libvirt-sandbox/libvirt-sandbox-config-network-address.h> > > +#include <libvirt-sandbox/libvirt-sandbox-config-network-filterref-parameter.h> > > +#include <libvirt-sandbox/libvirt-sandbox-config-network-filterref.h> > > #include <libvirt-sandbox/libvirt-sandbox-config-network-route.h> > > #include <libvirt-sandbox/libvirt-sandbox-config-network.h> > > #include <libvirt-sandbox/libvirt-sandbox-config.h> > > diff --git a/libvirt-sandbox/libvirt-sandbox.sym b/libvirt-sandbox/libvirt-sandbox.sym > > index 7b7c8be..7afef53 100644 > > --- a/libvirt-sandbox/libvirt-sandbox.sym > > +++ b/libvirt-sandbox/libvirt-sandbox.sym > > @@ -44,6 +44,7 @@ LIBVIRT_SANDBOX_0.2.1 { > > gvir_sandbox_config_mount_ram_set_usage; > > > > gvir_sandbox_config_network_add_address; > > + gvir_sandbox_config_network_set_filterref; > > gvir_sandbox_config_network_add_route; > > gvir_sandbox_config_network_get_type; > > gvir_sandbox_config_network_get_dhcp; > > @@ -51,6 +52,7 @@ LIBVIRT_SANDBOX_0.2.1 { > > gvir_sandbox_config_network_get_source; > > gvir_sandbox_config_network_get_routes; > > gvir_sandbox_config_network_get_addresses; > > + gvir_sandbox_config_network_get_filterref; > > gvir_sandbox_config_network_new; > > gvir_sandbox_config_network_set_dhcp; > > gvir_sandbox_config_network_set_mac; > > @@ -65,6 +67,20 @@ LIBVIRT_SANDBOX_0.2.1 { > > gvir_sandbox_config_network_address_set_primary; > > gvir_sandbox_config_network_address_set_prefix; > > > > + gvir_sandbox_config_network_filterref_get_type; > > + gvir_sandbox_config_network_filterref_new; > > + gvir_sandbox_config_network_filterref_get_name; > > + gvir_sandbox_config_network_filterref_set_name; > > + gvir_sandbox_config_network_filterref_add_parameter; > > + gvir_sandbox_config_network_filterref_get_parameters; > > + > > + gvir_sandbox_config_network_filterref_parameter_get_type; > > + gvir_sandbox_config_network_filterref_parameter_new; > > + gvir_sandbox_config_network_filterref_parameter_get_name; > > + gvir_sandbox_config_network_filterref_parameter_set_name; > > + gvir_sandbox_config_network_filterref_parameter_get_value; > > + gvir_sandbox_config_network_filterref_parameter_set_value; > > + > > gvir_sandbox_config_network_route_get_type; > > gvir_sandbox_config_network_route_get_prefix; > > gvir_sandbox_config_network_route_get_gateway; > > -- > > 1.8.1.4 > > > > -- > > libvir-list mailing list > > libvir-list@xxxxxxxxxx > > https://www.redhat.com/mailman/listinfo/libvir-list -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list