summaryrefslogtreecommitdiffstats
path: root/package/busybox/busybox-1.13.0-inotify.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/busybox/busybox-1.13.0-inotify.patch')
-rw-r--r--package/busybox/busybox-1.13.0-inotify.patch101
1 files changed, 101 insertions, 0 deletions
diff --git a/package/busybox/busybox-1.13.0-inotify.patch b/package/busybox/busybox-1.13.0-inotify.patch
new file mode 100644
index 000000000..006dea1a6
--- /dev/null
+++ b/package/busybox/busybox-1.13.0-inotify.patch
@@ -0,0 +1,101 @@
+--- busybox-1.13.0/miscutils/inotifyd.c Thu Oct 30 08:41:37 2008
++++ busybox-1.13.0-inotify/miscutils/inotifyd.c Fri Nov 14 22:33:27 2008
+@@ -51,6 +51,7 @@
+ int inotifyd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+ int inotifyd_main(int argc UNUSED_PARAM, char **argv)
+ {
++ int n;
+ unsigned mask = IN_ALL_EVENTS; // assume we want all events
+ struct pollfd pfd;
+ char **watched = ++argv; // watched name list
+@@ -69,7 +70,6 @@
+ while (*++argv) {
+ char *path = *argv;
+ char *masks = strchr(path, ':');
+- int wd; // watch descriptor
+ // if mask is specified ->
+ if (masks) {
+ *masks = '\0'; // split path and mask
+@@ -83,32 +83,39 @@
+ }
+ }
+ // add watch
+- wd = inotify_add_watch(pfd.fd, path, mask);
+- if (wd < 0) {
++ n = inotify_add_watch(pfd.fd, path, mask);
++ if (n < 0)
+ bb_perror_msg_and_die("add watch (%s) failed", path);
+-// } else {
+-// bb_error_msg("added %d [%s]:%4X", wd, path, mask);
+- }
++ //bb_error_msg("added %d [%s]:%4X", n, path, mask);
+ }
+
+ // setup signals
+- bb_signals(0
+- + (1 << SIGHUP)
+- + (1 << SIGINT)
+- + (1 << SIGTERM)
+- + (1 << SIGPIPE)
+- , record_signo);
++ bb_signals(BB_FATAL_SIGS, record_signo);
+
+ // do watch
+-
+-// pfd.fd = fd;
+ pfd.events = POLLIN;
+-
+- while (!bb_got_signal && poll(&pfd, 1, -1) > 0) {
++ while (1) {
+ ssize_t len;
+ void *buf;
+ struct inotify_event *ie;
+
++ again:
++ if (bb_got_signal)
++ break;
++ n = poll(&pfd, 1, -1);
++ /* Signal interrupted us? */
++ if (n < 0 && errno == EINTR)
++ goto again;
++ // Under Linux, above if() is not necessary.
++ // Non-fatal signals, e.g. SIGCHLD, when set to SIG_DFL,
++ // are not interrupting poll().
++ // Thus we can just break if n <= 0 (see below),
++ // because EINTR will happen only on SIGTERM et al.
++ // But this might be not true under other Unixes,
++ // and is generally way too subtle to depend on.
++ if (n <= 0) // strange error?
++ break;
++
+ // read out all pending events
+ xioctl(pfd.fd, FIONREAD, &len);
+ #define eventbuf bb_common_bufsiz1
+@@ -117,21 +124,21 @@
+ // process events. N.B. events may vary in length
+ while (len > 0) {
+ int i;
+- char events[12];
++ char events[sizeof(mask_names)];
+ char *s = events;
+ unsigned m = ie->mask;
+
+- for (i = 0; i < 12; ++i, m >>= 1) {
+- if (m & 1) {
++ for (i = 0; i < sizeof(mask_names)-1; ++i, m >>= 1) {
++ if (m & 1)
+ *s++ = mask_names[i];
+- }
+ }
+ *s = '\0';
+-// bb_error_msg("exec %s %08X\t%s\t%s\t%s", agent, ie->mask, events, watched[ie->wd], ie->len ? ie->name : "");
++ //bb_error_msg("exec %s %08X\t%s\t%s\t%s", agent,
++ // ie->mask, events, watched[ie->wd], ie->len ? ie->name : "");
+ args[1] = events;
+ args[2] = watched[ie->wd];
+ args[3] = ie->len ? ie->name : NULL;
+- xspawn((char **)args);
++ wait4pid(xspawn((char **)args));
+ // next event
+ i = sizeof(struct inotify_event) + ie->len;
+ len -= i;