summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMario Sanchez Prada <mario@endlessm.com>2016-07-19 16:05:35 +0100
committerBeniamino Galvani <bgalvani@redhat.com>2016-07-28 22:22:14 +0200
commit283562ef18cbc2d62a567656e8fc0bc3fb5d433d (patch)
treeb3dbeb2664560d1b4c62743a61120db2f57b606f
parent3bed7427711341bcc492f38049cdf1a3faee1335 (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.h1
-rw-r--r--callouts/nm-dispatcher-utils.c6
-rw-r--r--src/nm-connectivity.c4
-rw-r--r--src/nm-dispatcher.c26
-rw-r--r--src/nm-dispatcher.h5
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);