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
This commit is contained in:
Mario Sanchez Prada 2016-07-19 16:05:35 +01:00 committed by Beniamino Galvani
parent 3bed742771
commit 283562ef18
5 changed files with 35 additions and 7 deletions

View file

@ -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,

View file

@ -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)) {

View file

@ -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);
}
}

View file

@ -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)
{

View file

@ -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);