summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2010-02-02 12:37:17 -0500
committerColin Walters <walters@verbum.org>2010-02-02 15:04:45 -0500
commit90fe96b1875350f86a4a773d4a0a22009950dd4d (patch)
tree5dffa2b28c1d13c3a0902054ac8cd4d57f6c969e
parenta7169e694c48c1259b51f62d73e92292d11bbab2 (diff)
downloaddbus-90fe96b1875350f86a4a773d4a0a22009950dd4d.tar.gz
Fix inotify shutdown
We were incorrectly passing NULL for a DBusList when the usage expected is a pointer to a NULL DBusList pointer. Also during dbus_shutdown we need to actually close the inotify fd, and remove our watch. Move the shutdown handler out of bus.c and into inotify where we can do all of this cleanly.
-rw-r--r--bus/bus.c8
-rw-r--r--bus/dir-watch-inotify.c128
2 files changed, 82 insertions, 54 deletions
diff --git a/bus/bus.c b/bus/bus.c
index bfd398e6..8150df24 100644
--- a/bus/bus.c
+++ b/bus/bus.c
@@ -551,12 +551,6 @@ process_config_postinit (BusContext *context,
return TRUE;
}
-static void
-bus_shutdown_all_directory_watches (void *data)
-{
- bus_set_watched_dirs ((BusContext *) data, NULL);
-}
-
BusContext*
bus_context_new (const DBusString *config_file,
ForceForkSetting force_fork,
@@ -588,8 +582,6 @@ bus_context_new (const DBusString *config_file,
_dbus_generate_uuid (&context->uuid);
- _dbus_register_shutdown_func (bus_shutdown_all_directory_watches, context);
-
if (!_dbus_string_copy_data (config_file, &context->config_file))
{
BUS_SET_OOM (error);
diff --git a/bus/dir-watch-inotify.c b/bus/dir-watch-inotify.c
index f87a6347..bb71394c 100644
--- a/bus/dir-watch-inotify.c
+++ b/bus/dir-watch-inotify.c
@@ -92,59 +92,16 @@ _handle_inotify_watch (DBusWatch *passed_watch, unsigned int flags, void *data)
return TRUE;
}
-static int
-_init_inotify (BusContext *context)
-{
- int ret = 0;
-
- if (inotify_fd == -1) {
-#ifdef HAVE_INOTIFY_INIT1
- inotify_fd = inotify_init1 (IN_CLOEXEC);
-#else
- inotify_fd = inotify_init ();
-#endif
- if (inotify_fd <= 0) {
- _dbus_warn ("Cannot initialize inotify\n");
- goto out;
- }
- loop = bus_context_get_loop (context);
-
- watch = _dbus_watch_new (inotify_fd, DBUS_WATCH_READABLE, TRUE,
- _handle_inotify_watch, NULL, NULL);
-
- if (watch == NULL)
- {
- _dbus_warn ("Unable to create inotify watch\n");
- goto out;
- }
-
- if (!_dbus_loop_add_watch (loop, watch, _inotify_watch_callback,
- NULL, NULL))
- {
- _dbus_warn ("Unable to add reload watch to main loop");
- _dbus_watch_unref (watch);
- watch = NULL;
- goto out;
- }
- }
+#include <stdio.h>
- ret = 1;
-
-out:
- return ret;
-}
-
-void
-bus_set_watched_dirs (BusContext *context, DBusList **directories)
+static void
+_set_watched_dirs_internal (DBusList **directories)
{
int new_wds[MAX_DIRS_TO_WATCH];
char *new_dirs[MAX_DIRS_TO_WATCH];
DBusList *link;
int i, j, wd;
- if (!_init_inotify (context))
- goto out;
-
for (i = 0; i < MAX_DIRS_TO_WATCH; i++)
{
new_wds[i] = -1;
@@ -226,3 +183,82 @@ bus_set_watched_dirs (BusContext *context, DBusList **directories)
out:;
}
+
+#include <stdio.h>
+static void
+_shutdown_inotify (void *data)
+{
+ DBusList *empty = NULL;
+
+ if (inotify_fd == -1)
+ return;
+
+ _set_watched_dirs_internal (&empty);
+
+ close (inotify_fd);
+ inotify_fd = -1;
+ if (watch != NULL)
+ {
+ _dbus_loop_remove_watch (loop, watch, _inotify_watch_callback, NULL);
+ _dbus_watch_unref (watch);
+ _dbus_loop_unref (loop);
+ }
+ watch = NULL;
+ loop = NULL;
+}
+
+static int
+_init_inotify (BusContext *context)
+{
+ int ret = 0;
+
+ if (inotify_fd == -1)
+ {
+#ifdef HAVE_INOTIFY_INIT1
+ inotify_fd = inotify_init1 (IN_CLOEXEC);
+#else
+ inotify_fd = inotify_init ();
+#endif
+ if (inotify_fd <= 0)
+ {
+ _dbus_warn ("Cannot initialize inotify\n");
+ goto out;
+ }
+ loop = bus_context_get_loop (context);
+ _dbus_loop_ref (loop);
+
+ watch = _dbus_watch_new (inotify_fd, DBUS_WATCH_READABLE, TRUE,
+ _handle_inotify_watch, NULL, NULL);
+
+ if (watch == NULL)
+ {
+ _dbus_warn ("Unable to create inotify watch\n");
+ goto out;
+ }
+
+ if (!_dbus_loop_add_watch (loop, watch, _inotify_watch_callback,
+ NULL, NULL))
+ {
+ _dbus_warn ("Unable to add reload watch to main loop");
+ _dbus_watch_unref (watch);
+ watch = NULL;
+ goto out;
+ }
+
+ _dbus_register_shutdown_func (_shutdown_inotify, NULL);
+ }
+
+ ret = 1;
+
+out:
+ return ret;
+}
+
+void
+bus_set_watched_dirs (BusContext *context, DBusList **directories)
+{
+ if (!_init_inotify (context))
+ return;
+
+ _set_watched_dirs_internal (directories);
+}