#include "socket-util.h"
#include "cgroup-util.h"
#include "list.h"
+#include "virt.h"
+#include "missing.h"
+#include "conf-parser.h"
#include "journal-rate-limit.h"
#include "journal-internal.h"
#include "journal-vacuum.h"
#include "journal-authenticate.h"
-#include "conf-parser.h"
#include "journald.h"
-#include "virt.h"
-#include "missing.h"
+#include "journald-kmsg.h"
+#include "journald-syslog.h"
#ifdef HAVE_ACL
#include <sys/acl.h>
#define RECHECK_AVAILABLE_SPACE_USEC (30*USEC_PER_SEC)
-#define N_IOVEC_META_FIELDS 17
-#define N_IOVEC_KERNEL_FIELDS 64
-#define N_IOVEC_UDEV_FIELDS 32
-
#define ENTRY_SIZE_MAX (1024*1024*32)
typedef enum StdoutStreamState {
free(selinux_context);
}
-static void driver_message(Server *s, sd_id128_t message_id, const char *format, ...) {
+void server_driver_message(Server *s, sd_id128_t message_id, const char *format, ...) {
char mid[11 + 32 + 1];
char buffer[16 + LINE_MAX + 1];
struct iovec iovec[N_IOVEC_META_FIELDS + 4];
dispatch_message_real(s, iovec, n, ELEMENTSOF(iovec), &ucred, NULL, NULL, 0, NULL);
}
-static void dispatch_message(Server *s,
- struct iovec *iovec, unsigned n, unsigned m,
- struct ucred *ucred,
- struct timeval *tv,
- const char *label, size_t label_len,
- const char *unit_id,
- int priority) {
+void server_dispatch_message(
+ Server *s,
+ struct iovec *iovec, unsigned n, unsigned m,
+ 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;
/* Write a suppression message if we suppressed something */
if (rl > 1)
- driver_message(s, SD_MESSAGE_JOURNAL_DROPPED, "Suppressed %u messages from %s", rl - 1, path);
+ server_driver_message(s, SD_MESSAGE_JOURNAL_DROPPED, "Suppressed %u messages from %s", rl - 1, path);
free(path);
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) {
- struct msghdr msghdr;
- struct cmsghdr *cmsg;
- union {
- struct cmsghdr cmsghdr;
- uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
- } control;
- union sockaddr_union sa;
-
- assert(s);
- assert(iovec);
- assert(n_iovec > 0);
-
- zero(msghdr);
- msghdr.msg_iov = (struct iovec*) iovec;
- msghdr.msg_iovlen = n_iovec;
-
- zero(sa);
- sa.un.sun_family = AF_UNIX;
- strncpy(sa.un.sun_path, "/run/systemd/journal/syslog", sizeof(sa.un.sun_path));
- msghdr.msg_name = &sa;
- msghdr.msg_namelen = offsetof(union sockaddr_union, un.sun_path) + strlen(sa.un.sun_path);
-
- if (ucred) {
- zero(control);
- msghdr.msg_control = &control;
- msghdr.msg_controllen = sizeof(control);
-
- cmsg = CMSG_FIRSTHDR(&msghdr);
- cmsg->cmsg_level = SOL_SOCKET;
- cmsg->cmsg_type = SCM_CREDENTIALS;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct ucred));
- memcpy(CMSG_DATA(cmsg), ucred, sizeof(struct ucred));
- msghdr.msg_controllen = cmsg->cmsg_len;
- }
-
- /* Forward the syslog message we received via /dev/log to
- * /run/systemd/syslog. Unfortunately we currently can't set
- * the SO_TIMESTAMP auxiliary data, and hence we don't. */
-
- if (sendmsg(s->syslog_fd, &msghdr, MSG_NOSIGNAL) >= 0)
- return;
-
- /* The socket is full? I guess the syslog implementation is
- * too slow, and we shouldn't wait for that... */
- if (errno == EAGAIN)
- return;
-
- if (ucred && errno == ESRCH) {
- struct ucred u;
-
- /* Hmm, presumably the sender process vanished
- * by now, so let's fix it as good as we
- * can, and retry */
-
- u = *ucred;
- u.pid = getpid();
- memcpy(CMSG_DATA(cmsg), &u, sizeof(struct ucred));
-
- if (sendmsg(s->syslog_fd, &msghdr, MSG_NOSIGNAL) >= 0)
- return;
-
- if (errno == EAGAIN)
- return;
- }
-
- if (errno != ENOENT)
- log_debug("Failed to forward syslog message: %m");
-}
-
-static void forward_syslog_raw(Server *s, int priority, const char *buffer, struct ucred *ucred, struct timeval *tv) {
- struct iovec iovec;
-
- assert(s);
- assert(buffer);
-
- if (LOG_PRI(priority) > s->max_level_syslog)
- return;
-
- IOVEC_SET_STRING(iovec, buffer);
- forward_syslog_iovec(s, &iovec, 1, ucred, tv);
-}
-
-static void forward_syslog(Server *s, int priority, const char *identifier, const char *message, struct ucred *ucred, struct timeval *tv) {
- struct iovec iovec[5];
- char header_priority[6], header_time[64], header_pid[16];
- int n = 0;
- time_t t;
- struct tm *tm;
- char *ident_buf = NULL;
-
- assert(s);
- assert(priority >= 0);
- assert(priority <= 999);
- assert(message);
-
- if (LOG_PRI(priority) > s->max_level_syslog)
- return;
-
- /* First: priority field */
- snprintf(header_priority, sizeof(header_priority), "<%i>", priority);
- char_array_0(header_priority);
- IOVEC_SET_STRING(iovec[n++], header_priority);
-
- /* Second: timestamp */
- t = tv ? tv->tv_sec : ((time_t) (now(CLOCK_REALTIME) / USEC_PER_SEC));
- tm = localtime(&t);
- if (!tm)
- return;
- if (strftime(header_time, sizeof(header_time), "%h %e %T ", tm) <= 0)
- return;
- IOVEC_SET_STRING(iovec[n++], header_time);
-
- /* Third: identifier and PID */
- if (ucred) {
- if (!identifier) {
- get_process_comm(ucred->pid, &ident_buf);
- identifier = ident_buf;
- }
-
- snprintf(header_pid, sizeof(header_pid), "[%lu]: ", (unsigned long) ucred->pid);
- char_array_0(header_pid);
-
- if (identifier)
- IOVEC_SET_STRING(iovec[n++], identifier);
-
- IOVEC_SET_STRING(iovec[n++], header_pid);
- } else if (identifier) {
- IOVEC_SET_STRING(iovec[n++], identifier);
- IOVEC_SET_STRING(iovec[n++], ": ");
- }
-
- /* Fourth: message */
- IOVEC_SET_STRING(iovec[n++], message);
-
- forward_syslog_iovec(s, iovec, n, ucred, tv);
-
- free(ident_buf);
-}
-
-static int fixup_priority(int priority) {
-
- if ((priority & LOG_FACMASK) == 0)
- return (priority & LOG_PRIMASK) | LOG_USER;
-
- return priority;
-}
-
-static void forward_kmsg(Server *s, int priority, const char *identifier, const char *message, struct ucred *ucred) {
- struct iovec iovec[5];
- char header_priority[6], header_pid[16];
- int n = 0;
- char *ident_buf = NULL;
-
- assert(s);
- assert(priority >= 0);
- assert(priority <= 999);
- assert(message);
-
- if (_unlikely_(LOG_PRI(priority) > s->max_level_kmsg))
- return;
-
- if (_unlikely_(s->dev_kmsg_fd < 0))
- return;
-
- /* Never allow messages with kernel facility to be written to
- * kmsg, regardless where the data comes from. */
- priority = fixup_priority(priority);
-
- /* First: priority field */
- snprintf(header_priority, sizeof(header_priority), "<%i>", priority);
- char_array_0(header_priority);
- IOVEC_SET_STRING(iovec[n++], header_priority);
-
- /* Second: identifier and PID */
- if (ucred) {
- if (!identifier) {
- get_process_comm(ucred->pid, &ident_buf);
- identifier = ident_buf;
- }
-
- snprintf(header_pid, sizeof(header_pid), "[%lu]: ", (unsigned long) ucred->pid);
- char_array_0(header_pid);
-
- if (identifier)
- IOVEC_SET_STRING(iovec[n++], identifier);
-
- IOVEC_SET_STRING(iovec[n++], header_pid);
- } else if (identifier) {
- IOVEC_SET_STRING(iovec[n++], identifier);
- IOVEC_SET_STRING(iovec[n++], ": ");
- }
-
- /* Fourth: message */
- IOVEC_SET_STRING(iovec[n++], message);
- IOVEC_SET_STRING(iovec[n++], "\n");
-
- if (writev(s->dev_kmsg_fd, iovec, n) < 0)
- log_debug("Failed to write to /dev/kmsg for logging: %s", strerror(errno));
-
- free(ident_buf);
-}
-
-static void forward_console(Server *s, int priority, const char *identifier, const char *message, struct ucred *ucred) {
+void server_forward_console(Server *s, int priority, const char *identifier, const char *message, struct ucred *ucred) {
struct iovec iovec[4];
char header_pid[16];
int n = 0, fd;
free(ident_buf);
}
-static void read_identifier(const char **buf, char **identifier, char **pid) {
- const char *p;
- char *t;
- size_t l, e;
-
- assert(buf);
- assert(identifier);
- assert(pid);
-
- p = *buf;
-
- p += strspn(p, WHITESPACE);
- l = strcspn(p, WHITESPACE);
-
- if (l <= 0 ||
- p[l-1] != ':')
- return;
-
- e = l;
- l--;
-
- if (p[l-1] == ']') {
- size_t k = l-1;
-
- for (;;) {
-
- if (p[k] == '[') {
- t = strndup(p+k+1, l-k-2);
- if (t)
- *pid = t;
-
- l = k;
- break;
- }
-
- if (k == 0)
- break;
-
- k--;
- }
- }
-
- t = strndup(p, l);
- if (t)
- *identifier = t;
-
- *buf = p + e;
- *buf += strspn(*buf, WHITESPACE);
-}
-
-static void process_syslog_message(Server *s, const char *buf, struct ucred *ucred, struct timeval *tv, const char *label, size_t label_len) {
- char *message = NULL, *syslog_priority = NULL, *syslog_facility = NULL, *syslog_identifier = NULL, *syslog_pid = NULL;
- struct iovec iovec[N_IOVEC_META_FIELDS + 6];
- unsigned n = 0;
- int priority = LOG_USER | LOG_INFO;
- char *identifier = NULL, *pid = NULL;
- const char *orig;
-
- assert(s);
- assert(buf);
-
- orig = buf;
- parse_syslog_priority((char**) &buf, &priority);
-
- if (s->forward_to_syslog)
- forward_syslog_raw(s, priority, orig, ucred, tv);
- skip_syslog_date((char**) &buf);
- read_identifier(&buf, &identifier, &pid);
-
- if (s->forward_to_kmsg)
- forward_kmsg(s, priority, identifier, buf, ucred);
-
- if (s->forward_to_console)
- forward_console(s, priority, identifier, buf, ucred);
-
- IOVEC_SET_STRING(iovec[n++], "_TRANSPORT=syslog");
-
- if (asprintf(&syslog_priority, "PRIORITY=%i", priority & LOG_PRIMASK) >= 0)
- IOVEC_SET_STRING(iovec[n++], syslog_priority);
-
- if (priority & LOG_FACMASK)
- if (asprintf(&syslog_facility, "SYSLOG_FACILITY=%i", LOG_FAC(priority)) >= 0)
- IOVEC_SET_STRING(iovec[n++], syslog_facility);
-
- if (identifier) {
- syslog_identifier = strappend("SYSLOG_IDENTIFIER=", identifier);
- if (syslog_identifier)
- IOVEC_SET_STRING(iovec[n++], syslog_identifier);
- }
-
- if (pid) {
- syslog_pid = strappend("SYSLOG_PID=", pid);
- if (syslog_pid)
- IOVEC_SET_STRING(iovec[n++], syslog_pid);
- }
-
- message = strappend("MESSAGE=", buf);
- if (message)
- IOVEC_SET_STRING(iovec[n++], message);
-
- dispatch_message(s, iovec, n, ELEMENTSOF(iovec), ucred, tv, label, label_len, NULL, priority);
-
- free(message);
- free(identifier);
- free(pid);
- free(syslog_priority);
- free(syslog_facility);
- free(syslog_identifier);
- free(syslog_pid);
-}
static bool valid_user_field(const char *p, size_t l) {
const char *a;
if (e == p) {
/* Entry separator */
- dispatch_message(s, iovec, n, m, ucred, tv, label, label_len, NULL, priority);
+ server_dispatch_message(s, iovec, n, m, ucred, tv, label, label_len, NULL, priority);
n = 0;
priority = LOG_INFO;
if (message) {
if (s->forward_to_syslog)
- forward_syslog(s, priority, identifier, message, ucred, tv);
+ server_forward_syslog(s, priority, identifier, message, ucred, tv);
if (s->forward_to_kmsg)
- forward_kmsg(s, priority, identifier, message, ucred);
+ server_forward_kmsg(s, priority, identifier, message, ucred);
if (s->forward_to_console)
- forward_console(s, priority, identifier, message, ucred);
+ server_forward_console(s, priority, identifier, message, ucred);
}
- dispatch_message(s, iovec, n, m, ucred, tv, label, label_len, NULL, priority);
+ server_dispatch_message(s, iovec, n, m, ucred, tv, label, label_len, NULL, priority);
finish:
for (j = 0; j < n; j++) {
priority = s->priority;
if (s->level_prefix)
- parse_syslog_priority((char**) &p, &priority);
+ syslog_parse_priority((char**) &p, &priority);
if (s->forward_to_syslog || s->server->forward_to_syslog)
- forward_syslog(s->server, fixup_priority(priority), s->identifier, p, &s->ucred, NULL);
+ server_forward_syslog(s->server, syslog_fixup_facility(priority), s->identifier, p, &s->ucred, NULL);
if (s->forward_to_kmsg || s->server->forward_to_kmsg)
- forward_kmsg(s->server, priority, s->identifier, p, &s->ucred);
+ server_forward_kmsg(s->server, priority, s->identifier, p, &s->ucred);
if (s->forward_to_console || s->server->forward_to_console)
- forward_console(s->server, priority, s->identifier, p, &s->ucred);
+ server_forward_console(s->server, priority, s->identifier, p, &s->ucred);
IOVEC_SET_STRING(iovec[n++], "_TRANSPORT=stdout");
}
#endif
- dispatch_message(s->server, iovec, n, ELEMENTSOF(iovec), &s->ucred, NULL, label, label_len, s->unit_id, priority);
+ server_dispatch_message(s->server, iovec, n, ELEMENTSOF(iovec), &s->ucred, NULL, label, label_len, s->unit_id, priority);
free(message);
free(syslog_priority);
return r;
}
-static bool is_us(const char *pid) {
- pid_t t;
-
- assert(pid);
-
- if (parse_pid(pid, &t) < 0)
- return false;
-
- return t == getpid();
-}
-
-static void dev_kmsg_record(Server *s, char *p, size_t l) {
- struct iovec iovec[N_IOVEC_META_FIELDS + 7 + N_IOVEC_KERNEL_FIELDS + 2 + N_IOVEC_UDEV_FIELDS];
- char *message = NULL, *syslog_priority = NULL, *syslog_pid = NULL, *syslog_facility = NULL, *syslog_identifier = NULL, *source_time = NULL;
- int priority, r;
- unsigned n = 0, z = 0, j;
- usec_t usec;
- char *identifier = NULL, *pid = NULL, *e, *f, *k;
- uint64_t serial;
- size_t pl;
- char *kernel_device = NULL;
-
- assert(s);
- assert(p);
-
- if (l <= 0)
- return;
-
- e = memchr(p, ',', l);
- if (!e)
- return;
- *e = 0;
-
- r = safe_atoi(p, &priority);
- if (r < 0 || priority < 0 || priority > 999)
- return;
-
- if (s->forward_to_kmsg && (priority & LOG_FACMASK) != LOG_KERN)
- return;
-
- l -= (e - p) + 1;
- p = e + 1;
- e = memchr(p, ',', l);
- if (!e)
- return;
- *e = 0;
-
- r = safe_atou64(p, &serial);
- if (r < 0)
- return;
-
- if (s->kernel_seqnum) {
- /* We already read this one? */
- if (serial < *s->kernel_seqnum)
- return;
-
- /* Did we lose any? */
- if (serial > *s->kernel_seqnum)
- driver_message(s, SD_MESSAGE_JOURNAL_MISSED, "Missed %llu kernel messages", (unsigned long long) serial - *s->kernel_seqnum - 1);
-
- /* Make sure we never read this one again. Note that
- * we always store the next message serial we expect
- * here, simply because this makes handling the first
- * message with serial 0 easy. */
- *s->kernel_seqnum = serial + 1;
- }
-
- l -= (e - p) + 1;
- p = e + 1;
- f = memchr(p, ';', l);
- if (!f)
- return;
- /* Kernel 3.6 has the flags field, kernel 3.5 lacks that */
- e = memchr(p, ',', l);
- if (!e || f < e)
- e = f;
- *e = 0;
-
- r = parse_usec(p, &usec);
- if (r < 0)
- return;
-
- l -= (f - p) + 1;
- p = f + 1;
- e = memchr(p, '\n', l);
- if (!e)
- return;
- *e = 0;
-
- pl = e - p;
- l -= (e - p) + 1;
- k = e + 1;
-
- for (j = 0; l > 0 && j < N_IOVEC_KERNEL_FIELDS; j++) {
- char *m;
- /* Meta data fields attached */
-
- if (*k != ' ')
- break;
-
- k ++, l --;
-
- e = memchr(k, '\n', l);
- if (!e)
- return;
-
- *e = 0;
-
- m = cunescape_length_with_prefix(k, e - k, "_KERNEL_");
- if (!m)
- break;
-
- if (startswith(m, "_KERNEL_DEVICE="))
- kernel_device = m + 15;
-
- IOVEC_SET_STRING(iovec[n++], m);
- z++;
-
- l -= (e - k) + 1;
- k = e + 1;
- }
-
- if (kernel_device) {
- struct udev_device *ud;
-
- ud = udev_device_new_from_device_id(s->udev, kernel_device);
- if (ud) {
- const char *g;
- struct udev_list_entry *ll;
- char *b;
-
- g = udev_device_get_devnode(ud);
- if (g) {
- b = strappend("_UDEV_DEVNODE=", g);
- if (b) {
- IOVEC_SET_STRING(iovec[n++], b);
- z++;
- }
- }
-
- g = udev_device_get_sysname(ud);
- if (g) {
- b = strappend("_UDEV_SYSNAME=", g);
- if (b) {
- IOVEC_SET_STRING(iovec[n++], b);
- z++;
- }
- }
-
- j = 0;
- ll = udev_device_get_devlinks_list_entry(ud);
- udev_list_entry_foreach(ll, ll) {
-
- if (j > N_IOVEC_UDEV_FIELDS)
- break;
-
- g = udev_list_entry_get_name(ll);
- b = strappend("_UDEV_DEVLINK=", g);
- if (g) {
- IOVEC_SET_STRING(iovec[n++], b);
- z++;
- }
-
- j++;
- }
-
- udev_device_unref(ud);
- }
- }
-
- if (asprintf(&source_time, "_SOURCE_MONOTONIC_TIMESTAMP=%llu",
- (unsigned long long) usec) >= 0)
- IOVEC_SET_STRING(iovec[n++], source_time);
-
- IOVEC_SET_STRING(iovec[n++], "_TRANSPORT=kernel");
-
- if (asprintf(&syslog_priority, "PRIORITY=%i", priority & LOG_PRIMASK) >= 0)
- IOVEC_SET_STRING(iovec[n++], syslog_priority);
-
- if ((priority & LOG_FACMASK) == LOG_KERN)
- IOVEC_SET_STRING(iovec[n++], "SYSLOG_IDENTIFIER=kernel");
- else {
- read_identifier((const char**) &p, &identifier, &pid);
-
- /* Avoid any messages we generated ourselves via
- * log_info() and friends. */
- if (pid && is_us(pid))
- goto finish;
-
- if (identifier) {
- syslog_identifier = strappend("SYSLOG_IDENTIFIER=", identifier);
- if (syslog_identifier)
- IOVEC_SET_STRING(iovec[n++], syslog_identifier);
- }
-
- if (pid) {
- syslog_pid = strappend("SYSLOG_PID=", pid);
- if (syslog_pid)
- IOVEC_SET_STRING(iovec[n++], syslog_pid);
- }
-
- if (asprintf(&syslog_facility, "SYSLOG_FACILITY=%i", LOG_FAC(priority)) >= 0)
- IOVEC_SET_STRING(iovec[n++], syslog_facility);
- }
-
- message = cunescape_length_with_prefix(p, pl, "MESSAGE=");
- if (message)
- IOVEC_SET_STRING(iovec[n++], message);
-
- dispatch_message(s, iovec, n, ELEMENTSOF(iovec), NULL, NULL, NULL, 0, NULL, priority);
-
-finish:
- for (j = 0; j < z; j++)
- free(iovec[j].iov_base);
-
- free(message);
- free(syslog_priority);
- free(syslog_identifier);
- free(syslog_pid);
- free(syslog_facility);
- free(source_time);
- free(identifier);
- free(pid);
-}
-
static int system_journal_open(Server *s) {
int r;
char *fn;
return r;
}
-static int server_read_dev_kmsg(Server *s) {
- char buffer[8192+1]; /* the kernel-side limit per record is 8K currently */
- ssize_t l;
-
- assert(s);
- assert(s->dev_kmsg_fd >= 0);
-
- l = read(s->dev_kmsg_fd, buffer, sizeof(buffer) - 1);
- if (l == 0)
- return 0;
- if (l < 0) {
- /* Old kernels who don't allow reading from /dev/kmsg
- * return EINVAL when we try. So handle this cleanly,
- * but don' try to ever read from it again. */
- if (errno == EINVAL) {
- epoll_ctl(s->epoll_fd, EPOLL_CTL_DEL, s->dev_kmsg_fd, NULL);
- return 0;
- }
-
- if (errno == EAGAIN || errno == EINTR || errno == EPIPE)
- return 0;
-
- log_error("Failed to read from kernel: %m");
- return -errno;
- }
-
- dev_kmsg_record(s, buffer, l);
- return 1;
-}
-
-static int server_flush_dev_kmsg(Server *s) {
- int r;
-
- assert(s);
-
- if (s->dev_kmsg_fd < 0)
- return 0;
-
- if (!s->dev_kmsg_readable)
- return 0;
-
- log_info("Flushing /dev/kmsg...");
-
- for (;;) {
- r = server_read_dev_kmsg(s);
- if (r < 0)
- return r;
-
- if (r == 0)
- break;
- }
-
- return 0;
-}
-
static int process_event(Server *s, struct epoll_event *ev) {
assert(s);
assert(ev);
else
s->buffer[n] = 0;
- process_syslog_message(s, strstrip(s->buffer), ucred, tv, label, label_len);
+ server_process_syslog_message(s, strstrip(s->buffer), ucred, tv, label, label_len);
} else if (n_fds > 0)
log_warning("Got file descriptors via syslog socket. Ignoring.");
return 0;
}
-static int open_syslog_socket(Server *s) {
- union sockaddr_union sa;
- int one, r;
- struct epoll_event ev;
-
- assert(s);
-
- if (s->syslog_fd < 0) {
-
- s->syslog_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
- if (s->syslog_fd < 0) {
- log_error("socket() failed: %m");
- return -errno;
- }
-
- zero(sa);
- sa.un.sun_family = AF_UNIX;
- strncpy(sa.un.sun_path, "/dev/log", sizeof(sa.un.sun_path));
-
- unlink(sa.un.sun_path);
-
- r = bind(s->syslog_fd, &sa.sa, offsetof(union sockaddr_union, un.sun_path) + strlen(sa.un.sun_path));
- if (r < 0) {
- log_error("bind() failed: %m");
- return -errno;
- }
-
- chmod(sa.un.sun_path, 0666);
- } else
- fd_nonblock(s->syslog_fd, 1);
-
- one = 1;
- r = setsockopt(s->syslog_fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one));
- if (r < 0) {
- log_error("SO_PASSCRED failed: %m");
- return -errno;
- }
-
-#ifdef HAVE_SELINUX
- one = 1;
- r = setsockopt(s->syslog_fd, SOL_SOCKET, SO_PASSSEC, &one, sizeof(one));
- if (r < 0)
- log_warning("SO_PASSSEC failed: %m");
-#endif
-
- one = 1;
- r = setsockopt(s->syslog_fd, SOL_SOCKET, SO_TIMESTAMP, &one, sizeof(one));
- if (r < 0) {
- log_error("SO_TIMESTAMP failed: %m");
- return -errno;
- }
-
- zero(ev);
- ev.events = EPOLLIN;
- ev.data.fd = s->syslog_fd;
- if (epoll_ctl(s->epoll_fd, EPOLL_CTL_ADD, s->syslog_fd, &ev) < 0) {
- log_error("Failed to add syslog server fd to epoll object: %m");
- return -errno;
- }
-
- return 0;
-}
static int open_native_socket(Server*s) {
union sockaddr_union sa;
return 0;
}
-static int open_dev_kmsg(Server *s) {
- struct epoll_event ev;
-
- assert(s);
-
- s->dev_kmsg_fd = open("/dev/kmsg", O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY);
- if (s->dev_kmsg_fd < 0) {
- log_warning("Failed to open /dev/kmsg, ignoring: %m");
- return 0;
- }
-
- zero(ev);
- ev.events = EPOLLIN;
- ev.data.fd = s->dev_kmsg_fd;
- if (epoll_ctl(s->epoll_fd, EPOLL_CTL_ADD, s->dev_kmsg_fd, &ev) < 0) {
-
- /* This will fail with EPERM on older kernels where
- * /dev/kmsg is not readable. */
- if (errno == EPERM)
- return 0;
-
- log_error("Failed to add /dev/kmsg fd to epoll object: %m");
- return -errno;
- }
-
- s->dev_kmsg_readable = true;
-
- return 0;
-}
-
-static int open_kernel_seqnum(Server *s) {
- int fd;
- uint64_t *p;
-
- assert(s);
-
- /* We store the seqnum we last read in an mmaped file. That
- * way we can just use it like a variable, but it is
- * persistant and automatically flushed at reboot. */
-
- fd = open("/run/systemd/journal/kernel-seqnum", O_RDWR|O_CREAT|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW, 0644);
- if (fd < 0) {
- log_error("Failed to open /run/systemd/journal/kernel-seqnum, ignoring: %m");
- return 0;
- }
-
- if (posix_fallocate(fd, 0, sizeof(uint64_t)) < 0) {
- log_error("Failed to allocate sequential number file, ignoring: %m");
- close_nointr_nofail(fd);
- return 0;
- }
-
- p = mmap(NULL, sizeof(uint64_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
- if (p == MAP_FAILED) {
- log_error("Failed to map sequential number file, ignoring: %m");
- close_nointr_nofail(fd);
- return 0;
- }
-
- close_nointr_nofail(fd);
- s->kernel_seqnum = p;
-
- return 0;
-}
-
static int open_signalfd(Server *s) {
sigset_t mask;
struct epoll_event ev;
}
}
- r = open_syslog_socket(s);
+ r = server_open_syslog_socket(s);
if (r < 0)
return r;
if (r < 0)
return r;
- r = open_dev_kmsg(s);
+ r = server_open_dev_kmsg(s);
if (r < 0)
return r;
- r = open_kernel_seqnum(s);
+ r = server_open_kernel_seqnum(s);
if (r < 0)
return r;
server_flush_dev_kmsg(&server);
log_debug("systemd-journald running as pid %lu", (unsigned long) getpid());
- driver_message(&server, SD_MESSAGE_JOURNAL_START, "Journal started");
+ server_driver_message(&server, SD_MESSAGE_JOURNAL_START, "Journal started");
sd_notify(false,
"READY=1\n"
}
log_debug("systemd-journald stopped as pid %lu", (unsigned long) getpid());
- driver_message(&server, SD_MESSAGE_JOURNAL_STOP, "Journal stopped");
+ server_driver_message(&server, SD_MESSAGE_JOURNAL_STOP, "Journal stopped");
finish:
sd_notify(false,