summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2012-06-05 11:20:11 -0500
committerDan Williams <dcbw@redhat.com>2012-09-11 17:06:16 -0500
commit15ca7cd56cedf03d43b9dc2efb10dc669abb3146 (patch)
tree05fb271f837f8b0db871342823f1d1d25b86848d
parent0201d6da877d9f19c124298bac8b8cc3d81585e7 (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.c8
-rw-r--r--src/nm-dispatcher.c92
-rw-r--r--src/nm-dispatcher.h34
-rw-r--r--src/nm-policy.c2
-rw-r--r--src/vpn-manager/nm-vpn-connection.c28
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 */