From: Lennart Poettering Date: Wed, 29 Jun 2011 01:48:53 +0000 (+0200) Subject: logind: we need to open and close a named pipe once for read before we get EOF X-Git-Tag: v30~100 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=b4f78aeac66e64e0489d7a26f1370a69d0fcf011 logind: we need to open and close a named pipe once for read before we get EOF --- diff --git a/src/logind-session.c b/src/logind-session.c index 352130984..bc1b9b77c 100644 --- a/src/logind-session.c +++ b/src/logind-session.c @@ -297,7 +297,19 @@ int session_load(Session *s) { s->type = t; } - session_open_fifo(s); + if (s->fifo_path) { + int fd; + + /* If we open an unopened pipe for reading we will not + get an EOF. to trigger an EOF we hence open it for + reading, but close it right-away which then will + trigger the EOF. */ + + fd = session_create_fifo(s); + if (fd >= 0) + close_nointr_nofail(fd); + } + finish: free(remote); @@ -768,41 +780,12 @@ void session_set_idle_hint(Session *s, bool b) { "IdleSinceHintMonotonic\0"); } -int session_open_fifo(Session *s) { - struct epoll_event ev; - int r; - - assert(s); - - if (s->fifo_fd >= 0) - return 0; - - if (!s->fifo_path) - return -EINVAL; - - s->fifo_fd = open(s->fifo_path, O_RDONLY|O_CLOEXEC|O_NDELAY); - if (s->fifo_fd < 0) - return -errno; - - r = hashmap_put(s->manager->fifo_fds, INT_TO_PTR(s->fifo_fd + 1), s); - if (r < 0) - return r; - - zero(ev); - ev.events = 0; - ev.data.u32 = FD_FIFO_BASE + s->fifo_fd; - - if (epoll_ctl(s->manager->epoll_fd, EPOLL_CTL_ADD, s->fifo_fd, &ev) < 0) - return -errno; - - return 0; -} - int session_create_fifo(Session *s) { int r; assert(s); + /* Create FIFO */ if (!s->fifo_path) { if (asprintf(&s->fifo_path, "/run/systemd/sessions/%s.ref", s->id) < 0) return -ENOMEM; @@ -812,9 +795,24 @@ int session_create_fifo(Session *s) { } /* Open reading side */ - r = session_open_fifo(s); - if (r < 0) - return r; + if (s->fifo_fd < 0) { + struct epoll_event ev; + + s->fifo_fd = open(s->fifo_path, O_RDONLY|O_CLOEXEC|O_NDELAY); + if (s->fifo_fd < 0) + return -errno; + + r = hashmap_put(s->manager->fifo_fds, INT_TO_PTR(s->fifo_fd + 1), s); + if (r < 0) + return r; + + zero(ev); + ev.events = 0; + ev.data.u32 = FD_FIFO_BASE + s->fifo_fd; + + if (epoll_ctl(s->manager->epoll_fd, EPOLL_CTL_ADD, s->fifo_fd, &ev) < 0) + return -errno; + } /* Open writing side */ r = open(s->fifo_path, O_WRONLY|O_CLOEXEC|O_NDELAY); diff --git a/src/logind-session.h b/src/logind-session.h index 303e61abd..e58ff6fd8 100644 --- a/src/logind-session.h +++ b/src/logind-session.h @@ -92,7 +92,6 @@ int session_activate(Session *s); bool session_is_active(Session *s); int session_get_idle_hint(Session *s, dual_timestamp *t); void session_set_idle_hint(Session *s, bool b); -int session_open_fifo(Session *s); int session_create_fifo(Session *s); void session_remove_fifo(Session *s); int session_start(Session *s);