summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Winship <danw@redhat.com>2014-12-18 16:04:07 -0500
committerDan Winship <danw@redhat.com>2015-01-14 11:35:17 -0500
commitc5bca2fb90041d9c8aa977f370fc6928b89ff6dc (patch)
tree9304fbc7938fe817cda6ca462ca1d2b19c1cbb51
parent33eda353f779b5daa1ed2897a50f6bb2210e15f4 (diff)
downloadNetworkManager-c5bca2fb90041d9c8aa977f370fc6928b89ff6dc.tar.gz
core: allow connections to participate in NMManager:startup-complete
Add an NMSettingsConnection:ready property, which indicates if the connection is ready to use. Add NMSettings:startup-complete, which is TRUE when all connections are ready. Make NMManager:startup-complete take NMSettings:startup-complete into account. (cherry picked from commit b067ca703404ccad68404456c83caa5983a597ab)
-rw-r--r--src/nm-manager.c15
-rw-r--r--src/settings/nm-settings-connection.c35
-rw-r--r--src/settings/nm-settings-connection.h5
-rw-r--r--src/settings/nm-settings.c56
-rw-r--r--src/settings/nm-settings.h11
5 files changed, 118 insertions, 4 deletions
diff --git a/src/nm-manager.c b/src/nm-manager.c
index e3035c003e..65fb5682c4 100644
--- a/src/nm-manager.c
+++ b/src/nm-manager.c
@@ -686,6 +686,11 @@ check_if_startup_complete (NMManager *self)
if (!priv->startup)
return;
+ if (!nm_settings_get_startup_complete (priv->settings)) {
+ nm_log_dbg (LOGD_CORE, "check_if_startup_complete returns FALSE because of NMSettings");
+ return;
+ }
+
for (iter = priv->devices; iter; iter = iter->next) {
NMDevice *dev = iter->data;
@@ -721,6 +726,14 @@ device_has_pending_action_changed (NMDevice *device,
}
static void
+settings_startup_complete_changed (NMSettings *settings,
+ GParamSpec *pspec,
+ NMManager *self)
+{
+ check_if_startup_complete (self);
+}
+
+static void
remove_device (NMManager *manager,
NMDevice *device,
gboolean quitting,
@@ -4720,6 +4733,8 @@ nm_manager_new (NMSettings *settings,
priv->prop_filter_added = TRUE;
priv->settings = g_object_ref (settings);
+ g_signal_connect (priv->settings, "notify::" NM_SETTINGS_STARTUP_COMPLETE,
+ G_CALLBACK (settings_startup_complete_changed), singleton);
priv->state_file = g_strdup (state_file);
diff --git a/src/settings/nm-settings-connection.c b/src/settings/nm-settings-connection.c
index 529f4d8f4b..4dfa7b164a 100644
--- a/src/settings/nm-settings-connection.c
+++ b/src/settings/nm-settings-connection.c
@@ -82,6 +82,7 @@ enum {
PROP_0 = 0,
PROP_VISIBLE,
PROP_UNSAVED,
+ PROP_READY,
PROP_FLAGS,
};
@@ -99,6 +100,7 @@ typedef struct {
guint session_changed_id;
NMSettingsConnectionFlags flags;
+ gboolean ready;
guint updated_idle_id;
@@ -2166,6 +2168,25 @@ nm_settings_connection_get_nm_generated_assumed (NMSettingsConnection *connectio
return NM_FLAGS_HAS (nm_settings_connection_get_flags (connection), NM_SETTINGS_CONNECTION_FLAGS_NM_GENERATED_ASSUMED);
}
+gboolean
+nm_settings_connection_get_ready (NMSettingsConnection *connection)
+{
+ return NM_SETTINGS_CONNECTION_GET_PRIVATE (connection)->ready;
+}
+
+void
+nm_settings_connection_set_ready (NMSettingsConnection *connection,
+ gboolean ready)
+{
+ NMSettingsConnectionPrivate *priv = NM_SETTINGS_CONNECTION_GET_PRIVATE (connection);
+
+ ready = !!ready;
+ if (priv->ready != ready) {
+ priv->ready = ready;
+ g_object_notify (G_OBJECT (connection), NM_SETTINGS_CONNECTION_READY);
+ }
+}
+
/**************************************************************/
static void
@@ -2174,6 +2195,7 @@ nm_settings_connection_init (NMSettingsConnection *self)
NMSettingsConnectionPrivate *priv = NM_SETTINGS_CONNECTION_GET_PRIVATE (self);
priv->visible = FALSE;
+ priv->ready = TRUE;
priv->session_monitor = nm_session_monitor_get ();
priv->session_changed_id = g_signal_connect (priv->session_monitor,
@@ -2252,6 +2274,9 @@ get_property (GObject *object, guint prop_id,
case PROP_UNSAVED:
g_value_set_boolean (value, nm_settings_connection_get_unsaved (self));
break;
+ case PROP_READY:
+ g_value_set_boolean (value, nm_settings_connection_get_ready (self));
+ break;
case PROP_FLAGS:
g_value_set_uint (value, nm_settings_connection_get_flags (self));
break;
@@ -2268,6 +2293,9 @@ set_property (GObject *object, guint prop_id,
NMSettingsConnection *self = NM_SETTINGS_CONNECTION (object);
switch (prop_id) {
+ case PROP_READY:
+ nm_settings_connection_set_ready (self, g_value_get_boolean (value));
+ break;
case PROP_FLAGS:
nm_settings_connection_set_flags_all (self, g_value_get_uint (value));
break;
@@ -2309,6 +2337,13 @@ nm_settings_connection_class_init (NMSettingsConnectionClass *class)
G_PARAM_STATIC_STRINGS));
g_object_class_install_property
+ (object_class, PROP_READY,
+ g_param_spec_boolean (NM_SETTINGS_CONNECTION_READY, "", "",
+ TRUE,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property
(object_class, PROP_FLAGS,
g_param_spec_uint (NM_SETTINGS_CONNECTION_FLAGS, "", "",
NM_SETTINGS_CONNECTION_FLAGS_NONE,
diff --git a/src/settings/nm-settings-connection.h b/src/settings/nm-settings-connection.h
index 254e927bfd..cd41c1d5f6 100644
--- a/src/settings/nm-settings-connection.h
+++ b/src/settings/nm-settings-connection.h
@@ -48,6 +48,7 @@ G_BEGIN_DECLS
/* Properties */
#define NM_SETTINGS_CONNECTION_VISIBLE "visible"
#define NM_SETTINGS_CONNECTION_UNSAVED "unsaved"
+#define NM_SETTINGS_CONNECTION_READY "ready"
#define NM_SETTINGS_CONNECTION_FLAGS "flags"
@@ -196,6 +197,10 @@ gboolean nm_settings_connection_can_autoconnect (NMSettingsConnection *connectio
gboolean nm_settings_connection_get_nm_generated (NMSettingsConnection *connection);
gboolean nm_settings_connection_get_nm_generated_assumed (NMSettingsConnection *connection);
+gboolean nm_settings_connection_get_ready (NMSettingsConnection *connection);
+void nm_settings_connection_set_ready (NMSettingsConnection *connection,
+ gboolean ready);
+
G_END_DECLS
#endif /* __NETWORKMANAGER_SETTINGS_CONNECTION_H__ */
diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c
index 9ed03f69b9..bc123b4686 100644
--- a/src/settings/nm-settings.c
+++ b/src/settings/nm-settings.c
@@ -151,6 +151,8 @@ typedef struct {
GSList *unmanaged_specs;
GSList *unrecognized_specs;
GSList *get_connections_cache;
+
+ gboolean startup_complete;
} NMSettingsPrivate;
#define NM_SETTINGS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTINGS, NMSettingsPrivate))
@@ -175,11 +177,43 @@ enum {
PROP_HOSTNAME,
PROP_CAN_MODIFY,
PROP_CONNECTIONS,
+ PROP_STARTUP_COMPLETE,
LAST_PROP
};
static void
+check_startup_complete (NMSettings *self)
+{
+ NMSettingsPrivate *priv = NM_SETTINGS_GET_PRIVATE (self);
+ GHashTableIter iter;
+ NMSettingsConnection *conn;
+
+ if (priv->startup_complete)
+ return;
+
+ g_hash_table_iter_init (&iter, priv->connections);
+ while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &conn)) {
+ if (!nm_settings_connection_get_ready (conn))
+ return;
+ }
+
+ priv->startup_complete = TRUE;
+ g_object_notify (G_OBJECT (self), NM_SETTINGS_STARTUP_COMPLETE);
+}
+
+static void
+connection_ready_changed (NMSettingsConnection *conn,
+ GParamSpec *pspec,
+ gpointer user_data)
+{
+ NMSettings *self = NM_SETTINGS (user_data);
+
+ if (nm_settings_connection_get_ready (conn))
+ check_startup_complete (self);
+}
+
+static void
plugin_connection_added (NMSystemConfigInterface *config,
NMSettingsConnection *connection,
gpointer user_data)
@@ -772,6 +806,7 @@ connection_removed (NMSettingsConnection *connection, gpointer user_data)
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);
/* Forget about the connection internally */
g_hash_table_remove (NM_SETTINGS_GET_PRIVATE (user_data)->connections,
@@ -784,6 +819,8 @@ connection_removed (NMSettingsConnection *connection, gpointer user_data)
g_signal_emit_by_name (self, NM_CP_SIGNAL_CONNECTION_REMOVED, connection);
g_object_notify (G_OBJECT (self), NM_SETTINGS_CONNECTIONS);
+ check_startup_complete (self);
+
g_object_unref (connection);
}
@@ -889,6 +926,11 @@ claim_connection (NMSettings *self,
g_signal_connect (connection, "notify::" NM_SETTINGS_CONNECTION_VISIBLE,
G_CALLBACK (connection_visibility_changed),
self);
+ if (!priv->startup_complete) {
+ g_signal_connect (connection, "notify::" NM_SETTINGS_CONNECTION_READY,
+ G_CALLBACK (connection_ready_changed),
+ self);
+ }
/* Export the connection over D-Bus */
g_warn_if_fail (nm_connection_get_path (NM_CONNECTION (connection)) == NULL);
@@ -1780,6 +1822,16 @@ cp_get_connection_by_uuid (NMConnectionProvider *provider, const char *uuid)
/***************************************************************/
+gboolean
+nm_settings_get_startup_complete (NMSettings *self)
+{
+ NMSettingsPrivate *priv = NM_SETTINGS_GET_PRIVATE (self);
+
+ return priv->startup_complete;
+}
+
+/***************************************************************/
+
NMSettings *
nm_settings_new (GError **error)
{
@@ -1800,6 +1852,7 @@ nm_settings_new (GError **error)
}
load_connections (self);
+ check_startup_complete (self);
nm_dbus_manager_register_object (priv->dbus_mgr, NM_DBUS_PATH_SETTINGS, self);
return self;
@@ -1900,6 +1953,9 @@ get_property (GObject *object, guint prop_id,
g_ptr_array_add (array, g_strdup (path));
g_value_take_boxed (value, array);
break;
+ case PROP_STARTUP_COMPLETE:
+ g_value_set_boolean (value, nm_settings_get_startup_complete (self));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
diff --git a/src/settings/nm-settings.h b/src/settings/nm-settings.h
index 520c4ec34c..9c0a4c835e 100644
--- a/src/settings/nm-settings.h
+++ b/src/settings/nm-settings.h
@@ -37,10 +37,11 @@
#define NM_IS_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTINGS))
#define NM_SETTINGS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTINGS, NMSettingsClass))
-#define NM_SETTINGS_UNMANAGED_SPECS "unmanaged-specs"
-#define NM_SETTINGS_HOSTNAME "hostname"
-#define NM_SETTINGS_CAN_MODIFY "can-modify"
-#define NM_SETTINGS_CONNECTIONS "connections"
+#define NM_SETTINGS_UNMANAGED_SPECS "unmanaged-specs"
+#define NM_SETTINGS_HOSTNAME "hostname"
+#define NM_SETTINGS_CAN_MODIFY "can-modify"
+#define NM_SETTINGS_CONNECTIONS "connections"
+#define NM_SETTINGS_STARTUP_COMPLETE "connections"
#define NM_SETTINGS_SIGNAL_CONNECTION_ADDED "connection-added"
#define NM_SETTINGS_SIGNAL_CONNECTION_UPDATED "connection-updated"
@@ -120,4 +121,6 @@ void nm_settings_device_removed (NMSettings *self, NMDevice *device, gboolean qu
gint nm_settings_sort_connections (gconstpointer a, gconstpointer b);
+gboolean nm_settings_get_startup_complete (NMSettings *self);
+
#endif /* __NM_SETTINGS_H__ */