ioloop-notify-inotify.c revision bcb4e51a409d94ae670de96afb8483a4f7855294
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2005-2018 Dovecot authors, see the included COPYING file */
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainenstatic struct ioloop_notify_handler_context *io_loop_notify_handler_init(void);
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainenstatic bool inotify_input_more(struct ioloop *ioloop)
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen /* read as many events as there is available and fit into our buffer.
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen only full events are returned by the kernel. */
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen ret = read(ctx->inotify_fd, event_buf, sizeof(event_buf));
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen /* nothing more to read */
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen event = (struct inotify_event *)(event_buf + pos);
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen io = io_notify_fd_find(&ctx->fd_ctx, event->wd);
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen /* calling inotify_rm_watch() would now give
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen i_error("read(inotify) returned partial event");
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainenstatic void inotify_input(struct ioloop *ioloop)
dfa23b2ddc43f323112225facf7cd7191e62e02cAki Tuomiio_add_notify(const char *path, const char *source_filename,
f6845101f2d6b8068e352a0b5a0d4bb04e20ad74Timo Sirainen io_callback_t *callback, void *context, struct io **io_r)
36d2b3dc8766ef336a289a51075ca2f3236ef1efTimo Sirainen /* ESTALE could happen with NFS. Don't bother giving an error
36d2b3dc8766ef336a289a51075ca2f3236ef1efTimo Sirainen message then. */
c7398cd92a003144358c121bdea63fba35b884aeTimo Sirainen i_error("inotify_add_watch(%s) failed: %m", path);
c7398cd92a003144358c121bdea63fba35b884aeTimo Sirainen i_warning("Inotify watch limit for user exceeded, "
c7398cd92a003144358c121bdea63fba35b884aeTimo Sirainen "disabling. Increase "
d6500661eb699ff335ac570c8646b6e067e1aac6Timo Sirainen ctx->event_io = io_add(ctx->inotify_fd, IO_READ,
1964dbea138cb4a213b1bce1eeee68992b18829aTimo Sirainen *io_r = io_notify_fd_add(&ctx->fd_ctx, wd, callback, context);
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen struct io_notify *io = (struct io_notify *)_io;
d514e6e6ea2320c18c58e0ade9184f5aa67d491bTimo Sirainen /* ernro=EINVAL happens if the file itself is deleted and
d514e6e6ea2320c18c58e0ade9184f5aa67d491bTimo Sirainen kernel has sent IN_IGNORED event which we haven't read. */
d514e6e6ea2320c18c58e0ade9184f5aa67d491bTimo Sirainen if (inotify_rm_watch(ctx->inotify_fd, io->fd) < 0 &&
dad206f8341603837b7de4309a7c195da26cf9aaTimo Sirainen if (ctx->fd_ctx.notifies == NULL && ctx->event_io != NULL)
fdb97244fa45c32c3593726c15aa69ce29bc7121Timo Sirainenstatic void ioloop_inotify_user_limit_exceeded(void)
fdb97244fa45c32c3593726c15aa69ce29bc7121Timo Sirainen name = t_strdup_printf("UID %s", dec2str(uid));
fdb97244fa45c32c3593726c15aa69ce29bc7121Timo Sirainen i_warning("Inotify instance limit for user %s exceeded, disabling. "
fdb97244fa45c32c3593726c15aa69ce29bc7121Timo Sirainen "Increase /proc/sys/fs/inotify/max_user_instances", name);
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainenstatic struct ioloop_notify_handler_context *io_loop_notify_handler_init(void)
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainen i_new(struct ioloop_notify_handler_context, 1);
9d7451b57769988f7e3e41cd8790e65429ffc5c7Timo Sirainenvoid io_loop_notify_handler_deinit(struct ioloop *ioloop)
dad206f8341603837b7de4309a7c195da26cf9aaTimo Sirainenint io_loop_extract_notify_fd(struct ioloop *ioloop)