diff options
author | Stephen Klimaszewski <steev@gentoo.org> | 2008-01-17 19:37:39 +0000 |
---|---|---|
committer | Stephen Klimaszewski <steev@gentoo.org> | 2008-01-17 19:37:39 +0000 |
commit | b44d1b8decfa5a6b222360046cdfe935e63dc046 (patch) | |
tree | 651e974f0d9f17bedd91fb98f1da9c8fa2ad6b10 /sys-apps/dbus/files | |
parent | Dropped ppc-macos keyword, see you in prefix (diff) | |
download | gentoo-2-b44d1b8decfa5a6b222360046cdfe935e63dc046.tar.gz gentoo-2-b44d1b8decfa5a6b222360046cdfe935e63dc046.tar.bz2 gentoo-2-b44d1b8decfa5a6b222360046cdfe935e63dc046.zip |
Bug in 1.1.3's inotify release, adding a patch with a revision bump from Timo Hoenig <thoenig@suse.de> to fix the issue.
(Portage version: 2.1.4)
Diffstat (limited to 'sys-apps/dbus/files')
-rw-r--r-- | sys-apps/dbus/files/dbus-inotify-fix-thoenig-01.patch | 113 | ||||
-rw-r--r-- | sys-apps/dbus/files/digest-dbus-1.1.3-r1 (renamed from sys-apps/dbus/files/digest-dbus-1.1.3) | 0 |
2 files changed, 113 insertions, 0 deletions
diff --git a/sys-apps/dbus/files/dbus-inotify-fix-thoenig-01.patch b/sys-apps/dbus/files/dbus-inotify-fix-thoenig-01.patch new file mode 100644 index 000000000000..ad1acfef1bc1 --- /dev/null +++ b/sys-apps/dbus/files/dbus-inotify-fix-thoenig-01.patch @@ -0,0 +1,113 @@ +diff --git a/bus/dir-watch-inotify.c b/bus/dir-watch-inotify.c +--- a/bus/dir-watch-inotify.c ++++ b/bus/dir-watch-inotify.c +@@ -38,6 +38,8 @@ + #include "dir-watch.h" + + #define MAX_DIRS_TO_WATCH 128 ++#define INOTIFY_EVENT_SIZE (sizeof(struct inotify_event)) ++#define INOTIFY_BUF_LEN (1024 * (INOTIFY_EVENT_SIZE + 16)) + + /* use a static array to avoid handling OOM */ + static int wds[MAX_DIRS_TO_WATCH]; +@@ -55,33 +57,43 @@ _inotify_watch_callback (DBusWatch *watch, unsigned int condition, void *data) + static dbus_bool_t + _handle_inotify_watch (DBusWatch *watch, unsigned int flags, void *data) + { +- struct inotify_event ev; +- size_t res; ++ char buffer[INOTIFY_BUF_LEN]; ++ ssize_t ret = 0; ++ int i = 0; + pid_t pid; + +- res = read (inotify_fd, &ev, sizeof(ev)); ++ ret = read (inotify_fd, buffer, INOTIFY_BUF_LEN); ++ if (ret < 0) ++ _dbus_verbose ("Error reading inotify event: '%s'\n, _dbus_strerror(errno)"); ++ else if (!ret) ++ _dbus_verbose ("Error reading inotify event: buffer too small\n"); + +- if (res > 0) ++ while (i < ret) + { +- pid = getpid (); ++ struct inotify_event *ev; ++ pid = _dbus_getpid (); ++ ++ ev = (struct inotify_event *) &buffer[i]; ++ i += INOTIFY_EVENT_SIZE + ev->len; ++#ifdef DBUS_ENABLE_VERBOSE_MODE ++ if (ev->len) ++ _dbus_verbose ("event name: '%s'\n", ev->name); ++ _dbus_verbose ("inotify event: wd=%d mask=%u cookie=%u len=%u\n", ev->wd, ev->mask, ev->cookie, ev->len); ++#endif + _dbus_verbose ("Sending SIGHUP signal on reception of a inotify event\n"); + (void) kill (pid, SIGHUP); + } +- else if (res < 0 && errno == EBADF) ++ ++ if (watch != NULL) + { +- if (watch != NULL) +- { +- _dbus_loop_remove_watch (loop, watch, _inotify_watch_callback, NULL); +- _dbus_watch_unref (watch); +- watch = NULL; +- } +- pid = getpid (); +- _dbus_verbose ("Sending SIGHUP signal since inotify fd has been closed\n"); +- (void) kill (pid, SIGHUP); ++ _dbus_loop_remove_watch (loop, watch, _inotify_watch_callback, NULL); ++ _dbus_watch_unref (watch); ++ watch = NULL; + } +- ++ + return TRUE; + } ++ + void + bus_watch_directory (const char *dir, BusContext *context) + { +@@ -116,14 +128,13 @@ bus_watch_directory (const char *dir, BusContext *context) + } + } + +- + if (num_wds >= MAX_DIRS_TO_WATCH ) + { + _dbus_warn ("Cannot watch config directory '%s'. Already watching %d directories\n", dir, MAX_DIRS_TO_WATCH); + goto out; + } + +- wd = inotify_add_watch (inotify_fd, dir, IN_MODIFY); ++ wd = inotify_add_watch (inotify_fd, dir, IN_MODIFY | IN_CREATE | IN_DELETE); + if (wd < 0) + { + _dbus_warn ("Cannot setup inotify for '%s'; error '%s'\n", dir, _dbus_strerror (errno)); +@@ -140,17 +151,13 @@ bus_watch_directory (const char *dir, BusContext *context) + void + bus_drop_all_directory_watches (void) + { +- int i; +- ++ int ret; ++ + _dbus_verbose ("Dropping all watches on config directories\n"); +- +- for (i = 0; i < num_wds; i++) +- { +- if (inotify_rm_watch(inotify_fd, wds[i]) != 0) +- { +- _dbus_verbose ("Error closing fd %d for config directory watch\n", wds[i]); +- } +- } +- ++ ret = close (inotify_fd); ++ if (ret) ++ _dbus_verbose ("Error dropping watches: '%s'\n", perror(ret)); ++ + num_wds = 0; ++ inotify_fd = -1; + } diff --git a/sys-apps/dbus/files/digest-dbus-1.1.3 b/sys-apps/dbus/files/digest-dbus-1.1.3-r1 index 751e788b4c1e..751e788b4c1e 100644 --- a/sys-apps/dbus/files/digest-dbus-1.1.3 +++ b/sys-apps/dbus/files/digest-dbus-1.1.3-r1 |