journald: shorten code a bit and return error where it's useful
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 16 Feb 2024 14:29:29 +0000 (15:29 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 19 Feb 2024 10:56:28 +0000 (11:56 +0100)
Follow-up for f31cff849d3db074d0d8157e4117d9b8372c03e8.

src/journal/journald-server.c
src/journal/journald-socket.c
src/journal/journald-socket.h

index 6bcc37a8ab119cde5ebf8d728ef2c62f92a92283..a8c186dc2094fad53b69ee8b282d8e67527d69ae 100644 (file)
@@ -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)
index 6073caea02125232d6cc45d0d4920786ed7cba5f..1fb204ea831c636363f6e75f7b52b26b87c8a260 100644 (file)
 #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;
 }
index cb156d73fab479a2380ea7e1ba5ddf6cc3261a54..db8ba68223c6e1f88aa1874fc81aef74e1d5c376 100644 (file)
@@ -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);