/* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once #include #include #include #include #include "log.h" #define INOTIFY_EVENT_MAX (offsetof(struct inotify_event, name) + NAME_MAX + 1) #define _FOREACH_INOTIFY_EVENT(e, buffer, sz, log_level, start, end) \ for (struct inotify_event \ *start = &((buffer).ev), \ *end = (struct inotify_event*) ((uint8_t*) start + (sz)), \ *e = start; \ (size_t) ((uint8_t*) end - (uint8_t*) e) >= sizeof(struct inotify_event) && \ ((size_t) ((uint8_t*) end - (uint8_t*) e) >= sizeof(struct inotify_event) + e->len || \ (log_full(log_level, "Received invalid inotify event, ignoring."), false)); \ e = (struct inotify_event*) ((uint8_t*) e + sizeof(struct inotify_event) + e->len)) #define _FOREACH_INOTIFY_EVENT_FULL(e, buffer, sz, log_level) \ _FOREACH_INOTIFY_EVENT(e, buffer, sz, log_level, UNIQ_T(start, UNIQ), UNIQ_T(end, UNIQ)) #define FOREACH_INOTIFY_EVENT(e, buffer, sz) \ _FOREACH_INOTIFY_EVENT_FULL(e, buffer, sz, LOG_DEBUG) #define FOREACH_INOTIFY_EVENT_WARN(e, buffer, sz) \ _FOREACH_INOTIFY_EVENT_FULL(e, buffer, sz, LOG_WARNING) union inotify_event_buffer { struct inotify_event ev; uint8_t raw[INOTIFY_EVENT_MAX]; }; int inotify_add_watch_fd(int fd, int what, uint32_t mask); int inotify_add_watch_and_warn(int fd, const char *pathname, uint32_t mask);