X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fpath.c;h=656ed6941d9037f7aa3acae08fc7740e6ad7da1d;hb=821d4b6e068b2afaad94d43db22171c34a30400e;hp=3624bfcac7f771365e0a113786d3c6f540b1ae88;hpb=4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4f;p=elogind.git diff --git a/src/core/path.c b/src/core/path.c index 3624bfcac..656ed6941 100644 --- a/src/core/path.c +++ b/src/core/path.c @@ -157,10 +157,9 @@ void path_spec_unwatch(PathSpec *s) { } int path_spec_fd_event(PathSpec *s, uint32_t revents) { - _cleanup_free_ uint8_t *buf = NULL; + uint8_t buffer[INOTIFY_EVENT_MAX] _alignas_(struct inotify_event); struct inotify_event *e; - ssize_t k; - int l; + ssize_t l; int r = 0; if (revents != EPOLLIN) { @@ -168,33 +167,18 @@ int path_spec_fd_event(PathSpec *s, uint32_t revents) { return -EINVAL; } - if (ioctl(s->inotify_fd, FIONREAD, &l) < 0) - return log_error_errno(errno, "FIONREAD failed: %m"); + l = read(s->inotify_fd, buffer, sizeof(buffer)); + if (l < 0) { + if (errno == EAGAIN || errno == EINTR) + return 0; - assert(l > 0); - - buf = malloc(l); - if (!buf) - return log_oom(); - - k = read(s->inotify_fd, buf, l); - if (k < 0) return log_error_errno(errno, "Failed to read inotify event: %m"); + } - e = (struct inotify_event*) buf; - - while (k > 0) { - size_t step; - + FOREACH_INOTIFY_EVENT(e, buffer, l) { if ((s->type == PATH_CHANGED || s->type == PATH_MODIFIED) && s->primary_wd == e->wd) r = 1; - - step = sizeof(struct inotify_event) + e->len; - assert(step <= (size_t) k); - - e = (struct inotify_event*) ((uint8_t*) e + step); - k -= step; } return r;