diff options
author | Mario Sanchez Prada <mario@endlessm.com> | 2016-07-19 16:05:35 +0100 |
---|---|---|
committer | Beniamino Galvani <bgalvani@redhat.com> | 2016-07-28 22:22:14 +0200 |
commit | 283562ef18cbc2d62a567656e8fc0bc3fb5d433d (patch) | |
tree | b3dbeb2664560d1b4c62743a61120db2f57b606f | |
parent | 3bed7427711341bcc492f38049cdf1a3faee1335 (diff) |
nm-dispatcher: Added new action for 'connectivity-change' events
The purpose of this action is to provide a hook for the OS to act
on global changes regarding to connectivity, which can currently
be one of 'none', 'portal', 'limited', 'full' or 'unknown'.
Check the documentation for a more information on each of those states:
https://developer.gnome.org/NetworkManager/stable/nm-dbus-types.html#NMConnectivityState
https://bugzilla.gnome.org/show_bug.cgi?id=768969
-rw-r--r-- | callouts/nm-dispatcher-api.h | 1 | ||||
-rw-r--r-- | callouts/nm-dispatcher-utils.c | 6 | ||||
-rw-r--r-- | src/nm-connectivity.c | 4 | ||||
-rw-r--r-- | src/nm-dispatcher.c | 26 | ||||
-rw-r--r-- | src/nm-dispatcher.h | 5 |
5 files changed, 35 insertions, 7 deletions
diff --git a/callouts/nm-dispatcher-api.h b/callouts/nm-dispatcher-api.h index d702ba6851..b1f28e71d4 100644 --- a/callouts/nm-dispatcher-api.h +++ b/callouts/nm-dispatcher-api.h @@ -49,6 +49,7 @@ #define NMD_ACTION_VPN_DOWN "vpn-down" #define NMD_ACTION_DHCP4_CHANGE "dhcp4-change" #define NMD_ACTION_DHCP6_CHANGE "dhcp6-change" +#define NMD_ACTION_CONNECTIVITY_CHANGE "connectivity-change" typedef enum { DISPATCH_RESULT_UNKNOWN = 0, diff --git a/callouts/nm-dispatcher-utils.c b/callouts/nm-dispatcher-utils.c index 015bb070fe..2dd78246da 100644 --- a/callouts/nm-dispatcher-utils.c +++ b/callouts/nm-dispatcher-utils.c @@ -352,9 +352,11 @@ nm_dispatcher_utils_construct_envp (const char *action, g_return_val_if_fail (out_iface != NULL, NULL); g_return_val_if_fail (*out_iface == NULL, NULL); - /* Hostname changes don't require a device nor contain a connection */ - if (!strcmp (action, NMD_ACTION_HOSTNAME)) + /* Hostname and connectivity changes don't require a device nor contain a connection */ + if ( !strcmp (action, NMD_ACTION_HOSTNAME) + || !strcmp (action, NMD_ACTION_CONNECTIVITY_CHANGE)) { goto done; + } /* Connection properties */ if (!g_variant_lookup (connection_props, NMD_CONNECTION_PROPS_PATH, "&o", &path)) { diff --git a/src/nm-connectivity.c b/src/nm-connectivity.c index 934727fa9e..2b8b170a51 100644 --- a/src/nm-connectivity.c +++ b/src/nm-connectivity.c @@ -28,6 +28,7 @@ #include "nm-connectivity.h" #include "nm-config.h" +#include "nm-dispatcher.h" #include "NetworkManagerUtils.h" G_DEFINE_TYPE (NMConnectivity, nm_connectivity, G_TYPE_OBJECT) @@ -96,6 +97,9 @@ update_state (NMConnectivity *self, NMConnectivityState state) nm_connectivity_state_to_string (state)); priv->state = state; g_object_notify (G_OBJECT (self), NM_CONNECTIVITY_STATE); + + /* Notify dispatcher scripts of a connectivity state change */ + nm_dispatcher_call_connectivity (DISPATCHER_ACTION_CONNECTIVITY_CHANGE); } } diff --git a/src/nm-dispatcher.c b/src/nm-dispatcher.c index 4959ed5d14..c8193c33ff 100644 --- a/src/nm-dispatcher.c +++ b/src/nm-dispatcher.c @@ -422,6 +422,7 @@ static const char *action_table[] = { [DISPATCHER_ACTION_VPN_DOWN] = NMD_ACTION_VPN_DOWN, [DISPATCHER_ACTION_DHCP4_CHANGE] = NMD_ACTION_DHCP4_CHANGE, [DISPATCHER_ACTION_DHCP6_CHANGE] = NMD_ACTION_DHCP6_CHANGE, + [DISPATCHER_ACTION_CONNECTIVITY_CHANGE] = NMD_ACTION_CONNECTIVITY_CHANGE }; static const char * @@ -482,8 +483,9 @@ _dispatcher_call (DispatcherAction action, _ensure_requests (); - /* All actions except 'hostname' require a device */ - if (action == DISPATCHER_ACTION_HOSTNAME) { + /* All actions except 'hostname' and 'connectivity-change' require a device */ + if ( action == DISPATCHER_ACTION_HOSTNAME + || action == DISPATCHER_ACTION_CONNECTIVITY_CHANGE) { _LOGD ("(%u) dispatching action '%s'%s", reqid, action_to_string (action), blocking @@ -551,8 +553,9 @@ _dispatcher_call (DispatcherAction action, g_variant_builder_init (&vpn_ip4_props, G_VARIANT_TYPE_VARDICT); g_variant_builder_init (&vpn_ip6_props, G_VARIANT_TYPE_VARDICT); - /* hostname actions only send the hostname */ - if (action != DISPATCHER_ACTION_HOSTNAME) { + /* hostname and connectivity-change actions don't send device data */ + if ( action != DISPATCHER_ACTION_HOSTNAME + && action != DISPATCHER_ACTION_CONNECTIVITY_CHANGE) { fill_device_props (device, &device_props, &device_ip4_props, @@ -760,6 +763,21 @@ nm_dispatcher_call_vpn_sync (DispatcherAction action, vpn_ip4_config, vpn_ip6_config, NULL, NULL, NULL); } +/** + * nm_dispatcher_call_connectivity(): + * @action: the %DispatcherAction + * + * This method does not block the caller. + * + * Returns: %TRUE if the action was dispatched, %FALSE on failure + */ +gboolean +nm_dispatcher_call_connectivity (DispatcherAction action) +{ + return _dispatcher_call (action, FALSE, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL); +} + void nm_dispatcher_call_cancel (guint call_id) { diff --git a/src/nm-dispatcher.h b/src/nm-dispatcher.h index 42dcdc46e9..72c7e6e815 100644 --- a/src/nm-dispatcher.h +++ b/src/nm-dispatcher.h @@ -38,7 +38,8 @@ typedef enum { DISPATCHER_ACTION_VPN_PRE_DOWN, DISPATCHER_ACTION_VPN_DOWN, DISPATCHER_ACTION_DHCP4_CHANGE, - DISPATCHER_ACTION_DHCP6_CHANGE + DISPATCHER_ACTION_DHCP6_CHANGE, + DISPATCHER_ACTION_CONNECTIVITY_CHANGE } DispatcherAction; typedef void (*DispatcherFunc) (guint call_id, gpointer user_data); @@ -75,6 +76,8 @@ gboolean nm_dispatcher_call_vpn_sync (DispatcherAction action, NMIP4Config *vpn_ip4_config, NMIP6Config *vpn_ip6_config); +gboolean nm_dispatcher_call_connectivity (DispatcherAction action); + void nm_dispatcher_call_cancel (guint call_id); void nm_dispatcher_init (void); |