diff options
author | Auke Kok <auke-jan.h.kok@intel.com> | 2013-04-15 16:23:42 -0700 |
---|---|---|
committer | Auke Kok <auke-jan.h.kok@intel.com> | 2013-04-15 16:28:41 -0700 |
commit | c4d58b0b6d238b955ece39a9dd9d3ca84b3408f3 (patch) | |
tree | 6cdaa29de380c94bb38c3778a5b3c49a26da1f17 | |
parent | 8ad802ec3539142e2b1bf06ae8257b302630c184 (diff) |
bootchart: put the bootchart into the journal.
This bit of code is mostly stolen from coredump.c. We construct
a simple journal message and append the bootchart file in the
journal automatically.
You can extract the latest bootchart from the current boot with
something like:
$ journalctl -b MESSAGE_ID=9f26aa562cf440c2b16c773d0479b518 --field=BOOTCHART
which prints it to stdout.
None of the other logic is touched. The journal entry is created
even if bootchart was run manually, which is probably wrong.
-rw-r--r-- | Makefile.am | 3 | ||||
-rw-r--r-- | src/bootchart/bootchart.c | 53 |
2 files changed, 55 insertions, 1 deletions
diff --git a/Makefile.am b/Makefile.am index 5a632a9093..6f2b6ef96a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -3080,7 +3080,8 @@ systemd_bootchart_SOURCES = \ src/bootchart/svg.h systemd_bootchart_LDADD = \ - libsystemd-shared.la + libsystemd-shared.la \ + libsystemd-journal.la rootlibexec_PROGRAMS += \ systemd-bootchart diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c index 288148f483..d6c63cd129 100644 --- a/src/bootchart/bootchart.c +++ b/src/bootchart/bootchart.c @@ -48,6 +48,7 @@ #include <errno.h> #include <fcntl.h> #include <stdbool.h> +#include <systemd/sd-journal.h> #include "util.h" #include "fileio.h" @@ -98,6 +99,8 @@ static void signal_handler(int sig) { #define BOOTCHART_CONF "/etc/systemd/bootchart.conf" +#define BOOTCHART_MAX (16*1024*1024) + static void parse_conf(void) { char *init = NULL, *output = NULL; const ConfigTableItem items[] = { @@ -237,6 +240,54 @@ static int parse_args(int argc, char *argv[]) { return 0; } +static void do_journal_append(char *file) +{ + struct iovec iovec[5]; + int r, f, j = 0; + ssize_t n; + char _cleanup_free_ *bootchart_file = NULL, *bootchart_message = NULL, + *p = NULL; + + bootchart_file = strappend("BOOTCHART_FILE=", file); + if (bootchart_file) + IOVEC_SET_STRING(iovec[j++], bootchart_file); + + IOVEC_SET_STRING(iovec[j++], "MESSAGE_ID=9f26aa562cf440c2b16c773d0479b518"); + IOVEC_SET_STRING(iovec[j++], "PRIORITY=7"); + bootchart_message = strjoin("MESSAGE=Bootchart created: ", file, NULL); + if (bootchart_message) + IOVEC_SET_STRING(iovec[j++], bootchart_message); + + p = malloc(9 + BOOTCHART_MAX); + if (!p) { + r = log_oom(); + return; + } + + memcpy(p, "BOOTCHART=", 10); + + f = open(file, O_RDONLY); + if (f < 0) { + log_error("Failed to read bootchart data: %s\n", strerror(-errno)); + return; + } + n = loop_read(f, p + 10, BOOTCHART_MAX, false); + if (n < 0) { + log_error("Failed to read bootchart data: %s\n", strerror(-n)); + close(f); + return; + } + close(f); + + iovec[j].iov_base = p; + iovec[j].iov_len = 10 + n; + j++; + + r = sd_journal_sendv(iovec, j); + if (r < 0) + log_error("Failed to send bootchart: %s", strerror(-r)); +} + int main(int argc, char *argv[]) { _cleanup_free_ char *build = NULL; struct sigaction sig = { @@ -382,6 +433,8 @@ int main(int argc, char *argv[]) { fprintf(stderr, "systemd-bootchart wrote %s\n", output_file); + do_journal_append(output_file); + if (of) fclose(of); |