chiark / gitweb /
logind: move logind into its own subdirectory
[elogind.git] / src / stdout-syslog-bridge.c
index 48a301f6a711ffd2fb8d8213b4868abfed8fd70a..6ec23ec6120ae3c0db9fa458b3c830452d87cc64 100644 (file)
@@ -88,7 +88,7 @@ struct Stream {
         bool prefix:1;
         bool tee_console:1;
 
-        char buffer[LINE_MAX];
+        char buffer[LINE_MAX+1];
         size_t length;
 
         LIST_FIELDS(Stream, stream);
@@ -111,9 +111,9 @@ static int stream_log(Stream *s, char *p, usec_t ts) {
         if (*p == 0)
                 return 0;
 
-        /* Patch in LOG_USER facility if necessary */
+        /* Patch in configured facility if necessary */
         if ((priority & LOG_FACMASK) == 0)
-                priority = LOG_USER | LOG_PRI(priority);
+                priority = (s->priority & LOG_FACMASK) | priority;
 
         /*
          * The format glibc uses to talk to the syslog daemon is:
@@ -236,7 +236,6 @@ static int stream_log(Stream *s, char *p, usec_t ts) {
 
                         writev(console, iovec, 4);
                 }
-
         }
 
         return 0;
@@ -321,16 +320,25 @@ static int stream_scan(Stream *s, usec_t ts) {
         p = s->buffer;
         remaining = s->length;
         for (;;) {
-                char *newline;
-
-                if (!(newline = memchr(p, '\n', remaining)))
-                        break;
+                char *end;
+                size_t skip;
+
+                end = memchr(p, '\n', remaining);
+                if (!end) {
+                        if (remaining >= LINE_MAX) {
+                                end = p + LINE_MAX;
+                                skip = LINE_MAX;
+                        } else
+                                break;
+                } else
+                        skip = end - p + 1;
 
-                *newline = 0;
+                *end = 0;
 
-                if ((r = stream_line(s, p, ts)) >= 0) {
-                        remaining -= newline-p+1;
-                        p = newline+1;
+                r = stream_line(s, p, ts);
+                if (r >= 0) {
+                        remaining -= skip;
+                        p += skip;
                 }
         }
 
@@ -347,7 +355,8 @@ static int stream_process(Stream *s, usec_t ts) {
         int r;
         assert(s);
 
-        if ((l = read(s->fd, s->buffer+s->length, LINE_MAX-s->length)) < 0) {
+        l = read(s->fd, s->buffer+s->length, LINE_MAX-s->length);
+        if (l < 0) {
 
                 if (errno == EAGAIN)
                         return 0;
@@ -356,7 +365,6 @@ static int stream_process(Stream *s, usec_t ts) {
                 return -errno;
         }
 
-
         if (l == 0)
                 return 0;
 
@@ -399,8 +407,10 @@ static int stream_new(Server *s, int server_fd) {
         int r;
 
         assert(s);
+        assert(server_fd >= 0);
 
-        if ((fd = accept4(server_fd, NULL, NULL, SOCK_NONBLOCK|SOCK_CLOEXEC)) < 0)
+        fd = accept4(server_fd, NULL, NULL, SOCK_NONBLOCK|SOCK_CLOEXEC);
+        if (fd < 0)
                 return -errno;
 
         if (s->n_streams >= STREAMS_MAX) {
@@ -639,7 +649,8 @@ int main(int argc, char *argv[]) {
 
         umask(0022);
 
-        if ((n = sd_listen_fds(true)) < 0) {
+        n = sd_listen_fds(true);
+        if (n < 0) {
                 log_error("Failed to read listening file descriptors from environment: %s", strerror(-r));
                 return EXIT_FAILURE;
         }