+static void do_journal_append(char *file) {
+ struct iovec iovec[5];
+ int r, f, j = 0;
+ ssize_t n;
+ _cleanup_free_ char *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) {
+ log_oom();
+ return;
+ }
+
+ memcpy(p, "BOOTCHART=", 10);
+
+ f = open(file, O_RDONLY);
+ if (f < 0) {
+ log_error("Failed to read bootchart data: %m\n");
+ 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));
+}
+