summary refs log tree commit diff
path: root/src/settings
diff options
context:
space:
mode:
Diffstat (limited to 'src/settings')
-rw-r--r--src/settings/nm-agent-manager.c84
-rw-r--r--src/settings/nm-inotify-helper.c43
-rw-r--r--src/settings/nm-settings-connection.c2
-rw-r--r--src/settings/nm-settings.c2
4 files changed, 67 insertions, 64 deletions
diff --git a/src/settings/nm-agent-manager.c b/src/settings/nm-agent-manager.c
index c694ad6f..8d9252a5 100644
--- a/src/settings/nm-agent-manager.c
+++ b/src/settings/nm-agent-manager.c
@@ -50,9 +50,8 @@ G_DEFINE_TYPE (NMAgentManager, nm_agent_manager, G_TYPE_OBJECT)
                                          NMAgentManagerPrivate))
 
 typedef struct {
-	gboolean disposed;
-
 	NMDBusManager *dbus_mgr;
+	NMAuthManager *auth_mgr;
 
 	/* Auth chains for checking agent permissions */
 	GSList *chains;
@@ -1559,35 +1558,7 @@ authority_changed_cb (NMAuthManager *auth_manager, NMAgentManager *self)
 
 /*************************************************************/
 
-NMAgentManager *
-nm_agent_manager_get (void)
-{
-	static NMAgentManager *singleton = NULL;
-	NMAgentManagerPrivate *priv;
-
-	if (singleton)
-		return g_object_ref (singleton);
-
-	singleton = (NMAgentManager *) g_object_new (NM_TYPE_AGENT_MANAGER, NULL);
-	g_assert (singleton);
-
-	priv = NM_AGENT_MANAGER_GET_PRIVATE (singleton);
-	priv->dbus_mgr = nm_dbus_manager_get ();
-
-	nm_dbus_manager_register_object (priv->dbus_mgr, NM_DBUS_PATH_AGENT_MANAGER, singleton);
-
-	g_signal_connect (priv->dbus_mgr,
-	                  NM_DBUS_MANAGER_NAME_OWNER_CHANGED,
-	                  G_CALLBACK (name_owner_changed_cb),
-	                  singleton);
-
-	g_signal_connect (nm_auth_manager_get (),
-	                  NM_AUTH_MANAGER_SIGNAL_CHANGED,
-	                  G_CALLBACK (authority_changed_cb),
-	                  singleton);
-
-	return singleton;
-}
+NM_DEFINE_SINGLETON_GETTER (NMAgentManager, nm_agent_manager_get, NM_TYPE_AGENT_MANAGER);
 
 static void
 nm_agent_manager_init (NMAgentManager *self)
@@ -1602,23 +1573,57 @@ nm_agent_manager_init (NMAgentManager *self)
 }
 
 static void
