diff options
author | Dan Williams <dcbw@redhat.com> | 2012-06-05 11:20:11 -0500 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2012-09-11 17:06:16 -0500 |
commit | 15ca7cd56cedf03d43b9dc2efb10dc669abb3146 (patch) | |
tree | 05fb271f837f8b0db871342823f1d1d25b86848d | |
parent | 0201d6da877d9f19c124298bac8b8cc3d81585e7 (diff) |
core: add dispatcher callbacks and simplify dispatcher function prototypes
Remove unused args for the non-VPN cases to cut down on the NULL NULL NULL
stuff since we're also adding two more arguments. Add the ability for
callers to give a callback that should be called when the dispatcher is
done.
-rw-r--r-- | src/nm-device.c | 8 | ||||
-rw-r--r-- | src/nm-dispatcher.c | 92 | ||||
-rw-r--r-- | src/nm-dispatcher.h | 34 | ||||
-rw-r--r-- | src/nm-policy.c | 2 | ||||
-rw-r--r-- | src/vpn-manager/nm-vpn-connection.c | 28 |
5 files changed, 125 insertions, 39 deletions
diff --git a/src/nm-device.c b/src/nm-device.c index 85072ed8..f20b5a32 100644 --- a/src/nm-device.c +++ b/src/nm-device.c @@ -1596,7 +1596,7 @@ dhcp4_lease_change (NMDevice *device, NMIP4Config *config) } /* Notify dispatcher scripts of new DHCP4 config */ - nm_utils_call_dispatcher ("dhcp4-change", connection, device, NULL, NULL, NULL); + nm_dispatcher_call (DISPATCHER_ACTION_DHCP4_CHANGE, connection, device, NULL, NULL); } static void @@ -1971,7 +1971,7 @@ dhcp6_lease_change (NMDevice *device) nm_device_state_changed (device, NM_DEVICE_STATE_FAILED, reason); } else { /* Notify dispatcher scripts of new DHCPv6 config */ - nm_utils_call_dispatcher ("dhcp6-change", connection, device, NULL, NULL, NULL); + nm_dispatcher_call (DISPATCHER_ACTION_DHCP6_CHANGE, connection, device, NULL, NULL); } } @@ -4631,7 +4631,7 @@ nm_device_state_changed (NMDevice *device, case NM_DEVICE_STATE_ACTIVATED: nm_log_info (LOGD_DEVICE, "Activation (%s) successful, device activated.", nm_device_get_iface (device)); - nm_utils_call_dispatcher ("up", nm_act_request_get_connection (req), device, NULL, NULL, NULL); + nm_dispatcher_call (DISPATCHER_ACTION_UP, nm_act_request_get_connection (req), device, NULL, NULL); break; case NM_DEVICE_STATE_FAILED: connection = nm_act_request_get_connection (req); @@ -4650,7 +4650,7 @@ nm_device_state_changed (NMDevice *device, } if (old_state == NM_DEVICE_STATE_ACTIVATED) - nm_utils_call_dispatcher ("down", nm_act_request_get_connection (req), device, NULL, NULL, NULL); + nm_dispatcher_call (DISPATCHER_ACTION_DOWN, nm_act_request_get_connection (req), device, NULL, NULL); /* Dispose of the cached activation request */ if (req) diff --git a/src/nm-dispatcher.c b/src/nm-dispatcher.c index 91b807c6..a3674a15 100644 --- a/src/nm-dispatcher.c +++ b/src/nm-dispatcher.c @@ -129,6 +129,8 @@ fill_vpn_props (NMIP4Config *ip4_config, } typedef struct { + DispatcherFunc callback; + gpointer user_data; NMDBusManager *dbus_mgr; } DispatchInfo; @@ -160,6 +162,7 @@ dispatch_result_to_string (DispatchResult result) static void dispatcher_done_cb (DBusGProxy *proxy, DBusGProxyCall *call, gpointer user_data) { + DispatchInfo *info = user_data; GError *error = NULL; GPtrArray *results = NULL; guint i; @@ -202,17 +205,50 @@ dispatcher_done_cb (DBusGProxy *proxy, DBusGProxyCall *call, gpointer user_data) nm_log_warn (LOGD_CORE, "Dispatcher failed: (%d) %s", error->code, error->message); } + if (info->callback) + info->callback (call, info->user_data); + g_clear_error (&error); g_object_unref (proxy); } -void -nm_utils_call_dispatcher (const char *action, - NMConnection *connection, - NMDevice *device, - const char *vpn_iface, - NMIP4Config *vpn_ip4_config, - NMIP6Config *vpn_ip6_config) +static const char * +action_to_string (DispatcherAction action) +{ + switch (action) { + case DISPATCHER_ACTION_HOSTNAME: + return "hostname"; + case DISPATCHER_ACTION_UP: + return "up"; + case DISPATCHER_ACTION_PRE_DOWN: + return "pre-down"; + case DISPATCHER_ACTION_DOWN: + return "down"; + case DISPATCHER_ACTION_VPN_UP: + return "vpn-up"; + case DISPATCHER_ACTION_VPN_PRE_DOWN: + return "vpn-pre-down"; + case DISPATCHER_ACTION_VPN_DOWN: + return "vpn-down"; + case DISPATCHER_ACTION_DHCP4_CHANGE: + return "dhcp4-change"; + case DISPATCHER_ACTION_DHCP6_CHANGE: + return "dhcp6-change"; + default: + break; + } + g_assert_not_reached (); +} + +static gpointer +_dispatcher_call (DispatcherAction action, + NMConnection *connection, + NMDevice *device, + const char *vpn_iface, + NMIP4Config *vpn_ip4_config, + NMIP6Config *vpn_ip6_config, + DispatcherFunc callback, + gpointer user_data) { NMDBusManager *dbus_mgr; DBusGProxy *proxy; @@ -229,14 +265,12 @@ nm_utils_call_dispatcher (const char *action, DBusGProxyCall *call; DispatchInfo *info; - g_return_if_fail (action != NULL); - /* All actions except 'hostname' require a device */ - if (strcmp (action, "hostname") != 0) - g_return_if_fail (NM_IS_DEVICE (device)); + if (action != DISPATCHER_ACTION_HOSTNAME) + g_return_val_if_fail (NM_IS_DEVICE (device), NULL); /* VPN actions require at least an IPv4 config (for now) */ - if (strcmp (action, "vpn-up") == 0) - g_return_if_fail (vpn_ip4_config != NULL); + if (action == DISPATCHER_ACTION_VPN_UP) + g_return_val_if_fail (vpn_ip4_config != NULL, NULL); dbus_mgr = nm_dbus_manager_get (); g_connection = nm_dbus_manager_get_connection (dbus_mgr); @@ -247,7 +281,7 @@ nm_utils_call_dispatcher (const char *action, if (!proxy) { nm_log_err (LOGD_CORE, "could not get dispatcher proxy!"); g_object_unref (dbus_mgr); - return; + return NULL; } if (connection) { @@ -271,7 +305,7 @@ nm_utils_call_dispatcher (const char *action, vpn_ip6_props = value_hash_create (); /* hostname actions only send the hostname */ - if (strcmp (action, "hostname") != 0) { + if (action != DISPATCHER_ACTION_HOSTNAME) { fill_device_props (device, device_props, device_ip4_props, @@ -283,6 +317,8 @@ nm_utils_call_dispatcher (const char *action, } info = g_malloc0 (sizeof (*info)); + info->callback = callback; + info->user_data = user_data; info->dbus_mgr = dbus_mgr; /* Send the action to the dispatcher */ @@ -291,7 +327,7 @@ nm_utils_call_dispatcher (const char *action, info, (GDestroyNotify) dispatcher_info_free, 15000, - G_TYPE_STRING, action, + G_TYPE_STRING, action_to_string (action), DBUS_TYPE_G_MAP_OF_MAP_OF_VARIANT, connection_hash, DBUS_TYPE_G_MAP_OF_VARIANT, connection_props, DBUS_TYPE_G_MAP_OF_VARIANT, device_props, @@ -312,6 +348,30 @@ nm_utils_call_dispatcher (const char *action, g_hash_table_destroy (device_dhcp6_props); g_hash_table_destroy (vpn_ip4_props); g_hash_table_destroy (vpn_ip6_props); + + return call; } +gpointer +nm_dispatcher_call (DispatcherAction action, + NMConnection *connection, + NMDevice *device, + DispatcherFunc callback, + gpointer user_data) +{ + return _dispatcher_call (action, connection, device, NULL, NULL, NULL, callback, user_data); +} + +gpointer +nm_dispatcher_call_vpn (DispatcherAction action, + NMConnection *connection, + NMDevice *device, + const char *vpn_iface, + NMIP4Config *vpn_ip4_config, + NMIP6Config *vpn_ip6_config, + DispatcherFunc callback, + gpointer user_data) +{ + return _dispatcher_call (action, connection, device, vpn_iface, vpn_ip4_config, vpn_ip6_config, callback, user_data); +} diff --git a/src/nm-dispatcher.h b/src/nm-dispatcher.h index b223cc50..8514ba2c 100644 --- a/src/nm-dispatcher.h +++ b/src/nm-dispatcher.h @@ -30,11 +30,33 @@ #include "nm-ip6-config.h" #include "nm-connection.h" -void nm_utils_call_dispatcher (const char *action, - NMConnection *connection, - NMDevice *device, - const char *vpn_iface, - NMIP4Config *vpn_ip4_config, - NMIP6Config *vpn_ip6_config); +typedef enum { + DISPATCHER_ACTION_HOSTNAME, + DISPATCHER_ACTION_UP, + DISPATCHER_ACTION_PRE_DOWN, + DISPATCHER_ACTION_DOWN, + DISPATCHER_ACTION_VPN_UP, + DISPATCHER_ACTION_VPN_PRE_DOWN, + DISPATCHER_ACTION_VPN_DOWN, + DISPATCHER_ACTION_DHCP4_CHANGE, + DISPATCHER_ACTION_DHCP6_CHANGE +} DispatcherAction; + +typedef void (*DispatcherFunc) (gpointer call, gpointer user_data); + +gpointer nm_dispatcher_call (DispatcherAction action, + NMConnection *connection, + NMDevice *device, + DispatcherFunc callback, + gpointer user_data); + +gpointer nm_dispatcher_call_vpn (DispatcherAction action, + NMConnection *connection, + NMDevice *device, + const char *vpn_iface, + NMIP4Config *vpn_ip4_config, + NMIP6Config *vpn_ip6_config, + DispatcherFunc callback, + gpointer user_data); #endif /* NM_DISPATCHER_H */ diff --git a/src/nm-policy.c b/src/nm-policy.c index 9db218c9..2822405f 100644 --- a/src/nm-policy.c +++ b/src/nm-policy.c @@ -260,7 +260,7 @@ _set_hostname (NMPolicy *policy, g_object_unref (dns_mgr); if (nm_policy_set_system_hostname (policy->cur_hostname, msg)) - nm_utils_call_dispatcher ("hostname", NULL, NULL, NULL, NULL, NULL); + nm_dispatcher_call (DISPATCHER_ACTION_HOSTNAME, NULL, NULL, NULL, NULL); } static void diff --git a/src/vpn-manager/nm-vpn-connection.c b/src/vpn-manager/nm-vpn-connection.c index 15ba19b5..c97bf1c7 100644 --- a/src/vpn-manager/nm-vpn-connection.c +++ b/src/vpn-manager/nm-vpn-connection.c @@ -243,23 +243,27 @@ nm_vpn_connection_set_vpn_state (NMVPNConnection *connection, nm_connection_clear_secrets (priv->connection); /* Let dispatcher scripts know we're up and running */ - nm_utils_call_dispatcher ("vpn-up", - priv->connection, - priv->parent_dev, - priv->ip_iface, - priv->ip4_config, - priv->ip6_config); + nm_dispatcher_call_vpn (DISPATCHER_ACTION_VPN_UP, + priv->connection, + priv->parent_dev, + priv->ip_iface, + priv->ip4_config, + priv->ip6_config, + NULL, + NULL); break; case NM_VPN_CONNECTION_STATE_FAILED: case NM_VPN_CONNECTION_STATE_DISCONNECTED: if (old_vpn_state == NM_VPN_CONNECTION_STATE_ACTIVATED) { /* Let dispatcher scripts know we're about to go down */ - nm_utils_call_dispatcher ("vpn-down", - priv->connection, - priv->parent_dev, - priv->ip_iface, - NULL, - NULL); + nm_dispatcher_call_vpn (DISPATCHER_ACTION_VPN_DOWN, + priv->connection, + priv->parent_dev, + priv->ip_iface, + NULL, + NULL, + NULL, + NULL); } /* Tear down and clean up the connection */ |