/* SPDX-License-Identifier: LGPL-2.1-or-later */ #include "fd-util.h" #include "inotify-util.h" #include "stat-util.h" int inotify_add_watch_fd(int fd, int what, uint32_t mask) { int wd, r; /* This is like inotify_add_watch(), except that the file to watch is not referenced by a path, but by an fd */ wd = inotify_add_watch(fd, FORMAT_PROC_FD_PATH(what), mask); if (wd < 0) { if (errno != ENOENT) return -errno; /* Didn't work with ENOENT? If so, then either /proc/ isn't mounted, or the fd is bad */ r = proc_mounted(); if (r == 0) return -ENOSYS; if (r > 0) return -EBADF; return -ENOENT; /* OK, no clue, let's propagate the original error */ } return wd; } int inotify_add_watch_and_warn(int fd, const char *pathname, uint32_t mask) { int wd; wd = inotify_add_watch(fd, pathname, mask); if (wd < 0) { if (errno == ENOSPC) return log_error_errno(errno, "Failed to add a watch for %s: inotify watch limit reached", pathname); return log_error_errno(errno, "Failed to add a watch for %s: %m", pathname); } return wd; }