X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;ds=sidebyside;f=src%2Fbootchart%2Fbootchart.c;h=d6c63cd1297c9c3ea872df82cdc5096654c11297;hb=c4d58b0b6d238b955ece39a9dd9d3ca84b3408f3;hp=288148f483e6349639f6440e9bfd5ba5b3a5ed09;hpb=8ad802ec3539142e2b1bf06ae8257b302630c184;p=elogind.git diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c index 288148f48..d6c63cd12 100644 --- a/src/bootchart/bootchart.c +++ b/src/bootchart/bootchart.c @@ -48,6 +48,7 @@ #include #include #include +#include #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);