X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogind-session.c;h=bc1b9b77ca31858b1e1d13404c30a33dc91d7da5;hb=64747e2d4b6feb61e9f9e70d36ffcf5a972e168a;hp=088e956bfcf5366f53743759a2c73d841ded9eef;hpb=193197e85ccc5622abd9653dcd939712334d3ea3;p=elogind.git diff --git a/src/logind-session.c b/src/logind-session.c index 088e956bf..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); @@ -841,12 +839,12 @@ void session_remove_fifo(Session *s) { } } -int session_check_gc(Session *s) { +int session_check_gc(Session *s, bool drop_not_started) { int r; assert(s); - if (!s->started) + if (drop_not_started && !s->started) return 0; if (s->fifo_fd >= 0) {