X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fjournal%2Fjournal-send.c;h=cc3cd8c303135a0a044f908eaaa1bd018b1a1258;hb=fe6521272ba203ec8f0d5a94f0729960b3f90525;hp=238d64c13eb698614fc390204c41d14140b6c7db;hpb=6ad1d1c30621280bfad3e63fcc1c7ceb7d8ffa98;p=elogind.git diff --git a/src/journal/journal-send.c b/src/journal/journal-send.c index 238d64c13..cc3cd8c30 100644 --- a/src/journal/journal-send.c +++ b/src/journal/journal-send.c @@ -26,6 +26,7 @@ #include "sd-journal.h" #include "util.h" +#include "socket-util.h" /* We open a single fd, and we'll share it with the current process, * all its threads, and all its subprocesses. This means we need to @@ -67,6 +68,12 @@ int sd_journal_printv(int priority, const char *format, va_list ap) { char buffer[8 + LINE_MAX], p[11]; struct iovec iov[2]; + if (priority < 0 || priority > 7) + return -EINVAL; + + if (!format) + return -EINVAL; + snprintf(p, sizeof(p), "PRIORITY=%i", priority & LOG_PRIMASK); char_array_0(p); @@ -197,3 +204,56 @@ int sd_journal_sendv(const struct iovec *iov, int n) { return 0; } + +int sd_journal_stream_fd(const char *tag, int priority, int priority_prefix) { + union sockaddr_union sa; + int fd; + char *header; + size_t l; + ssize_t r; + + if (priority < 0 || priority > 7) + return -EINVAL; + + fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0); + if (fd < 0) + return -errno; + + zero(sa); + sa.un.sun_family = AF_UNIX; + strncpy(sa.un.sun_path, "/run/systemd/stdout", sizeof(sa.un.sun_path)); + + r = connect(fd, &sa.sa, offsetof(union sockaddr_union, un.sun_path) + strlen(sa.un.sun_path)); + if (r < 0) { + close_nointr_nofail(fd); + return -errno; + } + + if (!tag) + tag = ""; + + l = strlen(tag); + header = alloca(l + 1 + 2 + 2 + 2); + + memcpy(header, tag, l); + header[l++] = '\n'; + header[l++] = '0' + priority; + header[l++] = '\n'; + header[l++] = '0' + !!priority_prefix; + header[l++] = '\n'; + header[l++] = '0'; + header[l++] = '\n'; + + r = loop_write(fd, header, l, false); + if (r < 0) { + close_nointr_nofail(fd); + return (int) r; + } + + if ((size_t) r != l) { + close_nointr_nofail(fd); + return -errno; + } + + return fd; +}