diff options
Diffstat (limited to 'libnm/nm-client.c')
| -rw-r--r-- | libnm/nm-client.c | 42 |
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 |