diff options
Diffstat (limited to 'src/journal/journald-stream.c')
-rw-r--r-- | src/journal/journald-stream.c | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/src/journal/journald-stream.c b/src/journal/journald-stream.c index dbf3503a82..137c8f0446 100644 --- a/src/journal/journald-stream.c +++ b/src/journal/journald-stream.c @@ -12,6 +12,7 @@ #include "alloc-util.h" #include "dirent-util.h" +#include "env-file.h" #include "escape.h" #include "fd-util.h" #include "fileio.h" @@ -31,6 +32,7 @@ #include "stdio-util.h" #include "string-util.h" #include "syslog-util.h" +#include "tmpfile-util.h" #include "unit-name.h" #define STDOUT_STREAMS_MAX 4096 @@ -125,7 +127,7 @@ void stdout_stream_free(StdoutStream *s) { DEFINE_TRIVIAL_CLEANUP_FUNC(StdoutStream*, stdout_stream_free); -static void stdout_stream_destroy(StdoutStream *s) { +void stdout_stream_destroy(StdoutStream *s) { if (!s) return; @@ -534,7 +536,7 @@ terminate: return 0; } -static int stdout_stream_install(Server *s, int fd, StdoutStream **ret) { +int stdout_stream_install(Server *s, int fd, StdoutStream **ret) { _cleanup_(stdout_stream_freep) StdoutStream *stream = NULL; sd_id128_t id; int r; @@ -596,10 +598,10 @@ static int stdout_stream_new(sd_event_source *es, int listen_fd, uint32_t revent assert(s); - if (revents != EPOLLIN) { - log_error("Got invalid event from epoll for stdout server fd: %"PRIx32, revents); - return -EIO; - } + if (revents != EPOLLIN) + return log_error_errno(SYNTHETIC_ERRNO(EIO), + "Got invalid event from epoll for stdout server fd: %" PRIx32, + revents); fd = accept4(s->stdout_fd, NULL, NULL, SOCK_NONBLOCK|SOCK_CLOEXEC); if (fd < 0) { @@ -610,7 +612,17 @@ static int stdout_stream_new(sd_event_source *es, int listen_fd, uint32_t revent } if (s->n_stdout_streams >= STDOUT_STREAMS_MAX) { - log_warning("Too many stdout streams, refusing connection."); + struct ucred u; + + r = getpeercred(fd, &u); + + /* By closing fd here we make sure that the client won't wait too long for journald to + * gather all the data it adds to the error message to find out that the connection has + * just been refused. + */ + fd = safe_close(fd); + + server_driver_message(s, r < 0 ? 0 : u.pid, NULL, LOG_MESSAGE("Too many stdout streams, refusing connection."), NULL); return 0; } @@ -641,7 +653,7 @@ static int stdout_stream_load(StdoutStream *stream, const char *fname) { return log_oom(); } - r = parse_env_file(NULL, stream->state_file, NEWLINE, + r = parse_env_file(NULL, stream->state_file, "PRIORITY", &priority, "LEVEL_PREFIX", &level_prefix, "FORWARD_TO_SYSLOG", &forward_to_syslog, @@ -649,8 +661,7 @@ static int stdout_stream_load(StdoutStream *stream, const char *fname) { "FORWARD_TO_CONSOLE", &forward_to_console, "IDENTIFIER", &stream->identifier, "UNIT", &stream->unit_id, - "STREAM_ID", &stream_id, - NULL); + "STREAM_ID", &stream_id); if (r < 0) return log_error_errno(r, "Failed to read: %s", stream->state_file); @@ -793,7 +804,7 @@ int server_open_stdout_socket(Server *s) { if (s->stdout_fd < 0) return log_error_errno(errno, "socket() failed: %m"); - (void) unlink(sa.un.sun_path); + (void) sockaddr_un_unlink(&sa.un); r = bind(s->stdout_fd, &sa.sa, SOCKADDR_UN_LEN(sa.un)); if (r < 0) @@ -804,7 +815,7 @@ int server_open_stdout_socket(Server *s) { if (listen(s->stdout_fd, SOMAXCONN) < 0) return log_error_errno(errno, "listen(%s) failed: %m", sa.un.sun_path); } else - fd_nonblock(s->stdout_fd, 1); + (void) fd_nonblock(s->stdout_fd, true); r = sd_event_add_io(s->event, &s->stdout_event_source, s->stdout_fd, EPOLLIN, stdout_stream_new, s); if (r < 0) |