X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fpath.c;h=0fdf48380b3f1b227217f37d7dfb8a4733494cbd;hb=b57b06258e0b1894edb6d1fc52a80b3c33164892;hp=202cba5d31535b8e7bc2b7dcafb68fc6dbd1c35c;hpb=c33b329709ebe2755181980a050d02ec7c81ed87;p=elogind.git diff --git a/src/core/path.c b/src/core/path.c index 202cba5d3..0fdf48380 100644 --- a/src/core/path.c +++ b/src/core/path.c @@ -136,7 +136,7 @@ int path_spec_watch(PathSpec *s, sd_event_io_handler_t handler) { } if (!exists) { - log_error("Failed to add watch on any of the components of %s: %m", + log_error_errno(errno, "Failed to add watch on any of the components of %s: %m", s->path); r = -errno; /* either EACCESS or ENOENT */ goto fail; @@ -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; + union inotify_event_buffer buffer; struct inotify_event *e; - ssize_t k; - int l; + ssize_t l; int r = 0; if (revents != EPOLLIN) { @@ -168,37 +167,18 @@ int path_spec_fd_event(PathSpec *s, uint32_t revents) { return -EINVAL; } - if (ioctl(s->inotify_fd, FIONREAD, &l) < 0) { - log_error("FIONREAD failed: %m"); - return -errno; - } - - assert(l > 0); + l = read(s->inotify_fd, &buffer, sizeof(buffer)); + if (l < 0) { + if (errno == EAGAIN || errno == EINTR) + return 0; - buf = malloc(l); - if (!buf) - return log_oom(); - - k = read(s->inotify_fd, buf, l); - if (k < 0) { - log_error("Failed to read inotify event: %m"); - return -errno; + 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;