about summary refs log tree commit diff
path: root/src/settings/nm-settings.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2016-08-03 22:59:23 +0200
committerMichael Biebl <biebl@debian.org>2016-08-03 22:59:23 +0200
commitd6201f5d8daada3d64a0a3e0038e14eebec683ce (patch)
tree035500728cc23e7ee5368c3fd605270265a077f7 /src/settings/nm-settings.c
parent73e152af6e3fb4f5848bfb8394484026ff119003 (diff)
Imported Upstream version 1.2.4 upstream/1.2.4
Diffstat (limited to 'src/settings/nm-settings.c')
-rw-r--r--src/settings/nm-settings.c232
1 files changed, 104 insertions, 128 deletions
diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c
index 65148994..73c678a6 100644
--- a/src/settings/nm-settings.c
+++ b/src/settings/nm-settings.c
@@ -36,6 +36,7 @@
 #include <selinux/selinux.h>
 #endif
 
+#include "nm-common-macros.h"
 #include "nm-dbus-interface.h"
 #include "nm-connection.h"
 #include "nm-setting-8021x.h"
@@ -157,7 +158,6 @@ typedef struct {
 
 	struct {
 		char *value;
-		char *file;
 		GFileMonitor *monitor;
 		GFileMonitor *dhcp_monitor;
 		gulong monitor_id;
@@ -171,7 +171,6 @@ typedef struct {
 enum {
 	CONNECTION_ADDED,
 	CONNECTION_UPDATED,
-	CONNECTION_UPDATED_BY_USER,
 	CONNECTION_REMOVED,
 	CONNECTION_VISIBILITY_CHANGED,
 	AGENT_REGISTERED,
@@ -181,16 +180,13 @@ enum {
 };
 static guint signals[LAST_SIGNAL] = { 0 };
 
-enum {
-	PROP_0,
+NM_GOBJECT_PROPERTIES_DEFINE (NMSettings,
 	PROP_UNMANAGED_SPECS,
 	PROP_HOSTNAME,
 	PROP_CAN_MODIFY,
 	PROP_CONNECTIONS,
 	PROP_STARTUP_COMPLETE,
-
-	LAST_PROP
-};
+);
 
 static void
 check_startup_complete (NMSettings *self)
@@ -209,7 +205,7 @@ check_startup_complete (NMSettings *self)
 	}
 
 	priv->startup_complete = TRUE;
-	g_object_notify (G_OBJECT (self), NM_SETTINGS_STARTUP_COMPLETE);
+	_notify (self, PROP_STARTUP_COMPLETE);
 }
 
 static void
@@ -589,11 +585,11 @@ nm_settings_get_hostname (NMSettings *self)
 #endif
 
 #if defined(HOSTNAME_PERSIST_GENTOO)
-	hostname = read_hostname_gentoo (priv->hostname.file);
+	hostname = read_hostname_gentoo (HOSTNAME_FILE);
 #elif defined(HOSTNAME_PERSIST_SLACKWARE)
-	hostname = read_hostname_slackware (priv->hostname.file);
+	hostname = read_hostname_slackware (HOSTNAME_FILE);
 #else
-	if (g_file_get_contents (priv->hostname.file, &hostname, NULL, NULL))
+	if (g_file_get_contents (HOSTNAME_FILE, &hostname, NULL, NULL))
 		g_strchomp (hostname);
 #endif
 
@@ -652,7 +648,7 @@ unmanaged_specs_changed (NMSettingsPlugin *config,
 
 	update_specs (self, &priv->unmanaged_specs,
 	              nm_settings_plugin_get_unmanaged_specs);
-	g_object_notify (G_OBJECT (self), NM_SETTINGS_UNMANAGED_SPECS);
+	_notify (self, PROP_UNMANAGED_SPECS);
 }
 
 static void
@@ -883,27 +879,17 @@ next:
 }
 
 static void
-connection_updated (NMSettingsConnection *connection, gpointer user_data)
+connection_updated (NMSettingsConnection *connection, gboolean by_user, gpointer user_data)
 {
-	/* Re-emit for listeners like NMPolicy */
 	g_signal_emit (NM_SETTINGS (user_data),
 	               signals[CONNECTION_UPDATED],
 	               0,
-	               connection);
+	               connection,
+	               by_user);
 	g_signal_emit_by_name (NM_SETTINGS (user_data), NM_CP_SIGNAL_CONNECTION_UPDATED, connection);
 }
 
 static void
