chiark / gitweb /
logind: we need to open and close a named pipe once for read before we get EOF
authorLennart Poettering <lennart@poettering.net>
Wed, 29 Jun 2011 01:48:53 +0000 (03:48 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 29 Jun 2011 01:48:53 +0000 (03:48 +0200)
src/logind-session.c
src/logind-session.h

index 35213098466c89588984ed0eb3866e7f577c8a07..bc1b9b77ca31858b1e1d13404c30a33dc91d7da5 100644 (file)
@@ -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);
index 303e61abdfb7fc34cc9d7eac8cc72b5a3323391b..e58ff6fd8f53fa97b78e192f3b897b654bae58f6 100644 (file)
@@ -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);