-dispose (GObject *object)
+constructed (GObject *object)
 {
 	NMAgentManagerPrivate *priv = NM_AGENT_MANAGER_GET_PRIVATE (object);
 
-	if (!priv->disposed) {
-		priv->disposed = TRUE;
+	G_OBJECT_CLASS (nm_agent_manager_parent_class)->constructed (object);
 
-		g_signal_handlers_disconnect_by_func (nm_auth_manager_get (),
-		                                      G_CALLBACK (authority_changed_cb),
-		                                      object);
+	priv->dbus_mgr = g_object_ref (nm_dbus_manager_get ());
+	priv->auth_mgr = g_object_ref (nm_auth_manager_get ());
+
+	nm_dbus_manager_register_object (priv->dbus_mgr, NM_DBUS_PATH_AGENT_MANAGER, object);
 
-		g_slist_free_full (priv->chains, (GDestroyNotify) nm_auth_chain_unref);
+	g_signal_connect (priv->dbus_mgr,
+	                  NM_DBUS_MANAGER_NAME_OWNER_CHANGED,
+	                  G_CALLBACK (name_owner_changed_cb),
+	                  object);
+
+	g_signal_connect (priv->auth_mgr,
+	                  NM_AUTH_MANAGER_SIGNAL_CHANGED,
+	                  G_CALLBACK (authority_changed_cb),
+	                  object);
+}
 
+static void
+dispose (GObject *object)
+{
+	NMAgentManagerPrivate *priv = NM_AGENT_MANAGER_GET_PRIVATE (object);
+
+	g_slist_free_full (priv->chains, (GDestroyNotify) nm_auth_chain_unref);
+	priv->chains = NULL;
+
+	if (priv->agents) {
 		g_hash_table_destroy (priv->agents);
+		priv->agents = NULL;
+	}
+	if (priv->requests) {
 		g_hash_table_destroy (priv->requests);
+		priv->requests = NULL;
+	}
 
-		priv->dbus_mgr = NULL;
+	if (priv->auth_mgr) {
+		g_signal_handlers_disconnect_by_func (priv->auth_mgr,
+		                                      G_CALLBACK (authority_changed_cb),
+		                                      object);
+		g_clear_object (&priv->auth_mgr);
+	}
+	if (priv->dbus_mgr) {
+		g_signal_handlers_disconnect_by_func (priv->dbus_mgr,
+		                                      G_CALLBACK (name_owner_changed_cb),
+		                                      object);
+		nm_dbus_manager_unregister_object (priv->dbus_mgr, object);
+		g_clear_object (&priv->dbus_mgr);
 	}
 
 	G_OBJECT_CLASS (nm_agent_manager_parent_class)->dispose (object);
@@ -1632,6 +1637,7 @@ nm_agent_manager_class_init (NMAgentManagerClass *agent_manager_class)
 	g_type_class_add_private (agent_manager_class, sizeof (NMAgentManagerPrivate));
 
 	/* virtual methods */
+	object_class->constructed = constructed;
 	object_class->dispose = dispose;
 
 	/* Signals */
diff --git a/src/settings/nm-inotify-helper.c b/src/settings/nm-inotify-helper.c
index 41f0268d..3732e77a 100644
--- a/src/settings/nm-inotify-helper.c
+++ b/src/settings/nm-inotify-helper.c
@@ -24,6 +24,7 @@
 #include <string.h>
 #include <sys/inotify.h>
 #include <glib.h>
+#include <errno.h>
 
 #include "nm-inotify-helper.h"
 #include "nm-logging.h"
@@ -55,9 +56,10 @@ nm_inotify_helper_add_watch (NMInotifyHelper *self, const char *path)
 {
 	NMInotifyHelperPrivate *priv = NM_INOTIFY_HELPER_GET_PRIVATE (self);
 	int wd;
-	guint32 refcount;
+	guint refcount;
 
-	g_return_val_if_fail (priv->ifd >= 0, -1);
+	if (priv->ifd < 0)
+		return -1;
 
 	/* We only care about modifications since we're just trying to get change
 	 * notifications on hardlinks.
@@ -78,9 +80,10 @@ void
 nm_inotify_helper_remove_watch (NMInotifyHelper *self, int wd)
 {
 	NMInotifyHelperPrivate *priv = NM_INOTIFY_HELPER_GET_PRIVATE (self);
-	guint32 refcount;
+	guint refcount;
 
-	g_return_if_fail (priv->ifd >= 0);
+	if (priv->ifd < 0)
+		return;
 
 	refcount = GPOINTER_TO_UINT (g_hash_table_lookup (priv->wd_refs, GINT_TO_POINTER (wd)));
 	if (!refcount)
@@ -128,7 +131,9 @@ init_inotify (NMInotifyHelper *self)
 
 	priv->ifd = inotify_init ();
 	if (priv->ifd == -1) {
-		nm_log_warn (LOGD_SETTINGS, "couldn't initialize inotify");
+		int errsv = errno;
+
+		nm_log_warn (LOGD_SETTINGS, "couldn't initialize inotify: %s (%d)", strerror (errsv), errsv);
 		return FALSE;
 	}
 
@@ -145,24 +150,7 @@ init_inotify (NMInotifyHelper *self)
 	return TRUE;
 }
 
-NMInotifyHelper *
-nm_inotify_helper_get (void)
-{
-	static NMInotifyHelper *singleton_instance = NULL;
-
-	if (!singleton_instance) {
-		singleton_instance = (NMInotifyHelper *) g_object_new (NM_TYPE_INOTIFY_HELPER, NULL);
-
-		if (!init_inotify (singleton_instance)) {
-			g_clear_object (&singleton_instance);
-			return NULL;
-		}
-	} else
-		g_object_ref (singleton_instance);
-
-	g_assert (singleton_instance);
-	return singleton_instance;
-}
+NM_DEFINE_SINGLETON_GETTER (NMInotifyHelper, nm_inotify_helper_get, NM_TYPE_INOTIFY_HELPER);
 
 static void
 nm_inotify_helper_init (NMInotifyHelper *self)
@@ -173,6 +161,14 @@ nm_inotify_helper_init (NMInotifyHelper *self)
 }
 
 static void
+constructed (GObject *object)
+{
+	G_OBJECT_CLASS (nm_inotify_helper_parent_class)->constructed (object);
+
+	init_inotify (NM_INOTIFY_HELPER (object));
+}
+
+static void
 finalize (GObject *object)
 {
 	NMInotifyHelperPrivate *priv = NM_INOTIFY_HELPER_GET_PRIVATE (object);
@@ -193,6 +189,7 @@ nm_inotify_helper_class_init (NMInotifyHelperClass *klass)
 	g_type_class_add_private (klass, sizeof (NMInotifyHelperPrivate));
 
 	/* Virtual methods */
+	object_class->constructed = constructed;
 	object_class->finalize = finalize;
 
 	/* Signals */
diff --git a/src/settings/nm-settings-connection.c b/src/settings/nm-settings-connection.c
index da5384c0..1fa19237 100644
--- a/src/settings/nm-settings-connection.c
+++ b/src/settings/nm-settings-connection.c
@@ -2282,7 +2282,7 @@ nm_settings_connection_init (NMSettingsConnection *self)
 	                                             G_CALLBACK (session_changed_cb),
 	                                             self);
 
-	priv->agent_mgr = nm_agent_manager_get ();
+	priv->agent_mgr = g_object_ref (nm_agent_manager_get ());
 
 	priv->seen_bssids = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
 
diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c
index 4d7d697d..f20bc71b 100644
--- a/src/settings/nm-settings.c
+++ b/src/settings/nm-settings.c
@@ -1922,7 +1922,7 @@ nm_settings_init (NMSettings *self)
 	 * transient, and we don't want the agent manager to get destroyed and
 	 * recreated often.
 	 */
-	priv->agent_mgr = nm_agent_manager_get ();
+	priv->agent_mgr = g_object_ref (nm_agent_manager_get ());
 
 	g_signal_connect (priv->agent_mgr, "agent-registered", G_CALLBACK (secret_agent_registered), self);
 }