summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Winship <danw@redhat.com>2015-04-15 14:53:30 -0400
committerDan Winship <danw@redhat.com>2015-08-10 09:41:26 -0400
commit9f8de603e387d9ea1bbe93793bedbdfbb4923235 (patch)
treef767836258327bd1e06637a405473b7b4599c4b5
parent4b823a86c9d4c0c3ce857042cc37dfb480e69673 (diff)
downloadNetworkManager-9f8de603e387d9ea1bbe93793bedbdfbb4923235.tar.gz
ifcfg-rh: port to gdbus
-rw-r--r--.gitignore1
-rw-r--r--src/settings/plugins/ifcfg-rh/Makefile.am29
-rw-r--r--src/settings/plugins/ifcfg-rh/nm-ifcfg-rh.xml1
-rw-r--r--src/settings/plugins/ifcfg-rh/plugin.c163
-rw-r--r--src/settings/plugins/ifcfg-rh/tests/Makefile.am1
5 files changed, 95 insertions, 100 deletions
diff --git a/.gitignore b/.gitignore
index 4b0ad46a45..14a033232e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -246,6 +246,7 @@ test-*.trs
/src/rdisc/tests/test-rdisc-fake
/src/rdisc/tests/test-rdisc-linux
/src/settings/plugins/ibft/tests/test-ibft
+/src/settings/plugins/ifcfg-rh/nmdbus-ifcfg-rh.[ch]
/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh
/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh-utils
/src/settings/plugins/ifnet/tests/test-ifnet
diff --git a/src/settings/plugins/ifcfg-rh/Makefile.am b/src/settings/plugins/ifcfg-rh/Makefile.am
index 7546538e36..34f04f91e7 100644
--- a/src/settings/plugins/ifcfg-rh/Makefile.am
+++ b/src/settings/plugins/ifcfg-rh/Makefile.am
@@ -2,15 +2,31 @@ SUBDIRS = . tests
@GNOME_CODE_COVERAGE_RULES@
-nm-ifcfg-rh-glue.h: nm-ifcfg-rh.xml
- $(AM_V_GEN) dbus-binding-tool --prefix=nm_ifcfg_rh --mode=glib-server --output=$@ $<
+# See note about gdbus-codegen in introspection/Makefile.am
-BUILT_SOURCES = \
- nm-ifcfg-rh-glue.h
+noinst_LTLIBRARIES = libnmdbus-ifcfg-rh.la
+
+nodist_libnmdbus_ifcfg_rh_la_SOURCES = \
+ nmdbus-ifcfg-rh.c \
+ nmdbus-ifcfg-rh.h
+
+libnmdbus_ifcfg_rh_la_CPPFLAGS = $(filter-out -DGLIB_VERSION_MAX_ALLOWED%,$(AM_CPPFLAGS))
+
+nmdbus-ifcfg-rh.h: nm-ifcfg-rh.xml
+ $(AM_V_GEN) gdbus-codegen \
+ --generate-c-code $(basename $@) \
+ --c-namespace NMDBus \
+ --interface-prefix com.redhat \
+ $<
+
+nmdbus-ifcfg-rh.c: nmdbus-ifcfg-rh.h
+ @true
+
+BUILT_SOURCES = nmdbus-ifcfg-rh.h nmdbus-ifcfg-rh.c
pkglib_LTLIBRARIES = libnm-settings-plugin-ifcfg-rh.la
-noinst_LTLIBRARIES = libifcfg-rh-io.la
+noinst_LTLIBRARIES += libifcfg-rh-io.la
libifcfg_rh_io_la_SOURCES = \
shvar.c \
@@ -33,7 +49,6 @@ AM_CPPFLAGS = \
-DNETWORKMANAGER_COMPILATION=NM_NETWORKMANAGER_COMPILATION_INSIDE_DAEMON \
-DNM_VERSION_MAX_ALLOWED=NM_VERSION_NEXT_STABLE \
$(GLIB_CFLAGS) \
- $(DBUS_CFLAGS) \
$(NSS_CFLAGS) \
-DG_LOG_DOMAIN=\""NetworkManager-ifcfg-rh"\" \
-DSYSCONFDIR=\"$(sysconfdir)\" \
@@ -46,7 +61,7 @@ libnm_settings_plugin_ifcfg_rh_la_SOURCES = \
nm-ifcfg-connection.h
libnm_settings_plugin_ifcfg_rh_la_LDFLAGS = -module -avoid-version
-libnm_settings_plugin_ifcfg_rh_la_LIBADD = libifcfg-rh-io.la
+libnm_settings_plugin_ifcfg_rh_la_LIBADD = libifcfg-rh-io.la libnmdbus-ifcfg-rh.la
dbusservicedir = $(DBUS_SYS_DIR)
dbusservice_DATA = nm-ifcfg-rh.conf
diff --git a/src/settings/plugins/ifcfg-rh/nm-ifcfg-rh.xml b/src/settings/plugins/ifcfg-rh/nm-ifcfg-rh.xml
index 5279345297..1f308dd48a 100644
--- a/src/settings/plugins/ifcfg-rh/nm-ifcfg-rh.xml
+++ b/src/settings/plugins/ifcfg-rh/nm-ifcfg-rh.xml
@@ -10,7 +10,6 @@
<tp:docstring>
Given an ifcfg file, return various internal information about it.
</tp:docstring>
- <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_ifcfgrh_get_ifcfg_details"/>
<arg name="ifcfg" type="s" direction="in">
<tp:docstring>
The full path to an ifcfg file.
diff --git a/src/settings/plugins/ifcfg-rh/plugin.c b/src/settings/plugins/ifcfg-rh/plugin.c
index 7e54833c91..ebed980e1e 100644
--- a/src/settings/plugins/ifcfg-rh/plugin.c
+++ b/src/settings/plugins/ifcfg-rh/plugin.c
@@ -31,10 +31,6 @@
#include <gmodule.h>
-#include <dbus/dbus.h>
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
-
#if HAVE_SELINUX
#include <selinux/selinux.h>
#endif
@@ -43,7 +39,6 @@
#include "nm-default.h"
#include "common.h"
-#include "nm-dbus-glib-types.h"
#include "plugin.h"
#include "nm-system-config-interface.h"
#include "nm-config.h"
@@ -54,6 +49,9 @@
#include "reader.h"
#include "writer.h"
#include "utils.h"
+#include "nm-dbus-compat.h"
+
+#include "nmdbus-ifcfg-rh.h"
#define IFCFGRH1_DBUS_SERVICE_NAME "com.redhat.ifcfgrh1"
#define IFCFGRH1_DBUS_OBJECT_PATH "/com/redhat/ifcfgrh1"
@@ -77,14 +75,6 @@
#define ERR_GET_MSG(err) (((err) && (err)->message) ? (err)->message : "(unknown)")
-static gboolean impl_ifcfgrh_get_ifcfg_details (SCPluginIfcfg *plugin,
- const char *in_ifcfg,
- const char **out_uuid,
- const char **out_path,
- GError **error);
-
-#include "nm-ifcfg-rh-glue.h"
-
static NMIfcfgConnection *update_connection (SCPluginIfcfg *plugin,
NMConnection *source,
const char *full_path,
@@ -109,7 +99,7 @@ typedef struct {
GFileMonitor *ifcfg_monitor;
guint ifcfg_monitor_id;
- DBusGConnection *bus;
+ gboolean has_dbus_service;
} SCPluginIfcfgPrivate;
@@ -696,12 +686,10 @@ add_connection (NMSystemConfigInterface *config,
return NM_SETTINGS_CONNECTION (update_connection (self, connection, path, NULL, FALSE, NULL, error));
}
-static gboolean
+static void
impl_ifcfgrh_get_ifcfg_details (SCPluginIfcfg *plugin,
- const char *in_ifcfg,
- const char **out_uuid,
- const char **out_path,
- GError **error)
+ GDBusMethodInvocation *context,
+ const char *in_ifcfg)
{
NMIfcfgConnection *connection;
NMSettingConnection *s_con;
@@ -709,55 +697,53 @@ impl_ifcfgrh_get_ifcfg_details (SCPluginIfcfg *plugin,
const char *path;
if (!g_path_is_absolute (in_ifcfg)) {
- g_set_error (error,
- NM_SETTINGS_ERROR,
- NM_SETTINGS_ERROR_INVALID_CONNECTION,
- "ifcfg path '%s' is not absolute", in_ifcfg);
- return FALSE;
+ g_dbus_method_invocation_return_error (context,
+ NM_SETTINGS_ERROR,
+ NM_SETTINGS_ERROR_INVALID_CONNECTION,
+ "ifcfg path '%s' is not absolute", in_ifcfg);
+ return;
}
connection = find_by_path (plugin, in_ifcfg);
if ( !connection
|| nm_ifcfg_connection_get_unmanaged_spec (connection)
|| nm_ifcfg_connection_get_unrecognized_spec (connection)) {
- g_set_error (error,
- NM_SETTINGS_ERROR,
- NM_SETTINGS_ERROR_INVALID_CONNECTION,
- "ifcfg file '%s' unknown", in_ifcfg);
- return FALSE;
+ g_dbus_method_invocation_return_error (context,
+ NM_SETTINGS_ERROR,
+ NM_SETTINGS_ERROR_INVALID_CONNECTION,
+ "ifcfg file '%s' unknown", in_ifcfg);
+ return;
}
s_con = nm_connection_get_setting_connection (NM_CONNECTION (connection));
if (!s_con) {
- g_set_error (error,
- NM_SETTINGS_ERROR,
- NM_SETTINGS_ERROR_FAILED,
- "unable to retrieve the connection setting");
- return FALSE;
+ g_dbus_method_invocation_return_error (context,
+ NM_SETTINGS_ERROR,
+ NM_SETTINGS_ERROR_FAILED,
+ "unable to retrieve the connection setting");
+ return;
}
uuid = nm_setting_connection_get_uuid (s_con);
if (!uuid) {
- g_set_error (error,
- NM_SETTINGS_ERROR,
- NM_SETTINGS_ERROR_FAILED,
- "unable to get the UUID");
- return FALSE;
+ g_dbus_method_invocation_return_error (context,
+ NM_SETTINGS_ERROR,
+ NM_SETTINGS_ERROR_FAILED,
+ "unable to get the UUID");
+ return;
}
path = nm_connection_get_path (NM_CONNECTION (connection));
if (!path) {
- g_set_error (error,
- NM_SETTINGS_ERROR,
- NM_SETTINGS_ERROR_FAILED,
- "unable to get the connection D-Bus path");
- return FALSE;
+ g_dbus_method_invocation_return_error (context,
+ NM_SETTINGS_ERROR,
+ NM_SETTINGS_ERROR_FAILED,
+ "unable to get the connection D-Bus path");
+ return;
}
- *out_uuid = g_strdup (uuid);
- *out_path = g_strdup (path);
-
- return TRUE;
+ g_dbus_method_invocation_return_value (context,
+ g_variant_new ("(so)", uuid, path));
}
static void
@@ -770,46 +756,43 @@ sc_plugin_ifcfg_init (SCPluginIfcfg *plugin)
{
SCPluginIfcfgPrivate *priv = SC_PLUGIN_IFCFG_GET_PRIVATE (plugin);
GError *error = NULL;
- gboolean success = FALSE;
+ GDBusConnection *bus;
+ GVariant *ret;
+ guint32 result;
priv->connections = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
- priv->bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
- if (!priv->bus) {
+ bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
+ if (!bus) {
_LOGW ("Couldn't connect to D-Bus: %s", error->message);
g_clear_error (&error);
- } else {
- DBusConnection *tmp;
- DBusGProxy *proxy;
- int result;
-
- tmp = dbus_g_connection_get_connection (priv->bus);
- dbus_connection_set_exit_on_disconnect (tmp, FALSE);
-
- proxy = dbus_g_proxy_new_for_name (priv->bus,
- DBUS_SERVICE_DBUS,
- DBUS_PATH_DBUS,
- DBUS_INTERFACE_DBUS);
-
- if (!dbus_g_proxy_call (proxy, "RequestName", &error,
- G_TYPE_STRING, IFCFGRH1_DBUS_SERVICE_NAME,
- G_TYPE_UINT, DBUS_NAME_FLAG_DO_NOT_QUEUE,
- G_TYPE_INVALID,
- G_TYPE_UINT, &result,
- G_TYPE_INVALID)) {
- _LOGW ("Couldn't acquire D-Bus service: %s", error->message);
- g_clear_error (&error);
- } else if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
- _LOGW ("Couldn't acquire ifcfgrh1 D-Bus service (already taken)");
- } else
- success = TRUE;
+ return;
}
- if (!success) {
- if (priv->bus) {
- dbus_g_connection_unref (priv->bus);
- priv->bus = NULL;
- }
+ ret = g_dbus_connection_call_sync (bus,
+ DBUS_SERVICE_DBUS,
+ DBUS_PATH_DBUS,
+ DBUS_INTERFACE_DBUS,
+ "RequestName",
+ g_variant_new ("(su)",
+ IFCFGRH1_DBUS_SERVICE_NAME,
+ DBUS_NAME_FLAG_DO_NOT_QUEUE),
+ G_VARIANT_TYPE ("(u)"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL, &error);
+ g_object_unref (bus);
+ if (ret) {
+ g_variant_get (ret, "(u)", &result);
+ g_variant_unref (ret);
+
+ if (result == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)
+ priv->has_dbus_service = TRUE;
+ else
+ _LOGW ("Couldn't acquire ifcfgrh1 D-Bus service (already taken)");
+ } else {
+ _LOGW ("Couldn't acquire D-Bus service: %s", error->message);
+ g_clear_error (&error);
}
}
@@ -819,11 +802,6 @@ dispose (GObject *object)
SCPluginIfcfg *plugin = SC_PLUGIN_IFCFG (object);
SCPluginIfcfgPrivate *priv = SC_PLUGIN_IFCFG_GET_PRIVATE (plugin);
- if (priv->bus) {
- dbus_g_connection_unref (priv->bus);
- priv->bus = NULL;
- }
-
if (priv->connections) {
g_hash_table_destroy (priv->connections);
priv->connections = NULL;
@@ -875,9 +853,12 @@ static void
sc_plugin_ifcfg_class_init (SCPluginIfcfgClass *req_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (req_class);
+ NMExportedObjectClass *exported_object_class = NM_EXPORTED_OBJECT_CLASS (req_class);
g_type_class_add_private (req_class, sizeof (SCPluginIfcfgPrivate));
+ exported_object_class->export_path = IFCFGRH1_DBUS_OBJECT_PATH;
+
object_class->dispose = dispose;
object_class->get_property = get_property;
object_class->set_property = set_property;
@@ -895,7 +876,9 @@ sc_plugin_ifcfg_class_init (SCPluginIfcfgClass *req_class)
NM_SYSTEM_CONFIG_INTERFACE_CAPABILITIES);
nm_exported_object_class_add_interface (NM_EXPORTED_OBJECT_CLASS (req_class),
- &dbus_glib_nm_ifcfg_rh_object_info);
+ NMDBUS_TYPE_IFCFGRH1_SKELETON,
+ "GetIfcfgDetails", impl_ifcfgrh_get_ifcfg_details,
+ NULL);
}
static void
@@ -920,10 +903,8 @@ nm_system_config_factory (void)
if (!singleton) {
singleton = SC_PLUGIN_IFCFG (g_object_new (SC_TYPE_PLUGIN_IFCFG, NULL));
priv = SC_PLUGIN_IFCFG_GET_PRIVATE (singleton);
- if (priv->bus)
- dbus_g_connection_register_g_object (priv->bus,
- IFCFGRH1_DBUS_OBJECT_PATH,
- G_OBJECT (singleton));
+ if (priv->has_dbus_service)
+ nm_exported_object_export (NM_EXPORTED_OBJECT (singleton));
_LOGD ("Acquired D-Bus service %s", IFCFGRH1_DBUS_SERVICE_NAME);
} else
g_object_ref (singleton);
diff --git a/src/settings/plugins/ifcfg-rh/tests/Makefile.am b/src/settings/plugins/ifcfg-rh/tests/Makefile.am
index 505601434b..4ac4eba929 100644
--- a/src/settings/plugins/ifcfg-rh/tests/Makefile.am
+++ b/src/settings/plugins/ifcfg-rh/tests/Makefile.am
@@ -24,7 +24,6 @@ AM_CPPFLAGS = \
AM_LDFLAGS = \
$(GLIB_LIBS) \
- $(DBUS_LIBS) \
$(CODE_COVERAGE_LDFLAGS)
noinst_PROGRAMS = test-ifcfg-rh test-ifcfg-rh-utils