diff options
-rw-r--r-- | src/journal/journald-server.c | 14 | ||||
-rw-r--r-- | src/journal/journald-socket.c | 87 | ||||
-rw-r--r-- | src/journal/journald-socket.h | 3 |
3 files changed, 47 insertions, 57 deletions
diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c index 6bcc37a8ab..a8c186dc20 100644 --- a/src/journal/journald-server.c +++ b/src/journal/journald-server.c @@ -1155,7 +1155,7 @@ static void server_dispatch_message_real( else journal_uid = 0; - server_forward_socket(s, iovec, n, priority); + (void) server_forward_socket(s, iovec, n, priority); server_write_to_journal(s, journal_uid, iovec, n, priority); } @@ -2488,16 +2488,12 @@ static void server_load_credentials(Server *s) { assert(s); /* if we already have a forward address from config don't load the credential */ - if (s->forward_to_socket.sockaddr.sa.sa_family != AF_UNSPEC) { - log_debug("Socket forward address already set not loading journal.forward_to_socket"); - return; - } + if (s->forward_to_socket.sockaddr.sa.sa_family != AF_UNSPEC) + return log_debug("Socket forward address already set not loading journal.forward_to_socket"); r = read_credential("journal.forward_to_socket", &data, NULL); - if (r < 0) { - log_debug_errno(r, "Failed to read credential journal.forward_to_socket, ignoring: %m"); - return; - } + if (r < 0) + return (void) log_debug_errno(r, "Failed to read credential journal.forward_to_socket, ignoring: %m"); r = socket_address_parse(&s->forward_to_socket, data); if (r < 0) diff --git a/src/journal/journald-socket.c b/src/journal/journald-socket.c index 6073caea02..1fb204ea83 100644 --- a/src/journal/journald-socket.c +++ b/src/journal/journald-socket.c @@ -13,39 +13,38 @@ #include "socket-util.h" #include "sparse-endian.h" -void server_open_forward_socket(Server *s) { +static int server_open_forward_socket(Server *s) { _cleanup_close_ int socket_fd = -EBADF; const SocketAddress *addr; int family; assert(s); - /* nop if there is nothing to do */ - if (s->forward_to_socket.sockaddr.sa.sa_family == AF_UNSPEC || s->namespace || s->forward_socket_fd >= 0) - return; + /* Noop if there is nothing to do. */ + if (s->forward_to_socket.sockaddr.sa.sa_family == AF_UNSPEC || s->namespace) + return 0; + /* All ready, nothing to do. */ + if (s->forward_socket_fd >= 0) + return 1; addr = &s->forward_to_socket; family = socket_address_family(addr); - if (!IN_SET(family, AF_UNIX, AF_INET, AF_INET6, AF_VSOCK)) { - log_debug("Unsupported socket type for forward socket: %d", family); - return; - } + if (!IN_SET(family, AF_UNIX, AF_INET, AF_INET6, AF_VSOCK)) + return log_debug_errno(SYNTHETIC_ERRNO(ESOCKTNOSUPPORT), + "Unsupported socket type for forward socket: %d", family); socket_fd = socket(family, SOCK_STREAM|SOCK_CLOEXEC, 0); - if (socket_fd < 0) { - log_debug_errno(errno, "Failed to create forward socket, ignoring: %m"); - return; - } + if (socket_fd < 0) + return log_debug_errno(errno, "Failed to create forward socket, ignoring: %m"); - if (connect(socket_fd, &addr->sockaddr.sa, addr->size) < 0) { - log_debug_errno(errno, "Failed to connect to remote address for forwarding, ignoring: %m"); - return; - } + if (connect(socket_fd, &addr->sockaddr.sa, addr->size) < 0) + return log_debug_errno(errno, "Failed to connect to remote address for forwarding, ignoring: %m"); s->forward_socket_fd = TAKE_FD(socket_fd); - log_debug("Successfully connected to remote address for forwarding"); + log_debug("Successfully connected to remote address for forwarding."); + return 1; } static inline bool must_serialise(struct iovec iov) { @@ -58,42 +57,40 @@ static inline bool must_serialise(struct iovec iov) { const uint8_t *s = iov.iov_base; bool before_value = true; - FOREACH_ARRAY(c, s, iov.iov_len) { + FOREACH_ARRAY(c, s, iov.iov_len) if (before_value) before_value = *c != (uint8_t)'='; else if (*c < (uint8_t)' ' && *c != (uint8_t)'\t') return true; - } return false; } -void server_forward_socket( +int server_forward_socket( Server *s, const struct iovec *iovec, size_t n_iovec, int priority) { - _cleanup_free_ struct iovec *iov_alloc = NULL; - struct iovec *iov = NULL; + _cleanup_free_ struct iovec *iov_alloc = NULL; + struct iovec *iov; _cleanup_free_ le64_t *len_alloc = NULL; - le64_t *len = NULL; + le64_t *len; + int r; assert(s); assert(iovec); assert(n_iovec > 0); if (LOG_PRI(priority) > s->max_level_socket) - return; + return 0; - server_open_forward_socket(s); + r = server_open_forward_socket(s); + if (r <= 0) + return r; - /* if we failed to open a socket just return */ - if (s->forward_socket_fd < 0) - return; - - /* we need a newline after each iovec + 4 for each we have to serialise in a binary safe way - * +1 for the final __REALTIME_TIMESTAMP metadata field */ + /* We need a newline after each iovec + 4 for each we have to serialise in a binary safe way + * + 1 for the final __REALTIME_TIMESTAMP metadata field. */ size_t n = n_iovec * 5 + 1; if (n < ALLOCA_MAX / (sizeof(struct iovec) + sizeof(le64_t)) / 2) { @@ -101,18 +98,14 @@ void server_forward_socket( len = newa(le64_t, n_iovec); } else { iov_alloc = new(struct iovec, n); - if (!iov_alloc) { - log_oom(); - return; - } + if (!iov_alloc) + return log_oom(); iov = iov_alloc; len_alloc = new(le64_t, n_iovec); - if (!len_alloc) { - log_oom(); - return; - } + if (!len_alloc) + return log_oom(); len = len_alloc; } @@ -125,10 +118,9 @@ void server_forward_socket( c = memchr(i->iov_base, '=', i->iov_len); /* this should never happen */ - if (_unlikely_(!c || c == i->iov_base)) { - log_error("Found invalid journal field, refusing to forward."); - return; - } + if (_unlikely_(!c || c == i->iov_base)) + return log_warning_errno(SYNTHETIC_ERRNO(EBADMSG), + "Found invalid journal field, refusing to forward."); /* write the field name */ iov[iov_idx++] = IOVEC_MAKE(i->iov_base, c - (uint8_t*) i->iov_base); @@ -147,7 +139,8 @@ void server_forward_socket( iov[iov_idx++] = nl; } - /* synthesise __REALTIME_TIMESTAMP as the last argument so systemd-journal-upload can receive these export messages */ + /* Synthesise __REALTIME_TIMESTAMP as the last argument so systemd-journal-upload can receive these + * export messages. */ char buf[sizeof("__REALTIME_TIMESTAMP=") + DECIMAL_STR_MAX(usec_t) + 2]; xsprintf(buf, "__REALTIME_TIMESTAMP="USEC_FMT"\n\n", now(CLOCK_REALTIME)); iov[iov_idx++] = IOVEC_MAKE_STRING(buf); @@ -155,8 +148,10 @@ void server_forward_socket( if (writev(s->forward_socket_fd, iov, iov_idx) < 0) { log_debug_errno(errno, "Failed to forward log message over socket: %m"); - /* if we failed to send once we will probably fail again so wait for a new connection to - * establish before attempting to forward again */ + /* If we failed to send once we will probably fail again so wait for a new connection to + * establish before attempting to forward again. */ s->forward_socket_fd = safe_close(s->forward_socket_fd); } + + return 0; } diff --git a/src/journal/journald-socket.h b/src/journal/journald-socket.h index cb156d73fa..db8ba68223 100644 --- a/src/journal/journald-socket.h +++ b/src/journal/journald-socket.h @@ -4,5 +4,4 @@ #include "journald-server.h" #include "socket-util.h" -void server_forward_socket(Server *s, const struct iovec *iovec, size_t n, int priority); -void server_open_forward_socket(Server *s); +int server_forward_socket(Server *s, const struct iovec *iovec, size_t n, int priority); |