chiark / gitweb /
terminal/screen: add color converter
[elogind.git] / src / journal-remote / journal-remote.c
index f06c2cb2492b8943e73cf410679d027ea7f80a85..c97cfe613e86201f21e61ad179e2f7ec8b54279d 100644 (file)
@@ -295,6 +295,8 @@ static int dispatch_raw_source_event(sd_event_source *event,
                                      int fd,
                                      uint32_t revents,
                                      void *userdata);
+static int dispatch_blocking_source_event(sd_event_source *event,
+                                          void *userdata);
 static int dispatch_raw_connection_event(sd_event_source *event,
                                          int fd,
                                          uint32_t revents,
@@ -378,6 +380,13 @@ static int add_source(RemoteServer *s, int fd, char* name, bool own_name) {
         r = sd_event_add_io(s->events, &source->event,
                             fd, EPOLLIN|EPOLLRDHUP|EPOLLPRI,
                             dispatch_raw_source_event, s);
+        if (r == -EPERM) {
+                log_debug("Falling back to sd_event_add_defer for fd:%d (%s)", fd, name);
+                r = sd_event_add_defer(s->events, &source->event,
+                                       dispatch_blocking_source_event, source);
+                if (r == 0)
+                        sd_event_source_set_enabled(source->event, SD_EVENT_ON);
+        }
         if (r < 0) {
                 log_error("Failed to register event source for fd:%d: %s",
                           fd, strerror(-r));
@@ -819,6 +828,10 @@ static int remoteserver_init(RemoteServer *s,
         assert(server == NULL);
         server = s;
 
+        r = init_writer_hashmap(s);
+        if (r < 0)
+                return r;
+
         n = sd_listen_fds(true);
         if (n < 0) {
                 log_error("Failed to read listening file descriptors from environment: %s",
@@ -942,10 +955,6 @@ static int remoteserver_init(RemoteServer *s,
                 return -EINVAL;
         }
 
-        r = init_writer_hashmap(s);
-        if (r < 0)
-                return r;
-
         if (arg_split_mode == JOURNAL_WRITE_SPLIT_NONE) {
                 /* In this case we know what the writer will be
                    called, so we can create it and verify that we can
@@ -1029,6 +1038,13 @@ static int dispatch_raw_source_event(sd_event_source *event,
                 return 1;
 }
 
+static int dispatch_blocking_source_event(sd_event_source *event,
+                                          void *userdata) {
+        RemoteSource *source = userdata;
+
+        return dispatch_raw_source_event(event, source->fd, EPOLLIN, server);
+}
+
 static int accept_connection(const char* type, int fd,
                              SocketAddress *addr, char **hostname) {
         int fd2, r;