summary refs log tree commit diff
path: root/libnm/nm-client.c
diff options
context:
space:
mode:
Diffstat (limited to 'libnm/nm-client.c')
-rw-r--r--libnm/nm-client.c42
1 files changed, 26 insertions, 16 deletions
diff --git a/libnm/nm-client.c b/libnm/nm-client.c
index 63eaa84c..47f1548e 100644
--- a/libnm/nm-client.c
+++ b/libnm/nm-client.c
@@ -22,6 +22,7 @@
 #include "nm-default.h"
 
 #include <string.h>
+#include <libudev.h>
 
 #include "nm-utils.h"
 #include "nm-client.h"
@@ -45,6 +46,7 @@
 #include "introspection/org.freedesktop.NetworkManager.Settings.h"
 #include "introspection/org.freedesktop.NetworkManager.Settings.Connection.h"
 #include "introspection/org.freedesktop.NetworkManager.VPN.Connection.h"
+#include "introspection/org.freedesktop.NetworkManager.Connection.Active.h"
 
 #include "nm-access-point.h"
 #include "nm-active-connection.h"
@@ -52,6 +54,7 @@
 #include "nm-device-bond.h"
 #include "nm-device-bridge.h"
 #include "nm-device-bt.h"
+#include "nm-device-dummy.h"
 #include "nm-device-ethernet.h"
 #include "nm-device-generic.h"
 #include "nm-device-infiniband.h"
@@ -94,6 +97,7 @@ typedef struct {
 	NMDnsManager *dns_manager;
 	GDBusObjectManager *object_manager;
 	GCancellable *new_object_manager_cancellable;
+	struct udev *udev;
 } NMClientPrivate;
 
 enum {
@@ -153,15 +157,7 @@ static const GPtrArray empty = { 0, };
  *
  * Returns: the error quark used for #NMClient errors.
  **/
-GQuark
-nm_client_error_quark (void)
-{
-	static GQuark quark;
-
-	if (G_UNLIKELY (!quark))
-		quark = g_quark_from_static_string ("nm-client-error-quark");
-	return quark;
-}
+NM_CACHED_QUARK_FCN ("nm-client-error-quark", nm_client_error_quark)
 
 /*****************************************************************************/
 
@@ -2015,6 +2011,8 @@ proxy_type (GDBusObjectManagerClient *manager,
 		return NMDBUS_TYPE_DNS_MANAGER_PROXY;
 	else if (strcmp (interface_name, NM_DBUS_INTERFACE_VPN_CONNECTION) == 0)
 		return NMDBUS_TYPE_VPN_CONNECTION_PROXY;
+	else if (strcmp (interface_name, NM_DBUS_INTERFACE_ACTIVE_CONNECTION) == 0)
+		return NMDBUS_TYPE_ACTIVE_CONNECTION_PROXY;
 
 	/* Use a generic D-Bus Proxy whenever we can. The typed GDBusProxy
 	 * subclasses actually use quite some memory, so they're better avoided. */
@@ -2022,8 +2020,9 @@ proxy_type (GDBusObjectManagerClient *manager,
 }
 
 static NMObject *
-obj_nm_for_gdbus_object (GDBusObject *object, GDBusObjectManager *object_manager)
+obj_nm_for_gdbus_object (NMClient *self, GDBusObject *object, GDBusObjectManager *object_manager)
 {
+	NMClientPrivate *priv;
 	GList *interfaces;
 	GList *l;
 	GType type = G_TYPE_INVALID;
@@ -2054,6 +2053,8 @@ obj_nm_for_gdbus_object (GDBusObject *object, GDBusObjectManager *object_manager
 			type = NM_TYPE_DEVICE_BRIDGE;
 		else if (strcmp (ifname, NM_DBUS_INTERFACE_DEVICE_BLUETOOTH) == 0)
 			type = NM_TYPE_DEVICE_BT;
+		else if (strcmp (ifname, NM_DBUS_INTERFACE_DEVICE_DUMMY) == 0)
+			type = NM_TYPE_DEVICE_DUMMY;
 		else if (strcmp (ifname, NM_DBUS_INTERFACE_DEVICE_WIRED) == 0)
 			type = NM_TYPE_DEVICE_ETHERNET;
 		else if (strcmp (ifname, NM_DBUS_INTERFACE_DEVICE_GENERIC) == 0)
@@ -2113,6 +2114,12 @@ obj_nm_for_gdbus_object (GDBusObject *object, GDBusObjectManager *object_manager
 	                       NM_OBJECT_DBUS_OBJECT, object,
 	                       NM_OBJECT_DBUS_OBJECT_MANAGER, object_manager,
 	                       NULL);
+	if (NM_IS_DEVICE (obj_nm)) {
+		priv = NM_CLIENT_GET_PRIVATE (self);
+		if (!priv->udev)
+			priv->udev = udev_new ();
+		_nm_device_set_udev (NM_DEVICE (obj_nm), priv->udev);
+	}
 	g_object_set_qdata_full (G_OBJECT (object), _nm_object_obj_nm_quark (),
 	                         obj_nm, g_object_unref);
 	return obj_nm;
@@ -2132,9 +2139,10 @@ obj_nm_inited (GObject *object, GAsyncResult *result, gpointer user_data)
 static void
 object_added (GDBusObjectManager *object_manager, GDBusObject *object, gpointer user_data)
 {
+	NMClient *client = user_data;
 	NMObject *obj_nm;
 
-	obj_nm = obj_nm_for_gdbus_object (object, object_manager);
+	obj_nm = obj_nm_for_gdbus_object (client, object, object_manager);
 	if (obj_nm) {
 		g_async_initable_init_async (G_ASYNC_INITABLE (obj_nm),
 		                             G_PRIORITY_DEFAULT, NULL,
@@ -2161,7 +2169,7 @@ objects_created (NMClient *client, GDBusObjectManager *object_manager, GError **
 	/* First just ensure all the NMObjects for known GDBusObjects exist. */
 	objects = g_dbus_object_manager_get_objects (object_manager);
 	for (iter = objects; iter; iter = iter->next)
-		obj_nm_for_gdbus_object (iter->data, object_manager);
+		obj_nm_for_gdbus_object (client, iter->data, object_manager);
 	g_list_free_full (objects, g_object_unref);
 
 	manager = g_dbus_object_manager_get_object (object_manager, NM_DBUS_PATH);
@@ -2530,10 +2538,7 @@ dispose (GObject *object)
 {
 	NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE (object);
 
-	if (priv->new_object_manager_cancellable) {
-		g_cancellable_cancel (priv->new_object_manager_cancellable);
-		g_clear_object (&priv->new_object_manager_cancellable);
-	}
+	nm_clear_g_cancellable (&priv->new_object_manager_cancellable);
 
 	if (priv->manager) {
 		g_signal_handlers_disconnect_by_data (priv->manager, object);
@@ -2564,6 +2569,11 @@ dispose (GObject *object)
 	}
 
 	G_OBJECT_CLASS (nm_client_parent_class)->dispose (object);
+
+	if (priv->udev) {
+		udev_unref (priv->udev);
+		priv->udev = NULL;
+	}
 }
 
 static void