- s->buffer[n] = 0;
-
- process_syslog_message(s, strstrip(s->buffer), ucred, tv);
- } else
- process_native_message(s, s->buffer, n, ucred, tv);
- }
-
- return 1;
- }
-
- log_error("Unknown event.");
- return 0;
-}
-
-static int system_journal_open(Server *s) {
- int r;
- char *fn;
- sd_id128_t machine;
- char ids[33];
-
- r = sd_id128_get_machine(&machine);
- if (r < 0)
- return r;
-
- /* First try to create the machine path, but not the prefix */
- fn = strappend("/var/log/journal/", sd_id128_to_string(machine, ids));
- if (!fn)
- return -ENOMEM;
- (void) mkdir(fn, 0755);
- free(fn);
-
- /* The create the system journal file */
- fn = join("/var/log/journal/", ids, "/system.journal", NULL);
- if (!fn)
- return -ENOMEM;
-
- r = journal_file_open(fn, O_RDWR|O_CREAT, 0640, NULL, &s->system_journal);
- free(fn);
-
- if (r >= 0) {
- fix_perms(s->system_journal, 0);
- return r;
- }
-
- if (r < 0 && r != -ENOENT) {
- log_error("Failed to open system journal: %s", strerror(-r));
- return r;
- }
-
- /* /var didn't work, so try /run, but this time we
- * create the prefix too */
- fn = join("/run/log/journal/", ids, "/system.journal", NULL);
- if (!fn)
- return -ENOMEM;
-
- (void) mkdir_parents(fn, 0755);
- r = journal_file_open(fn, O_RDWR|O_CREAT, 0640, NULL, &s->runtime_journal);
- free(fn);
-
- if (r < 0) {
- log_error("Failed to open runtime journal: %s", strerror(-r));
- return r;
- }
-
- fix_perms(s->runtime_journal, 0);
- return r;
-}
-
-static int open_syslog_socket(Server *s) {
- union sockaddr_union sa;
- int one, r;
-
- assert(s);
-
- if (s->syslog_fd < 0) {
-
- s->syslog_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 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, "/run/systemd/syslog", 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);
- }
-
- 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;
- }
-
- 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;
- }
-
- return 0;
-}
-
-static int open_native_socket(Server*s) {
- union sockaddr_union sa;
- int one, r;
-
- assert(s);
-
- if (s->native_fd < 0) {
-
- s->native_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0);
- if (s->native_fd < 0) {
- log_error("socket() failed: %m");
- return -errno;
- }
-
- zero(sa);
- sa.un.sun_family = AF_UNIX;
- strncpy(sa.un.sun_path, "/run/systemd/journal", sizeof(sa.un.sun_path));
-
- unlink(sa.un.sun_path);
-
- r = bind(s->native_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);
- }
-
- one = 1;
- r = setsockopt(s->native_fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one));
- if (r < 0) {
- log_error("SO_PASSCRED failed: %m");
- return -errno;
- }
-
- one = 1;
- r = setsockopt(s->native_fd, SOL_SOCKET, SO_TIMESTAMP, &one, sizeof(one));
- if (r < 0) {
- log_error("SO_TIMESTAMP failed: %m");
- return -errno;
- }
-
- return 0;
-}
-
-static int server_init(Server *s) {
- int n, r, fd;
- struct epoll_event ev;
- sigset_t mask;
-
- assert(s);
-
- zero(*s);
- s->syslog_fd = s->native_fd = s->signal_fd = -1;
-
- s->epoll_fd = epoll_create1(EPOLL_CLOEXEC);
- if (s->epoll_fd < 0) {
- log_error("Failed to create epoll object: %m");
- return -errno;
- }
-
- n = sd_listen_fds(true);
- if (n < 0) {
- log_error("Failed to read listening file descriptors from environment: %s", strerror(-n));
- return n;
- }
-
- for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd++) {
-
- if (sd_is_socket_unix(fd, SOCK_DGRAM, -1, "/dev/log", 0) > 0) {
-
- if (s->syslog_fd >= 0) {
- log_error("Too many /dev/log sockets passed.");
- return -EINVAL;
- }
-
- s->syslog_fd = fd;
-
- } else if (sd_is_socket(fd, AF_UNIX, SOCK_DGRAM, -1) > 0) {
-
- if (s->native_fd >= 0) {
- log_error("Too many native sockets passed.");
- return -EINVAL;