mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2025-12-30 15:30:11 +01:00
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:
parent
3bed742771
commit
283562ef18
5 changed files with 35 additions and 7 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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)) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue