X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fstdout-syslog-bridge.c;h=6ec23ec6120ae3c0db9fa458b3c830452d87cc64;hp=48a301f6a711ffd2fb8d8213b4868abfed8fd70a;hb=4bba9156da3e1df2cee24d10d7cd88c776ef4179;hpb=346bce1f4cff0096177c613987cdc80fa4ec134e diff --git a/src/stdout-syslog-bridge.c b/src/stdout-syslog-bridge.c index 48a301f6a..6ec23ec61 100644 --- a/src/stdout-syslog-bridge.c +++ b/src/stdout-syslog-bridge.c @@ -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; }