[systemd-commits] 2 commits - src/core src/journal src/readahead

Lennart Poettering lennart at kemper.freedesktop.org
Thu Jun 21 15:19:20 PDT 2012


 src/core/execute.c                |   17 ++++++++-------
 src/core/execute.h                |    1 
 src/core/mount.c                  |    1 
 src/core/service.c                |    1 
 src/core/socket.c                 |    1 
 src/core/swap.c                   |    1 
 src/journal/journal-send.c        |    3 +-
 src/journal/journald.c            |   43 ++++++++++++++++++++++++++++----------
 src/readahead/readahead-analyze.c |    1 
 9 files changed, 49 insertions(+), 20 deletions(-)

New commits:
commit 8b38f3cc3eb73adf9536cb73d0f319e60d42ea0c
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Jun 22 00:19:13 2012 +0200

    journal: fix sd_journal_stream_fd()

diff --git a/src/journal/journal-send.c b/src/journal/journal-send.c
index 7a948a7..bc44828 100644
--- a/src/journal/journal-send.c
+++ b/src/journal/journal-send.c
@@ -375,10 +375,11 @@ _public_ int sd_journal_stream_fd(const char *identifier, int priority, int leve
                 identifier = "";
 
         l = strlen(identifier);
-        header = alloca(l + 1 + 2 + 2 + 2 + 2 + 2);
+        header = alloca(l + 1 + 1 + 2 + 2 + 2 + 2 + 2);
 
         memcpy(header, identifier, l);
         header[l++] = '\n';
+        header[l++] = '\n';
         header[l++] = '0' + priority;
         header[l++] = '\n';
         header[l++] = '0' + !!level_prefix;
diff --git a/src/journal/journald.c b/src/journal/journald.c
index 619a98d..5c6c4ca 100644
--- a/src/journal/journald.c
+++ b/src/journal/journald.c
@@ -460,7 +460,8 @@ static void dispatch_message_real(
                 struct iovec *iovec, unsigned n, unsigned m,
                 struct ucred *ucred,
                 struct timeval *tv,
-                const char *label, size_t label_len, const char *unit_id) {
+                const char *label, size_t label_len,
+                const char *unit_id) {
 
         char *pid = NULL, *uid = NULL, *gid = NULL,
                 *source_time = NULL, *boot_id = NULL, *machine_id = NULL,
diff --git a/src/readahead/readahead-analyze.c b/src/readahead/readahead-analyze.c
index fb50ad3..8f1d7f9 100644
--- a/src/readahead/readahead-analyze.c
+++ b/src/readahead/readahead-analyze.c
@@ -143,7 +143,6 @@ int main_analyze(const char *pack_path) {
 
         return EXIT_SUCCESS;
 
-
 fail:
         fclose(pack);
         return EXIT_FAILURE;

commit 62bca2c657bf95fd1f69935eef09915afa5c69d9
Author: Eelco Dolstra <eelco.dolstra at logicblox.com>
Date:   Thu Jun 21 16:40:47 2012 -0400

    journal: set the _SYSTEMD_UNIT field for messages from terminated processes
    
    As described in
    
      https://bugs.freedesktop.org/show_bug.cgi?id=50184
    
    the journal currently doesn't set fields such as _SYSTEMD_UNIT
    properly for messages coming from processes that have already
    terminated.  This means among other things that "systemctl status" may
    not show some of the output of services that wrote messages just
    before they exited.
    
    This patch fixes this by having processes that log to the journal
    write their unit identifier to journald when the connection to
    /run/systemd/journal/stdout is opened.  Journald stores the unit ID
    and uses it to fill in _SYSTEMD_UNIT when it cannot be obtained
    normally (i.e. from the cgroup).  To prevent impersonating another
    unit, this information is only used when the caller is root.
    
    This doesn't fix the general problem of getting metadata about
    messages from terminated processes (which requires some kernel
    support), but it allows "systemctl status" and similar queries to do
    the Right Thing for units that log via stdout/stderr.

diff --git a/src/core/execute.c b/src/core/execute.c
index bbc430e..01dceb0 100644
--- a/src/core/execute.c
+++ b/src/core/execute.c
@@ -176,7 +176,7 @@ static int open_null_as(int flags, int nfd) {
         return r;
 }
 
-static int connect_logger_as(const ExecContext *context, ExecOutput output, const char *ident, int nfd) {
+static int connect_logger_as(const ExecContext *context, ExecOutput output, const char *ident, const char *unit_id, int nfd) {
         int fd, r;
         union sockaddr_union sa;
 
@@ -206,12 +206,14 @@ static int connect_logger_as(const ExecContext *context, ExecOutput output, cons
 
         dprintf(fd,
                 "%s\n"
+                "%s\n"
                 "%i\n"
                 "%i\n"
                 "%i\n"
                 "%i\n"
                 "%i\n",
                 context->syslog_identifier ? context->syslog_identifier : ident,
+                unit_id,
                 context->syslog_priority,
                 !!context->syslog_level_prefix,
                 output == EXEC_OUTPUT_SYSLOG || output == EXEC_OUTPUT_SYSLOG_AND_CONSOLE,
@@ -311,7 +313,7 @@ static int setup_input(const ExecContext *context, int socket_fd, bool apply_tty
         }
 }
 
-static int setup_output(const ExecContext *context, int socket_fd, const char *ident, bool apply_tty_stdin) {
+static int setup_output(const ExecContext *context, int socket_fd, const char *ident, const char *unit_id, bool apply_tty_stdin) {
         ExecOutput o;
         ExecInput i;
 
@@ -358,7 +360,7 @@ static int setup_output(const ExecContext *context, int socket_fd, const char *i
         case EXEC_OUTPUT_KMSG_AND_CONSOLE:
         case EXEC_OUTPUT_JOURNAL:
         case EXEC_OUTPUT_JOURNAL_AND_CONSOLE:
-                return connect_logger_as(context, o, ident, STDOUT_FILENO);
+                return connect_logger_as(context, o, ident, unit_id, STDOUT_FILENO);
 
         case EXEC_OUTPUT_SOCKET:
                 assert(socket_fd >= 0);
@@ -369,7 +371,7 @@ static int setup_output(const ExecContext *context, int socket_fd, const char *i
         }
 }
 
-static int setup_error(const ExecContext *context, int socket_fd, const char *ident, bool apply_tty_stdin) {
+static int setup_error(const ExecContext *context, int socket_fd, const char *ident, const char *unit_id, bool apply_tty_stdin) {
         ExecOutput o, e;
         ExecInput i;
 
@@ -413,7 +415,7 @@ static int setup_error(const ExecContext *context, int socket_fd, const char *id
         case EXEC_OUTPUT_KMSG_AND_CONSOLE:
         case EXEC_OUTPUT_JOURNAL:
         case EXEC_OUTPUT_JOURNAL_AND_CONSOLE:
-                return connect_logger_as(context, e, ident, STDERR_FILENO);
+                return connect_logger_as(context, e, ident, unit_id, STDERR_FILENO);
 
         case EXEC_OUTPUT_SOCKET:
                 assert(socket_fd >= 0);
@@ -913,6 +915,7 @@ int exec_spawn(ExecCommand *command,
                CGroupBonding *cgroup_bondings,
                CGroupAttribute *cgroup_attributes,
                const char *cgroup_suffix,
+               const char *unit_id,
                int idle_pipe[2],
                pid_t *ret) {
 
@@ -1101,14 +1104,14 @@ int exec_spawn(ExecCommand *command,
                 }
 
                 if (!keep_stdout) {
-                        err = setup_output(context, socket_fd, path_get_file_name(command->path), apply_tty_stdin);
+                        err = setup_output(context, socket_fd, path_get_file_name(command->path), unit_id, apply_tty_stdin);
                         if (err < 0) {
                                 r = EXIT_STDOUT;
                                 goto fail_child;
                         }
                 }
 
-                err = setup_error(context, socket_fd, path_get_file_name(command->path), apply_tty_stdin);
+                err = setup_error(context, socket_fd, path_get_file_name(command->path), unit_id, apply_tty_stdin);
                 if (err < 0) {
                         r = EXIT_STDERR;
                         goto fail_child;
diff --git a/src/core/execute.h b/src/core/execute.h
index 6c68169..2083c29 100644
--- a/src/core/execute.h
+++ b/src/core/execute.h
@@ -192,6 +192,7 @@ int exec_spawn(ExecCommand *command,
                struct CGroupBonding *cgroup_bondings,
                struct CGroupAttribute *cgroup_attributes,
                const char *cgroup_suffix,
+               const char *unit_id,
                int pipe_fd[2],
                pid_t *ret);
 
diff --git a/src/core/mount.c b/src/core/mount.c
index b885baa..3f8cf8a 100644
--- a/src/core/mount.c
+++ b/src/core/mount.c
@@ -770,6 +770,7 @@ static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) {
                             UNIT(m)->cgroup_bondings,
                             UNIT(m)->cgroup_attributes,
                             NULL,
+                            UNIT(m)->id,
                             NULL,
                             &pid)) < 0)
                 goto fail;
diff --git a/src/core/service.c b/src/core/service.c
index 8941271..eeabe8f 100644
--- a/src/core/service.c
+++ b/src/core/service.c
@@ -1810,6 +1810,7 @@ static int service_spawn(
                        UNIT(s)->cgroup_bondings,
                        UNIT(s)->cgroup_attributes,
                        is_control ? "control" : NULL,
+                       UNIT(s)->id,
                        s->type == SERVICE_IDLE ? UNIT(s)->manager->idle_pipe : NULL,
                        &pid);
 
diff --git a/src/core/socket.c b/src/core/socket.c
index 633663e..ea24f4b 100644
--- a/src/core/socket.c
+++ b/src/core/socket.c
@@ -1153,6 +1153,7 @@ static int socket_spawn(Socket *s, ExecCommand *c, pid_t *_pid) {
                        UNIT(s)->cgroup_bondings,
                        UNIT(s)->cgroup_attributes,
                        NULL,
+                       UNIT(s)->id,
                        NULL,
                        &pid);
 
diff --git a/src/core/swap.c b/src/core/swap.c
index e7ed1b8..f3c7fa3 100644
--- a/src/core/swap.c
+++ b/src/core/swap.c
@@ -590,6 +590,7 @@ static int swap_spawn(Swap *s, ExecCommand *c, pid_t *_pid) {
                             UNIT(s)->cgroup_bondings,
                             UNIT(s)->cgroup_attributes,
                             NULL,
+                            UNIT(s)->id,
                             NULL,
                             &pid)) < 0)
                 goto fail;
diff --git a/src/journal/journald.c b/src/journal/journald.c
index 1bf25e8..619a98d 100644
--- a/src/journal/journald.c
+++ b/src/journal/journald.c
@@ -77,6 +77,7 @@
 
 typedef enum StdoutStreamState {
         STDOUT_STREAM_IDENTIFIER,
+        STDOUT_STREAM_UNIT_ID,
         STDOUT_STREAM_PRIORITY,
         STDOUT_STREAM_LEVEL_PREFIX,
         STDOUT_STREAM_FORWARD_TO_SYSLOG,
@@ -97,6 +98,7 @@ struct StdoutStream {
 #endif
 
         char *identifier;
+        char *unit_id;
         int priority;
         bool level_prefix:1;
         bool forward_to_syslog:1;
@@ -458,7 +460,7 @@ static void dispatch_message_real(
                 struct iovec *iovec, unsigned n, unsigned m,
                 struct ucred *ucred,
                 struct timeval *tv,
-                const char *label, size_t label_len) {
+                const char *label, size_t label_len, const char *unit_id) {
 
         char *pid = NULL, *uid = NULL, *gid = NULL,
                 *source_time = NULL, *boot_id = NULL, *machine_id = NULL,
@@ -560,10 +562,11 @@ static void dispatch_message_real(
                 if (cg_pid_get_unit(ucred->pid, &t) >= 0) {
                         unit = strappend("_SYSTEMD_UNIT=", t);
                         free(t);
+                } else if (unit_id)
+                        unit = strappend("_SYSTEMD_UNIT=", unit_id);
 
-                        if (unit)
-                                IOVEC_SET_STRING(iovec[n++], unit);
-                }
+                if (unit)
+                        IOVEC_SET_STRING(iovec[n++], unit);
 
 #ifdef HAVE_SELINUX
                 if (label) {
@@ -702,7 +705,7 @@ static void driver_message(Server *s, sd_id128_t message_id, const char *format,
         ucred.uid = getuid();
         ucred.gid = getgid();
 
-        dispatch_message_real(s, iovec, n, ELEMENTSOF(iovec), &ucred, NULL, NULL, 0);
+        dispatch_message_real(s, iovec, n, ELEMENTSOF(iovec), &ucred, NULL, NULL, 0, NULL);
 }
 
 static void dispatch_message(Server *s,
@@ -710,6 +713,7 @@ static void dispatch_message(Server *s,
                              struct ucred *ucred,
                              struct timeval *tv,
                              const char *label, size_t label_len,
+                             const char *unit_id,
                              int priority) {
         int rl;
         char *path = NULL, *c;
@@ -760,7 +764,7 @@ static void dispatch_message(Server *s,
         free(path);
 
 finish:
-        dispatch_message_real(s, iovec, n, m, ucred, tv, label, label_len);
+        dispatch_message_real(s, iovec, n, m, ucred, tv, label, label_len, unit_id);
 }
 
 static void forward_syslog_iovec(Server *s, const struct iovec *iovec, unsigned n_iovec, struct ucred *ucred, struct timeval *tv) {
@@ -1126,7 +1130,7 @@ static void process_syslog_message(Server *s, const char *buf, struct ucred *ucr
         if (message)
                 IOVEC_SET_STRING(iovec[n++], message);
 
-        dispatch_message(s, iovec, n, ELEMENTSOF(iovec), ucred, tv, label, label_len, priority);
+        dispatch_message(s, iovec, n, ELEMENTSOF(iovec), ucred, tv, label, label_len, NULL, priority);
 
         free(message);
         free(identifier);
@@ -1204,7 +1208,7 @@ static void process_native_message(
 
                 if (e == p) {
                         /* Entry separator */
-                        dispatch_message(s, iovec, n, m, ucred, tv, label, label_len, priority);
+                        dispatch_message(s, iovec, n, m, ucred, tv, label, label_len, NULL, priority);
                         n = 0;
                         priority = LOG_INFO;
 
@@ -1354,7 +1358,7 @@ static void process_native_message(
                         forward_console(s, priority, identifier, message, ucred);
         }
 
-        dispatch_message(s, iovec, n, m, ucred, tv, label, label_len, priority);
+        dispatch_message(s, iovec, n, m, ucred, tv, label, label_len, NULL, priority);
 
 finish:
         for (j = 0; j < n; j++)  {
@@ -1477,7 +1481,7 @@ static int stdout_stream_log(StdoutStream *s, const char *p) {
         }
 #endif
 
-        dispatch_message(s->server, iovec, n, ELEMENTSOF(iovec), &s->ucred, NULL, label, label_len, priority);
+        dispatch_message(s->server, iovec, n, ELEMENTSOF(iovec), &s->ucred, NULL, label, label_len, s->unit_id, priority);
 
         free(message);
         free(syslog_priority);
@@ -1508,6 +1512,22 @@ static int stdout_stream_line(StdoutStream *s, char *p) {
                         }
                 }
 
+                s->state = STDOUT_STREAM_UNIT_ID;
+                return 0;
+
+        case STDOUT_STREAM_UNIT_ID:
+                if (s->ucred.uid == 0) {
+                        if (isempty(p))
+                                s->unit_id = NULL;
+                        else  {
+                                s->unit_id = strdup(p);
+                                if (!s->unit_id) {
+                                        log_error("Out of memory");
+                                        return -ENOMEM;
+                                }
+                        }
+                }
+
                 s->state = STDOUT_STREAM_PRIORITY;
                 return 0;
 
@@ -1874,7 +1894,7 @@ static void proc_kmsg_line(Server *s, const char *p) {
         if (message)
                 IOVEC_SET_STRING(iovec[n++], message);
 
-        dispatch_message(s, iovec, n, ELEMENTSOF(iovec), NULL, NULL, NULL, 0, priority);
+        dispatch_message(s, iovec, n, ELEMENTSOF(iovec), NULL, NULL, NULL, 0, NULL, priority);
 
 finish:
         free(message);



More information about the systemd-commits mailing list