summaryrefslogtreecommitdiff
path: root/src/nm-dispatcher.c
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2014-05-14 15:50:33 -0500
committerDan Williams <dcbw@redhat.com>2014-06-06 13:43:45 -0500
commit5150cb88c26d13e8c7c188f4f10614b6d318ad89 (patch)
tree7c66a15e09767aa288530b6b6ff5fd8b148d762f /src/nm-dispatcher.c
parent4cc13befd3cc242c5065ce6ea91e335b705b2f36 (diff)
downloadNetworkManager-5150cb88c26d13e8c7c188f4f10614b6d318ad89.tar.gz
dispatcher: only dispatch if scripts exist
If there are no dispatcher scripts, don't bother dispatching any events. This saves some time configuring networking if the event would have no effect anyway.
Diffstat (limited to 'src/nm-dispatcher.c')
-rw-r--r--src/nm-dispatcher.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/nm-dispatcher.c b/src/nm-dispatcher.c
index bc10e920ce..24abd04186 100644
--- a/src/nm-dispatcher.c
+++ b/src/nm-dispatcher.c
@@ -31,6 +31,7 @@
#include "nm-dbus-glib-types.h"
#include "nm-glib-compat.h"
+static gboolean do_dispatch = TRUE;
static GSList *requests = NULL;
static void
@@ -134,12 +135,15 @@ fill_vpn_props (NMIP4Config *ip4_config,
typedef struct {
DispatcherFunc callback;
gpointer user_data;
+ guint idle_id;
} DispatchInfo;
static void
dispatcher_info_free (DispatchInfo *info)
{
requests = g_slist_remove (requests, info);
+ if (info->idle_id)
+ g_source_remove (info->idle_id);
g_free (info);
}
@@ -261,6 +265,18 @@ action_to_string (DispatcherAction action)
g_assert_not_reached ();
}
+static gboolean
+dispatcher_idle_cb (gpointer user_data)
+{
+ DispatchInfo *info = user_data;
+
+ info->idle_id = 0;
+ if (info->callback)
+ info->callback (info, info->user_data);
+ dispatcher_info_free (info);
+ return G_SOURCE_REMOVE;
+}
+
static gconstpointer
_dispatcher_call (DispatcherAction action,
NMConnection *connection,
@@ -299,6 +315,16 @@ _dispatcher_call (DispatcherAction action,
if (action == DISPATCHER_ACTION_VPN_UP)
g_return_val_if_fail (vpn_ip4_config != NULL, NULL);
+ if (do_dispatch == FALSE) {
+ info = g_malloc0 (sizeof (*info));
+ info->callback = callback;
+ info->user_data = user_data;
+ info->idle_id = g_idle_add (dispatcher_idle_cb, info);
+ requests = g_slist_append (requests, info);
+ nm_log_dbg (LOGD_DISPATCH, "ignoring request; no scripts in " NMD_SCRIPT_DIR);
+ return info;
+ }
+
g_connection = nm_dbus_manager_get_connection (nm_dbus_manager_get ());
proxy = dbus_g_proxy_new_for_name (g_connection,
NM_DISPATCHER_DBUS_SERVICE,
@@ -416,3 +442,32 @@ nm_dispatcher_call_cancel (gconstpointer call)
((DispatchInfo *) call)->callback = NULL;
}
+static void
+dispatcher_dir_changed (GFileMonitor *monitor)
+{
+ GDir *dir;
+
+ /* Default to dispatching on any errors */
+ do_dispatch = TRUE;
+ dir = g_dir_open (NMD_SCRIPT_DIR, 0, NULL);
+ if (dir) {
+ do_dispatch = !!g_dir_read_name (dir);
+ g_dir_close (dir);
+ }
+}
+
+void
+nm_dispatcher_init (void)
+{
+ GFile *file;
+ static GFileMonitor *monitor;
+
+ file = g_file_new_for_path (NMD_SCRIPT_DIR);
+ monitor = g_file_monitor_directory (file, G_FILE_MONITOR_NONE, NULL, NULL);
+ if (monitor) {
+ g_signal_connect (monitor, "changed", G_CALLBACK (dispatcher_dir_changed), NULL);
+ dispatcher_dir_changed (monitor);
+ }
+ g_object_unref (file);
+}
+