ioloop-notify-dn.c revision 01c43cb586726efc06342114c0545db4b1733d2c
7cb128dc4cae2a03a742f63ba7afee23c78e3af0Phil Carmody/* Copyright (C) 2003 Timo Sirainen */
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen/* Logic is pretty much based on dnotify by Oskar Liljeblad. */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstatic void sigrt_handler(int signo __attr_unused__, siginfo_t *si,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen ret = write(event_pipe[1], &si->si_fd, sizeof(int));
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if (ret < 0 && errno != EINTR && errno != EAGAIN)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen i_fatal("read(event_pipe) returned %d != %d", ret, sizeof(fd));
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if (gettimeofday(&ioloop_timeval, &ioloop_timezone) < 0)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen for (io = ioloop->notifys; io != NULL; io = io->next) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstruct io *io_loop_notify_add(struct ioloop *ioloop, int fd,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen /* dnotify not in kernel. disable it. */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if (fcntl(fd, F_NOTIFY, DN_CREATE | DN_DELETE | DN_RENAME |
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen io_add(event_pipe[0], IO_READ, event_callback, ioloop);
2a77044395c864cc791cecd34b03002094f4973bTimo Sirainenvoid io_loop_notify_remove(struct ioloop *ioloop, struct io *io)
2a77044395c864cc791cecd34b03002094f4973bTimo Sirainen for (io_p = &ioloop->notifys; *io_p != NULL; io_p = &(*io_p)->next) {
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainenvoid io_loop_notify_handler_init(struct ioloop *ioloop)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen i_new(struct ioloop_notify_handler_context, 1);
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen /* SIGIO is sent if queue gets full. we'll just ignore it. */
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen act.sa_flags = SA_SIGINFO | SA_RESTART | SA_NODEFER;