-connection_updated_by_user (NMSettingsConnection *connection, gpointer user_data)
-{
-	/* Re-emit for listeners like NMPolicy */
-	g_signal_emit (NM_SETTINGS (user_data),
-	               signals[CONNECTION_UPDATED_BY_USER],
-	               0,
-	               connection);
-}
-
-static void
 connection_visibility_changed (NMSettingsConnection *connection,
                                GParamSpec *pspec,
                                gpointer user_data)
@@ -933,7 +919,6 @@ connection_removed (NMSettingsConnection *connection, gpointer user_data)
 
 	g_signal_handlers_disconnect_by_func (connection, G_CALLBACK (connection_removed), self);
 	g_signal_handlers_disconnect_by_func (connection, G_CALLBACK (connection_updated), self);
-	g_signal_handlers_disconnect_by_func (connection, G_CALLBACK (connection_updated_by_user), self);
 	g_signal_handlers_disconnect_by_func (connection, G_CALLBACK (connection_visibility_changed), self);
 	g_signal_handlers_disconnect_by_func (connection, G_CALLBACK (connection_ready_changed), self);
 	g_object_unref (self);
@@ -946,7 +931,7 @@ connection_removed (NMSettingsConnection *connection, gpointer user_data)
 
 	/* Re-emit for listeners like NMPolicy */
 	g_signal_emit_by_name (self, NM_CP_SIGNAL_CONNECTION_REMOVED, connection);
-	g_object_notify (G_OBJECT (self), NM_SETTINGS_CONNECTIONS);
+	_notify (self, PROP_CONNECTIONS);
 	if (nm_exported_object_is_exported (NM_EXPORTED_OBJECT (connection)))
 		nm_exported_object_unexport (NM_EXPORTED_OBJECT (connection));
 
@@ -1065,10 +1050,8 @@ claim_connection (NMSettings *self, NMSettingsConnection *connection)
 	g_object_ref (self);
 	g_signal_connect (connection, NM_SETTINGS_CONNECTION_REMOVED,
 	                  G_CALLBACK (connection_removed), self);
-	g_signal_connect (connection, NM_SETTINGS_CONNECTION_UPDATED,
+	g_signal_connect (connection, NM_SETTINGS_CONNECTION_UPDATED_INTERNAL,
 	                  G_CALLBACK (connection_updated), self);
-	g_signal_connect (connection, NM_SETTINGS_CONNECTION_UPDATED_BY_USER,
-	                  G_CALLBACK (connection_updated_by_user), self);
 	g_signal_connect (connection, "notify::" NM_SETTINGS_CONNECTION_VISIBLE,
 	                  G_CALLBACK (connection_visibility_changed),
 	                  self);
@@ -1096,7 +1079,7 @@ claim_connection (NMSettings *self, NMSettingsConnection *connection)
 		/* Internal added signal */
 		g_signal_emit (self, signals[CONNECTION_ADDED], 0, connection);
 		g_signal_emit_by_name (self, NM_CP_SIGNAL_CONNECTION_ADDED, connection);
-		g_object_notify (G_OBJECT (self), NM_SETTINGS_CONNECTIONS);
+		_notify (self, PROP_CONNECTIONS);
 
 		/* Exported D-Bus signal */
 		g_signal_emit (self, signals[NEW_CONNECTION], 0, connection);
@@ -1111,7 +1094,7 @@ claim_connection (NMSettings *self, NMSettingsConnection *connection)
  * not save to disk
  * @error: on return, a location to store any errors that may occur
  *
- * Creates a new #NMSettingsConnection for the given source @connection.  
+ * Creates a new #NMSettingsConnection for the given source @connection.
  * The returned object is owned by @self and the caller must reference
  * the object to continue using it.
  *
@@ -1635,7 +1618,7 @@ write_hostname (NMSettingsPrivate *priv, const char *hostname)
 	char *hostname_eol;
 	gboolean ret;
 	gs_free_error GError *error = NULL;
-	const char *file = priv->hostname.file;
+	const char *file = HOSTNAME_FILE;
 	gs_free char *link_path = NULL;
 	gs_unref_variant GVariant *var = NULL;
 	struct stat file_stat;
@@ -1664,7 +1647,7 @@ write_hostname (NMSettingsPrivate *priv, const char *hostname)
 	 */
 	if (   lstat (file, &file_stat) == 0
 	    && S_ISLNK (file_stat.st_mode)
-	    && (link_path = g_file_read_link (file, NULL)))
+	    && (link_path = nm_utils_read_link_absolute (file, NULL)))
 		file = link_path;
 
 #if HAVE_SELINUX
