diff options
Diffstat (limited to 'src/nm-dispatcher.c')
| -rw-r--r-- | src/nm-dispatcher.c | 54 |
1 files changed, 41 insertions, 13 deletions
diff --git a/src/nm-dispatcher.c b/src/nm-dispatcher.c index 4959ed5d..df9be2e7 100644 --- a/src/nm-dispatcher.c +++ b/src/nm-dispatcher.c @@ -28,11 +28,13 @@ #include "nm-dispatcher-api.h" #include "NetworkManagerUtils.h" #include "nm-utils.h" +#include "nm-connectivity.h" #include "nm-device.h" #include "nm-dhcp4-config.h" #include "nm-dhcp6-config.h" #include "nm-ip4-config.h" #include "nm-ip6-config.h" +#include "nm-manager.h" #include "nm-settings-connection.h" #include "nm-platform.h" #include "nm-core-internal.h" @@ -422,6 +424,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 * @@ -449,6 +452,7 @@ _dispatcher_call (DispatcherAction action, NMSettingsConnection *settings_connection, NMConnection *applied_connection, NMDevice *device, + NMConnectivityState connectivity_state, const char *vpn_iface, NMIP4Config *vpn_ip4_config, NMIP6Config *vpn_ip6_config, @@ -482,8 +486,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 +556,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, @@ -578,7 +584,7 @@ _dispatcher_call (DispatcherAction action, GVariantIter *results; ret = _nm_dbus_proxy_call_sync (dispatcher_proxy, "Action", - g_variant_new ("(s@a{sa{sv}}a{sv}a{sv}a{sv}a{sv}@a{sv}@a{sv}sa{sv}a{sv}b)", + g_variant_new ("(s@a{sa{sv}}a{sv}a{sv}a{sv}a{sv}@a{sv}@a{sv}ssa{sv}a{sv}b)", action_to_string (action), connection_dict, &connection_props, @@ -587,6 +593,7 @@ _dispatcher_call (DispatcherAction action, &device_ip6_props, device_dhcp4_props, device_dhcp6_props, + nm_connectivity_state_to_string (connectivity_state), vpn_iface ? vpn_iface : "", &vpn_ip4_props, &vpn_ip6_props, @@ -613,7 +620,7 @@ _dispatcher_call (DispatcherAction action, info->callback = callback; info->user_data = user_data; g_dbus_proxy_call (dispatcher_proxy, "Action", - g_variant_new ("(s@a{sa{sv}}a{sv}a{sv}a{sv}a{sv}@a{sv}@a{sv}sa{sv}a{sv}b)", + g_variant_new ("(s@a{sa{sv}}a{sv}a{sv}a{sv}a{sv}@a{sv}@a{sv}ssa{sv}a{sv}b)", action_to_string (action), connection_dict, &connection_props, @@ -622,6 +629,7 @@ _dispatcher_call (DispatcherAction action, &device_ip6_props, device_dhcp4_props, device_dhcp6_props, + nm_connectivity_state_to_string (connectivity_state), vpn_iface ? vpn_iface : "", &vpn_ip4_props, &vpn_ip6_props, @@ -671,8 +679,9 @@ nm_dispatcher_call (DispatcherAction action, gpointer user_data, guint *out_call_id) { - return _dispatcher_call (action, FALSE, settings_connection, applied_connection, device, NULL, NULL, - NULL, callback, user_data, out_call_id); + return _dispatcher_call (action, FALSE, settings_connection, applied_connection, device, + NM_CONNECTIVITY_UNKNOWN, NULL, NULL, NULL, + callback, user_data, out_call_id); } /** @@ -693,8 +702,8 @@ nm_dispatcher_call_sync (DispatcherAction action, NMConnection *applied_connection, NMDevice *device) { - return _dispatcher_call (action, TRUE, settings_connection, applied_connection, device, NULL, NULL, - NULL, NULL, NULL, NULL); + return _dispatcher_call (action, TRUE, settings_connection, applied_connection, device, + NM_CONNECTIVITY_UNKNOWN, NULL, NULL, NULL, NULL, NULL, NULL); } /** @@ -728,8 +737,9 @@ nm_dispatcher_call_vpn (DispatcherAction action, gpointer user_data, guint *out_call_id) { - return _dispatcher_call (action, FALSE, settings_connection, applied_connection, parent_device, vpn_iface, - vpn_ip4_config, vpn_ip6_config, callback, user_data, out_call_id); + return _dispatcher_call (action, FALSE, settings_connection, applied_connection, + parent_device, NM_CONNECTIVITY_UNKNOWN, vpn_iface, vpn_ip4_config, + vpn_ip6_config, callback, user_data, out_call_id); } /** @@ -756,10 +766,28 @@ nm_dispatcher_call_vpn_sync (DispatcherAction action, NMIP4Config *vpn_ip4_config, NMIP6Config *vpn_ip6_config) { - return _dispatcher_call (action, TRUE, settings_connection, applied_connection, parent_device, vpn_iface, + return _dispatcher_call (action, TRUE, settings_connection, applied_connection, + parent_device, NM_CONNECTIVITY_UNKNOWN, vpn_iface, vpn_ip4_config, vpn_ip6_config, NULL, NULL, NULL); } +/** + * nm_dispatcher_call_connectivity(): + * @action: the %DispatcherAction + * @connectivity_state: the #NMConnectivityState value + * + * This method does not block the caller. + * + * Returns: %TRUE if the action was dispatched, %FALSE on failure + */ +gboolean +nm_dispatcher_call_connectivity (DispatcherAction action, + NMConnectivityState connectivity_state) +{ + return _dispatcher_call (action, FALSE, NULL, NULL, NULL, connectivity_state, + NULL, NULL, NULL, NULL, NULL, NULL); +} + void nm_dispatcher_call_cancel (guint call_id) { |