core: unify how we iterate over inotify events

Let's add some syntactic sugar for iterating through inotify events, and
use it everywhere.
This commit is contained in:
Lennart Poettering
2014-12-10 01:48:39 +01:00
parent df63dda6d4
commit f7c1ad4fd4
6 changed files with 65 additions and 90 deletions
+8 -24
View File
@@ -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;