@@ -1830,7 +1813,7 @@ hostname_maybe_changed (NMSettings *settings)
 		       NM_PRINT_FMT_QUOTED (new_hostname, "\"", new_hostname, "\"", "(none)"));
 		g_free (priv->hostname.value);
 		priv->hostname.value = new_hostname;
-		g_object_notify (G_OBJECT (settings), NM_SETTINGS_HOSTNAME);
+		_notify (settings, PROP_HOSTNAME);
 	} else
 		g_free (new_hostname);
 }
@@ -1932,10 +1915,13 @@ default_wired_connection_removed_cb (NMSettingsConnection *connection, NMSetting
 }
 
 static void
-default_wired_connection_updated_by_user_cb (NMSettingsConnection *connection, NMSettings *self)
+default_wired_connection_updated_by_user_cb (NMSettingsConnection *connection, gboolean by_user, NMSettings *self)
 {
 	NMDevice *device;
 
+	if (!by_user)
+		return;
+
 	/* The connection has been changed by the user, it should no longer be
 	 * considered a default wired connection, and should no longer affect
 	 * the no-auto-default configuration option.
@@ -2010,7 +1996,7 @@ device_realized (NMDevice *device, GParamSpec *pspec, NMSettings *self)
 	g_object_set_data (G_OBJECT (added), DEFAULT_WIRED_DEVICE_TAG, device);
 	g_object_set_data (G_OBJECT (device), DEFAULT_WIRED_CONNECTION_TAG, added);
 
-	g_signal_connect (added, NM_SETTINGS_CONNECTION_UPDATED_BY_USER,
+	g_signal_connect (added, NM_SETTINGS_CONNECTION_UPDATED_INTERNAL,
 	                  G_CALLBACK (default_wired_connection_updated_by_user_cb), self);
 	g_signal_connect (added, NM_SETTINGS_CONNECTION_REMOVED,
 	                  G_CALLBACK (default_wired_connection_removed_cb), self);
@@ -2174,7 +2160,8 @@ hostnamed_properties_changed (GDBusProxy *proxy,
                               char **invalidated_properties,
                               gpointer user_data)
 {
-	NMSettingsPrivate *priv = NM_SETTINGS_GET_PRIVATE (user_data);
+	NMSettings *self = user_data;
+	NMSettingsPrivate *priv = NM_SETTINGS_GET_PRIVATE (self);
 	GVariant *v_hostname;
 	const char *hostname;
 
@@ -2191,7 +2178,7 @@ hostnamed_properties_changed (GDBusProxy *proxy,
 		       NM_PRINT_FMT_QUOTED (hostname, "\"", hostname, "\"", "(none)"));
 		g_free (priv->hostname.value);
 		priv->hostname.value = g_strdup (hostname);
-		g_object_notify (G_OBJECT (user_data), NM_SETTINGS_HOSTNAME);
+		_notify (self, PROP_HOSTNAME);
 		nm_dispatcher_call (DISPATCHER_ACTION_HOSTNAME, NULL, NULL, NULL, NULL, NULL, NULL);
 	}
 
@@ -2205,11 +2192,10 @@ setup_hostname_file_monitors (NMSettings *self)
 	GFileMonitor *monitor;
 	GFile *file;
 
-	priv->hostname.file = HOSTNAME_FILE;
 	priv->hostname.value = nm_settings_get_hostname (self);
 
 	/* monitor changes to hostname file */
-	file = g_file_new_for_path (priv->hostname.file);
+	file = g_file_new_for_path (HOSTNAME_FILE);
 	monitor = g_file_monitor_file (file, G_FILE_MONITOR_NONE, NULL, NULL);
 	g_object_unref (file);
 	if (monitor) {
@@ -2296,7 +2282,7 @@ nm_settings_start (NMSettings *self, GError **error)
 		setup_hostname_file_monitors (self);
 
 	priv->started = TRUE;
-	g_object_notify (G_OBJECT (self), NM_SETTINGS_HOSTNAME);
+	_notify (self, PROP_HOSTNAME);
 	return TRUE;
 }
 
@@ -2447,96 +2433,86 @@ nm_settings_class_init (NMSettingsClass *class)
 
 	/* properties */
 
-	g_object_class_install_property
-		(object_class, PROP_UNMANAGED_SPECS,
-		 g_param_spec_boxed (NM_SETTINGS_UNMANAGED_SPECS, "", "",
-		                     G_TYPE_STRV,
-		                     G_PARAM_READABLE |
-		                     G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_HOSTNAME,
-		 g_param_spec_string (NM_SETTINGS_HOSTNAME, "", "",
-		                      NULL,
-		                      G_PARAM_READABLE |
-		                      G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_CAN_MODIFY,
-		 g_param_spec_boolean (NM_SETTINGS_CAN_MODIFY, "", "",
-		                       FALSE,
-		                       G_PARAM_READABLE |
-		                       G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_CONNECTIONS,
-		 g_param_spec_boxed (NM_SETTINGS_CONNECTIONS, "", "",
-		                     G_TYPE_STRV,
-		                     G_PARAM_READABLE |
-		                     G_PARAM_STATIC_STRINGS));
+	obj_properties[PROP_UNMANAGED_SPECS] =
+	    g_param_spec_boxed (NM_SETTINGS_UNMANAGED_SPECS, "", "",
+	                        G_TYPE_STRV,
+	                        G_PARAM_READABLE |
+	                        G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_HOSTNAME] =
+	    g_param_spec_string (NM_SETTINGS_HOSTNAME, "", "",
+	                         NULL,
+	                         G_PARAM_READABLE |
+	                         G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_CAN_MODIFY] =
+	    g_param_spec_boolean (NM_SETTINGS_CAN_MODIFY, "", "",
+	                          FALSE,
+	                          G_PARAM_READABLE |
+	                          G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_CONNECTIONS] =
+	    g_param_spec_boxed (NM_SETTINGS_CONNECTIONS, "", "",
+	                        G_TYPE_STRV,
+	                        G_PARAM_READABLE |
+	                        G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_STARTUP_COMPLETE] =
+	    g_param_spec_boolean (NM_SETTINGS_STARTUP_COMPLETE, "", "",
+	                          FALSE,
+	                          G_PARAM_READABLE |
+	                          G_PARAM_STATIC_STRINGS);
+
+	g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);
 
 	/* signals */
-	signals[CONNECTION_ADDED] = 
-	                g_signal_new (NM_SETTINGS_SIGNAL_CONNECTION_ADDED,
-	                              G_OBJECT_CLASS_TYPE (object_class),
-	                              G_SIGNAL_RUN_FIRST,
-	                              G_STRUCT_OFFSET (NMSettingsClass, connection_added),
-	                              NULL, NULL,
-	                              g_cclosure_marshal_VOID__OBJECT,
-	                              G_TYPE_NONE, 1, NM_TYPE_SETTINGS_CONNECTION);
-
-	signals[CONNECTION_UPDATED] = 
-	                g_signal_new (NM_SETTINGS_SIGNAL_CONNECTION_UPDATED,
-	                              G_OBJECT_CLASS_TYPE (object_class),
-	                              G_SIGNAL_RUN_FIRST,
-	                              G_STRUCT_OFFSET (NMSettingsClass, connection_updated),
-	                              NULL, NULL,
-	                              g_cclosure_marshal_VOID__OBJECT,
-	                              G_TYPE_NONE, 1, NM_TYPE_SETTINGS_CONNECTION);
-
-	signals[CONNECTION_UPDATED_BY_USER] =
-	                g_signal_new (NM_SETTINGS_SIGNAL_CONNECTION_UPDATED_BY_USER,
-	                              G_OBJECT_CLASS_TYPE (object_class),
-	                              G_SIGNAL_RUN_FIRST,
-	                              0,
-	                              NULL, NULL,
-	                              g_cclosure_marshal_VOID__OBJECT,
-	                              G_TYPE_NONE, 1, NM_TYPE_SETTINGS_CONNECTION);
-
-	signals[CONNECTION_REMOVED] = 
-	                g_signal_new (NM_SETTINGS_SIGNAL_CONNECTION_REMOVED,
-	                              G_OBJECT_CLASS_TYPE (object_class),
-	                              G_SIGNAL_RUN_FIRST,
-	                              G_STRUCT_OFFSET (NMSettingsClass, connection_removed),
-	                              NULL, NULL,
-	                              g_cclosure_marshal_VOID__OBJECT,
-	                              G_TYPE_NONE, 1, NM_TYPE_SETTINGS_CONNECTION);
-
-	signals[CONNECTION_VISIBILITY_CHANGED] = 
-	                g_signal_new (NM_SETTINGS_SIGNAL_CONNECTION_VISIBILITY_CHANGED,
-	                              G_OBJECT_CLASS_TYPE (object_class),
-	                              G_SIGNAL_RUN_FIRST,
-	                              G_STRUCT_OFFSET (NMSettingsClass, connection_visibility_changed),
-	                              NULL, NULL,
-	                              g_cclosure_marshal_VOID__OBJECT,
-	                              G_TYPE_NONE, 1, NM_TYPE_SETTINGS_CONNECTION);
+	signals[CONNECTION_ADDED] =
+	    g_signal_new (NM_SETTINGS_SIGNAL_CONNECTION_ADDED,
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  0, NULL, NULL,
+	                  g_cclosure_marshal_VOID__OBJECT,
+	                  G_TYPE_NONE, 1, NM_TYPE_SETTINGS_CONNECTION);
+
+	signals[CONNECTION_UPDATED] =
+	    g_signal_new (NM_SETTINGS_SIGNAL_CONNECTION_UPDATED,
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  0, NULL, NULL,
+	                  NULL,
+	                  G_TYPE_NONE, 2, NM_TYPE_SETTINGS_CONNECTION, G_TYPE_BOOLEAN);
+
+	signals[CONNECTION_REMOVED] =
+	    g_signal_new (NM_SETTINGS_SIGNAL_CONNECTION_REMOVED,
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  0, NULL, NULL,
+	                  g_cclosure_marshal_VOID__OBJECT,
+	                  G_TYPE_NONE, 1, NM_TYPE_SETTINGS_CONNECTION);
+
+	signals[CONNECTION_VISIBILITY_CHANGED] =
+	    g_signal_new (NM_SETTINGS_SIGNAL_CONNECTION_VISIBILITY_CHANGED,
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  0, NULL, NULL,
+	                  g_cclosure_marshal_VOID__OBJECT,
+	                  G_TYPE_NONE, 1, NM_TYPE_SETTINGS_CONNECTION);
 
 	signals[AGENT_REGISTERED] =
-		g_signal_new (NM_SETTINGS_SIGNAL_AGENT_REGISTERED,
-		              G_OBJECT_CLASS_TYPE (object_class),
-		              G_SIGNAL_RUN_FIRST,
-		              G_STRUCT_OFFSET (NMSettingsClass, agent_registered),
-		              NULL, NULL,
-		              g_cclosure_marshal_VOID__OBJECT,
-		              G_TYPE_NONE, 1, NM_TYPE_SECRET_AGENT);
-
-
-	signals[NEW_CONNECTION] = 
-	                g_signal_new ("new-connection",
-	                              G_OBJECT_CLASS_TYPE (object_class),
-	                              G_SIGNAL_RUN_FIRST, 0, NULL, NULL,
-	                              g_cclosure_marshal_VOID__OBJECT,
-	                              G_TYPE_NONE, 1, NM_TYPE_SETTINGS_CONNECTION);
+	    g_signal_new (NM_SETTINGS_SIGNAL_AGENT_REGISTERED,
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  0, NULL, NULL,
+	                  g_cclosure_marshal_VOID__OBJECT,
+	                  G_TYPE_NONE, 1, NM_TYPE_SECRET_AGENT);
+
+
+	signals[NEW_CONNECTION] =
+	    g_signal_new ("new-connection",
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST, 0, NULL, NULL,
+	                  g_cclosure_marshal_VOID__OBJECT,
+	                  G_TYPE_NONE, 1, NM_TYPE_SETTINGS_CONNECTION);
 
 	nm_exported_object_class_add_interface (NM_EXPORTED_OBJECT_CLASS (class),
 	                                        NMDBUS_TYPE_SETTINGS_SKELETON,