chiark / gitweb /
ae1fbc4bd451952aa5660d58774be7f632de9a52
[elogind.git] / src / journal / journald.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2011 Lennart Poettering
7
8   systemd is free software; you can redistribute it and/or modify it
9   under the terms of the GNU Lesser General Public License as published by
10   the Free Software Foundation; either version 2.1 of the License, or
11   (at your option) any later version.
12
13   systemd is distributed in the hope that it will be useful, but
14   WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16   Lesser General Public License for more details.
17
18   You should have received a copy of the GNU Lesser General Public License
19   along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include <sys/epoll.h>
23 #include <sys/socket.h>
24 #include <errno.h>
25 #include <sys/signalfd.h>
26 #include <unistd.h>
27 #include <fcntl.h>
28 #include <stddef.h>
29 #include <sys/ioctl.h>
30 #include <linux/sockios.h>
31 #include <sys/statvfs.h>
32
33 #include <systemd/sd-journal.h>
34 #include <systemd/sd-messages.h>
35 #include <systemd/sd-daemon.h>
36
37 #ifdef HAVE_LOGIND
38 #include <systemd/sd-login.h>
39 #endif
40
41 #include "mkdir.h"
42 #include "hashmap.h"
43 #include "journal-file.h"
44 #include "socket-util.h"
45 #include "cgroup-util.h"
46 #include "list.h"
47 #include "journal-rate-limit.h"
48 #include "journal-internal.h"
49 #include "conf-parser.h"
50 #include "journald.h"
51 #include "virt.h"
52 #include "missing.h"
53
54 #ifdef HAVE_ACL
55 #include <sys/acl.h>
56 #include <acl/libacl.h>
57 #include "acl-util.h"
58 #endif
59
60 #ifdef HAVE_SELINUX
61 #include <selinux/selinux.h>
62 #endif
63
64 #define USER_JOURNALS_MAX 1024
65 #define STDOUT_STREAMS_MAX 4096
66
67 #define DEFAULT_RATE_LIMIT_INTERVAL (10*USEC_PER_SEC)
68 #define DEFAULT_RATE_LIMIT_BURST 200
69
70 #define RECHECK_AVAILABLE_SPACE_USEC (30*USEC_PER_SEC)
71
72 #define N_IOVEC_META_FIELDS 17
73
74 #define ENTRY_SIZE_MAX (1024*1024*32)
75
76 typedef enum StdoutStreamState {
77         STDOUT_STREAM_IDENTIFIER,
78         STDOUT_STREAM_UNIT_ID,
79         STDOUT_STREAM_PRIORITY,
80         STDOUT_STREAM_LEVEL_PREFIX,
81         STDOUT_STREAM_FORWARD_TO_SYSLOG,
82         STDOUT_STREAM_FORWARD_TO_KMSG,
83         STDOUT_STREAM_FORWARD_TO_CONSOLE,
84         STDOUT_STREAM_RUNNING
85 } StdoutStreamState;
86
87 struct StdoutStream {
88         Server *server;
89         StdoutStreamState state;
90
91         int fd;
92
93         struct ucred ucred;
94 #ifdef HAVE_SELINUX
95         security_context_t security_context;
96 #endif
97
98         char *identifier;
99         char *unit_id;
100         int priority;
101         bool level_prefix:1;
102         bool forward_to_syslog:1;
103         bool forward_to_kmsg:1;
104         bool forward_to_console:1;
105
106         char buffer[LINE_MAX+1];
107         size_t length;
108
109         LIST_FIELDS(StdoutStream, stdout_stream);
110 };
111
112 static const char* const storage_table[] = {
113         [STORAGE_AUTO] = "auto",
114         [STORAGE_VOLATILE] = "volatile",
115         [STORAGE_PERSISTENT] = "persistent",
116         [STORAGE_NONE] = "none"
117 };
118
119 DEFINE_STRING_TABLE_LOOKUP(storage, Storage);
120 DEFINE_CONFIG_PARSE_ENUM(config_parse_storage, storage, Storage, "Failed to parse storage setting");
121
122 static uint64_t available_space(Server *s) {
123         char ids[33], *p;
124         const char *f;
125         sd_id128_t machine;
126         struct statvfs ss;
127         uint64_t sum = 0, avail = 0, ss_avail = 0;
128         int r;
129         DIR *d;
130         usec_t ts;
131         JournalMetrics *m;
132
133         ts = now(CLOCK_MONOTONIC);
134
135         if (s->cached_available_space_timestamp + RECHECK_AVAILABLE_SPACE_USEC > ts)
136                 return s->cached_available_space;
137
138         r = sd_id128_get_machine(&machine);
139         if (r < 0)
140                 return 0;
141
142         if (s->system_journal) {
143                 f = "/var/log/journal/";
144                 m = &s->system_metrics;
145         } else {
146                 f = "/run/log/journal/";
147                 m = &s->runtime_metrics;
148         }
149
150         assert(m);
151
152         p = strappend(f, sd_id128_to_string(machine, ids));
153         if (!p)
154                 return 0;
155
156         d = opendir(p);
157         free(p);
158
159         if (!d)
160                 return 0;
161
162         if (fstatvfs(dirfd(d), &ss) < 0)
163                 goto finish;
164
165         for (;;) {
166                 struct stat st;
167                 struct dirent buf, *de;
168
169                 r = readdir_r(d, &buf, &de);
170                 if (r != 0)
171                         break;
172
173                 if (!de)
174                         break;
175
176                 if (!endswith(de->d_name, ".journal") &&
177                     !endswith(de->d_name, ".journal~"))
178                         continue;
179
180                 if (fstatat(dirfd(d), de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0)
181                         continue;
182
183                 if (!S_ISREG(st.st_mode))
184                         continue;
185
186                 sum += (uint64_t) st.st_blocks * 512UL;
187         }
188
189         avail = sum >= m->max_use ? 0 : m->max_use - sum;
190
191         ss_avail = ss.f_bsize * ss.f_bavail;
192
193         ss_avail = ss_avail < m->keep_free ? 0 : ss_avail - m->keep_free;
194
195         if (ss_avail < avail)
196                 avail = ss_avail;
197
198         s->cached_available_space = avail;
199         s->cached_available_space_timestamp = ts;
200
201 finish:
202         closedir(d);
203
204         return avail;
205 }
206
207 static void server_read_file_gid(Server *s) {
208         const char *adm = "adm";
209         int r;
210
211         assert(s);
212
213         if (s->file_gid_valid)
214                 return;
215
216         r = get_group_creds(&adm, &s->file_gid);
217         if (r < 0)
218                 log_warning("Failed to resolve 'adm' group: %s", strerror(-r));
219
220         /* if we couldn't read the gid, then it will be 0, but that's
221          * fine and we shouldn't try to resolve the group again, so
222          * let's just pretend it worked right-away. */
223         s->file_gid_valid = true;
224 }
225
226 static void server_fix_perms(Server *s, JournalFile *f, uid_t uid) {
227         int r;
228 #ifdef HAVE_ACL
229         acl_t acl;
230         acl_entry_t entry;
231         acl_permset_t permset;
232 #endif
233
234         assert(f);
235
236         server_read_file_gid(s);
237
238         r = fchmod_and_fchown(f->fd, 0640, 0, s->file_gid);
239         if (r < 0)
240                 log_warning("Failed to fix access mode/rights on %s, ignoring: %s", f->path, strerror(-r));
241
242 #ifdef HAVE_ACL
243         if (uid <= 0)
244                 return;
245
246         acl = acl_get_fd(f->fd);
247         if (!acl) {
248                 log_warning("Failed to read ACL on %s, ignoring: %m", f->path);
249                 return;
250         }
251
252         r = acl_find_uid(acl, uid, &entry);
253         if (r <= 0) {
254
255                 if (acl_create_entry(&acl, &entry) < 0 ||
256                     acl_set_tag_type(entry, ACL_USER) < 0 ||
257                     acl_set_qualifier(entry, &uid) < 0) {
258                         log_warning("Failed to patch ACL on %s, ignoring: %m", f->path);
259                         goto finish;
260                 }
261         }
262
263         if (acl_get_permset(entry, &permset) < 0 ||
264             acl_add_perm(permset, ACL_READ) < 0 ||
265             acl_calc_mask(&acl) < 0) {
266                 log_warning("Failed to patch ACL on %s, ignoring: %m", f->path);
267                 goto finish;
268         }
269
270         if (acl_set_fd(f->fd, acl) < 0)
271                 log_warning("Failed to set ACL on %s, ignoring: %m", f->path);
272
273 finish:
274         acl_free(acl);
275 #endif
276 }
277
278 static JournalFile* find_journal(Server *s, uid_t uid) {
279         char *p;
280         int r;
281         JournalFile *f;
282         char ids[33];
283         sd_id128_t machine;
284
285         assert(s);
286
287         /* We split up user logs only on /var, not on /run. If the
288          * runtime file is open, we write to it exclusively, in order
289          * to guarantee proper order as soon as we flush /run to
290          * /var and close the runtime file. */
291
292         if (s->runtime_journal)
293                 return s->runtime_journal;
294
295         if (uid <= 0)
296                 return s->system_journal;
297
298         r = sd_id128_get_machine(&machine);
299         if (r < 0)
300                 return s->system_journal;
301
302         f = hashmap_get(s->user_journals, UINT32_TO_PTR(uid));
303         if (f)
304                 return f;
305
306         if (asprintf(&p, "/var/log/journal/%s/user-%lu.journal", sd_id128_to_string(machine, ids), (unsigned long) uid) < 0)
307                 return s->system_journal;
308
309         while (hashmap_size(s->user_journals) >= USER_JOURNALS_MAX) {
310                 /* Too many open? Then let's close one */
311                 f = hashmap_steal_first(s->user_journals);
312                 assert(f);
313                 journal_file_close(f);
314         }
315
316         r = journal_file_open_reliably(p, O_RDWR|O_CREAT, 0640, &s->system_metrics, s->system_journal, &f);
317         free(p);
318
319         if (r < 0)
320                 return s->system_journal;
321
322         server_fix_perms(s, f, uid);
323
324         r = hashmap_put(s->user_journals, UINT32_TO_PTR(uid), f);
325         if (r < 0) {
326                 journal_file_close(f);
327                 return s->system_journal;
328         }
329
330         return f;
331 }
332
333 static void server_rotate(Server *s) {
334         JournalFile *f;
335         void *k;
336         Iterator i;
337         int r;
338
339         log_info("Rotating...");
340
341         if (s->runtime_journal) {
342                 r = journal_file_rotate(&s->runtime_journal);
343                 if (r < 0)
344                         if (s->runtime_journal)
345                                 log_error("Failed to rotate %s: %s", s->runtime_journal->path, strerror(-r));
346                         else
347                                 log_error("Failed to create new runtime journal: %s", strerror(-r));
348                 else
349                         server_fix_perms(s, s->runtime_journal, 0);
350         }
351
352         if (s->system_journal) {
353                 r = journal_file_rotate(&s->system_journal);
354                 if (r < 0)
355                         if (s->system_journal)
356                                 log_error("Failed to rotate %s: %s", s->system_journal->path, strerror(-r));
357                         else
358                                 log_error("Failed to create new system journal: %s", strerror(-r));
359
360                 else
361                         server_fix_perms(s, s->system_journal, 0);
362         }
363
364         HASHMAP_FOREACH_KEY(f, k, s->user_journals, i) {
365                 r = journal_file_rotate(&f);
366                 if (r < 0)
367                         if (f->path)
368                                 log_error("Failed to rotate %s: %s", f->path, strerror(-r));
369                         else
370                                 log_error("Failed to create user journal: %s", strerror(-r));
371                 else {
372                         hashmap_replace(s->user_journals, k, f);
373                         server_fix_perms(s, s->system_journal, PTR_TO_UINT32(k));
374                 }
375         }
376 }
377
378 static void server_vacuum(Server *s) {
379         char *p;
380         char ids[33];
381         sd_id128_t machine;
382         int r;
383
384         log_info("Vacuuming...");
385
386         r = sd_id128_get_machine(&machine);
387         if (r < 0) {
388                 log_error("Failed to get machine ID: %s", strerror(-r));
389                 return;
390         }
391
392         sd_id128_to_string(machine, ids);
393
394         if (s->system_journal) {
395                 if (asprintf(&p, "/var/log/journal/%s", ids) < 0) {
396                         log_error("Out of memory.");
397                         return;
398                 }
399
400                 r = journal_directory_vacuum(p, s->system_metrics.max_use, s->system_metrics.keep_free);
401                 if (r < 0 && r != -ENOENT)
402                         log_error("Failed to vacuum %s: %s", p, strerror(-r));
403                 free(p);
404         }
405
406         if (s->runtime_journal) {
407                 if (asprintf(&p, "/run/log/journal/%s", ids) < 0) {
408                         log_error("Out of memory.");
409                         return;
410                 }
411
412                 r = journal_directory_vacuum(p, s->runtime_metrics.max_use, s->runtime_metrics.keep_free);
413                 if (r < 0 && r != -ENOENT)
414                         log_error("Failed to vacuum %s: %s", p, strerror(-r));
415                 free(p);
416         }
417
418         s->cached_available_space_timestamp = 0;
419 }
420
421 static char *shortened_cgroup_path(pid_t pid) {
422         int r;
423         char *process_path, *init_path, *path;
424
425         assert(pid > 0);
426
427         r = cg_get_by_pid(SYSTEMD_CGROUP_CONTROLLER, pid, &process_path);
428         if (r < 0)
429                 return NULL;
430
431         r = cg_get_by_pid(SYSTEMD_CGROUP_CONTROLLER, 1, &init_path);
432         if (r < 0) {
433                 free(process_path);
434                 return NULL;
435         }
436
437         if (endswith(init_path, "/system"))
438                 init_path[strlen(init_path) - 7] = 0;
439         else if (streq(init_path, "/"))
440                 init_path[0] = 0;
441
442         if (startswith(process_path, init_path)) {
443                 char *p;
444
445                 p = strdup(process_path + strlen(init_path));
446                 if (!p) {
447                         free(process_path);
448                         free(init_path);
449                         return NULL;
450                 }
451                 path = p;
452         } else {
453                 path = process_path;
454                 process_path = NULL;
455         }
456
457         free(process_path);
458         free(init_path);
459
460         return path;
461 }
462
463 static void write_to_journal(Server *s, uid_t uid, struct iovec *iovec, unsigned n) {
464         JournalFile *f;
465         bool vacuumed = false;
466         int r;
467
468         assert(s);
469         assert(iovec);
470         assert(n > 0);
471
472         f = find_journal(s, uid);
473         if (!f)
474                 return;
475
476         if (journal_file_rotate_suggested(f)) {
477                 log_info("Journal header limits reached or header out-of-date, rotating.");
478                 server_rotate(s);
479                 server_vacuum(s);
480                 vacuumed = true;
481
482                 f = find_journal(s, uid);
483                 if (!f)
484                         return;
485         }
486
487         for (;;) {
488                 r = journal_file_append_entry(f, NULL, iovec, n, &s->seqnum, NULL, NULL);
489                 if (r >= 0)
490                         return;
491
492                 if (vacuumed ||
493                     (r != -E2BIG && /* hit limit */
494                      r != -EFBIG && /* hit fs limit */
495                      r != -EDQUOT && /* quota hit */
496                      r != -ENOSPC && /* disk full */
497                      r != -EBADMSG && /* corrupted */
498                      r != -ENODATA && /* truncated */
499                      r != -EHOSTDOWN && /* other machine */
500                      r != -EPROTONOSUPPORT && /* unsupported feature */
501                      r != -EBUSY && /* unclean shutdown */
502                      r != -ESHUTDOWN /* already archived */)) {
503                         log_error("Failed to write entry, ignoring: %s", strerror(-r));
504                         return;
505                 }
506
507                 if (r == -E2BIG || r == -EFBIG || r == EDQUOT || r == ENOSPC)
508                         log_info("Allocation limit reached, rotating.");
509                 else if (r == -EHOSTDOWN)
510                         log_info("Journal file from other machine, rotating.");
511                 else if (r == -EBUSY)
512                         log_info("Unlcean shutdown, rotating.");
513                 else
514                         log_warning("Journal file corrupted, rotating.");
515
516                 server_rotate(s);
517                 server_vacuum(s);
518                 vacuumed = true;
519
520                 f = find_journal(s, uid);
521                 if (!f)
522                         return;
523
524                 log_info("Retrying write.");
525         }
526 }
527
528 static void dispatch_message_real(
529                 Server *s,
530                 struct iovec *iovec, unsigned n, unsigned m,
531                 struct ucred *ucred,
532                 struct timeval *tv,
533                 const char *label, size_t label_len,
534                 const char *unit_id) {
535
536         char *pid = NULL, *uid = NULL, *gid = NULL,
537                 *source_time = NULL, *boot_id = NULL, *machine_id = NULL,
538                 *comm = NULL, *cmdline = NULL, *hostname = NULL,
539                 *audit_session = NULL, *audit_loginuid = NULL,
540                 *exe = NULL, *cgroup = NULL, *session = NULL,
541                 *owner_uid = NULL, *unit = NULL, *selinux_context = NULL;
542
543         char idbuf[33];
544         sd_id128_t id;
545         int r;
546         char *t;
547         uid_t loginuid = 0, realuid = 0;
548
549         assert(s);
550         assert(iovec);
551         assert(n > 0);
552         assert(n + N_IOVEC_META_FIELDS <= m);
553
554         if (ucred) {
555                 uint32_t audit;
556 #ifdef HAVE_LOGIND
557                 uid_t owner;
558 #endif
559
560                 realuid = ucred->uid;
561
562                 if (asprintf(&pid, "_PID=%lu", (unsigned long) ucred->pid) >= 0)
563                         IOVEC_SET_STRING(iovec[n++], pid);
564
565                 if (asprintf(&uid, "_UID=%lu", (unsigned long) ucred->uid) >= 0)
566                         IOVEC_SET_STRING(iovec[n++], uid);
567
568                 if (asprintf(&gid, "_GID=%lu", (unsigned long) ucred->gid) >= 0)
569                         IOVEC_SET_STRING(iovec[n++], gid);
570
571                 r = get_process_comm(ucred->pid, &t);
572                 if (r >= 0) {
573                         comm = strappend("_COMM=", t);
574                         free(t);
575
576                         if (comm)
577                                 IOVEC_SET_STRING(iovec[n++], comm);
578                 }
579
580                 r = get_process_exe(ucred->pid, &t);
581                 if (r >= 0) {
582                         exe = strappend("_EXE=", t);
583                         free(t);
584
585                         if (exe)
586                                 IOVEC_SET_STRING(iovec[n++], exe);
587                 }
588
589                 r = get_process_cmdline(ucred->pid, LINE_MAX, false, &t);
590                 if (r >= 0) {
591                         cmdline = strappend("_CMDLINE=", t);
592                         free(t);
593
594                         if (cmdline)
595                                 IOVEC_SET_STRING(iovec[n++], cmdline);
596                 }
597
598                 r = audit_session_from_pid(ucred->pid, &audit);
599                 if (r >= 0)
600                         if (asprintf(&audit_session, "_AUDIT_SESSION=%lu", (unsigned long) audit) >= 0)
601                                 IOVEC_SET_STRING(iovec[n++], audit_session);
602
603                 r = audit_loginuid_from_pid(ucred->pid, &loginuid);
604                 if (r >= 0)
605                         if (asprintf(&audit_loginuid, "_AUDIT_LOGINUID=%lu", (unsigned long) loginuid) >= 0)
606                                 IOVEC_SET_STRING(iovec[n++], audit_loginuid);
607
608                 t = shortened_cgroup_path(ucred->pid);
609                 if (t) {
610                         cgroup = strappend("_SYSTEMD_CGROUP=", t);
611                         free(t);
612
613                         if (cgroup)
614                                 IOVEC_SET_STRING(iovec[n++], cgroup);
615                 }
616
617 #ifdef HAVE_LOGIND
618                 if (sd_pid_get_session(ucred->pid, &t) >= 0) {
619                         session = strappend("_SYSTEMD_SESSION=", t);
620                         free(t);
621
622                         if (session)
623                                 IOVEC_SET_STRING(iovec[n++], session);
624                 }
625
626                 if (sd_pid_get_owner_uid(ucred->uid, &owner) >= 0)
627                         if (asprintf(&owner_uid, "_SYSTEMD_OWNER_UID=%lu", (unsigned long) owner) >= 0)
628                                 IOVEC_SET_STRING(iovec[n++], owner_uid);
629 #endif
630
631                 if (cg_pid_get_unit(ucred->pid, &t) >= 0) {
632                         unit = strappend("_SYSTEMD_UNIT=", t);
633                         free(t);
634                 } else if (unit_id)
635                         unit = strappend("_SYSTEMD_UNIT=", unit_id);
636
637                 if (unit)
638                         IOVEC_SET_STRING(iovec[n++], unit);
639
640 #ifdef HAVE_SELINUX
641                 if (label) {
642                         selinux_context = malloc(sizeof("_SELINUX_CONTEXT=") + label_len);
643                         if (selinux_context) {
644                                 memcpy(selinux_context, "_SELINUX_CONTEXT=", sizeof("_SELINUX_CONTEXT=")-1);
645                                 memcpy(selinux_context+sizeof("_SELINUX_CONTEXT=")-1, label, label_len);
646                                 selinux_context[sizeof("_SELINUX_CONTEXT=")-1+label_len] = 0;
647                                 IOVEC_SET_STRING(iovec[n++], selinux_context);
648                         }
649                 } else {
650                         security_context_t con;
651
652                         if (getpidcon(ucred->pid, &con) >= 0) {
653                                 selinux_context = strappend("_SELINUX_CONTEXT=", con);
654                                 if (selinux_context)
655                                         IOVEC_SET_STRING(iovec[n++], selinux_context);
656
657                                 freecon(con);
658                         }
659                 }
660 #endif
661         }
662
663         if (tv) {
664                 if (asprintf(&source_time, "_SOURCE_REALTIME_TIMESTAMP=%llu",
665                              (unsigned long long) timeval_load(tv)) >= 0)
666                         IOVEC_SET_STRING(iovec[n++], source_time);
667         }
668
669         /* Note that strictly speaking storing the boot id here is
670          * redundant since the entry includes this in-line
671          * anyway. However, we need this indexed, too. */
672         r = sd_id128_get_boot(&id);
673         if (r >= 0)
674                 if (asprintf(&boot_id, "_BOOT_ID=%s", sd_id128_to_string(id, idbuf)) >= 0)
675                         IOVEC_SET_STRING(iovec[n++], boot_id);
676
677         r = sd_id128_get_machine(&id);
678         if (r >= 0)
679                 if (asprintf(&machine_id, "_MACHINE_ID=%s", sd_id128_to_string(id, idbuf)) >= 0)
680                         IOVEC_SET_STRING(iovec[n++], machine_id);
681
682         t = gethostname_malloc();
683         if (t) {
684                 hostname = strappend("_HOSTNAME=", t);
685                 free(t);
686                 if (hostname)
687                         IOVEC_SET_STRING(iovec[n++], hostname);
688         }
689
690         assert(n <= m);
691
692         write_to_journal(s, realuid == 0 ? 0 : loginuid, iovec, n);
693
694         free(pid);
695         free(uid);
696         free(gid);
697         free(comm);
698         free(exe);
699         free(cmdline);
700         free(source_time);
701         free(boot_id);
702         free(machine_id);
703         free(hostname);
704         free(audit_session);
705         free(audit_loginuid);
706         free(cgroup);
707         free(session);
708         free(owner_uid);
709         free(unit);
710         free(selinux_context);
711 }
712
713 static void driver_message(Server *s, sd_id128_t message_id, const char *format, ...) {
714         char mid[11 + 32 + 1];
715         char buffer[16 + LINE_MAX + 1];
716         struct iovec iovec[N_IOVEC_META_FIELDS + 4];
717         int n = 0;
718         va_list ap;
719         struct ucred ucred;
720
721         assert(s);
722         assert(format);
723
724         IOVEC_SET_STRING(iovec[n++], "PRIORITY=5");
725         IOVEC_SET_STRING(iovec[n++], "_TRANSPORT=driver");
726
727         memcpy(buffer, "MESSAGE=", 8);
728         va_start(ap, format);
729         vsnprintf(buffer + 8, sizeof(buffer) - 8, format, ap);
730         va_end(ap);
731         char_array_0(buffer);
732         IOVEC_SET_STRING(iovec[n++], buffer);
733
734         snprintf(mid, sizeof(mid), "MESSAGE_ID=" SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(message_id));
735         char_array_0(mid);
736         IOVEC_SET_STRING(iovec[n++], mid);
737
738         zero(ucred);
739         ucred.pid = getpid();
740         ucred.uid = getuid();
741         ucred.gid = getgid();
742
743         dispatch_message_real(s, iovec, n, ELEMENTSOF(iovec), &ucred, NULL, NULL, 0, NULL);
744 }
745
746 static void dispatch_message(Server *s,
747                              struct iovec *iovec, unsigned n, unsigned m,
748                              struct ucred *ucred,
749                              struct timeval *tv,
750                              const char *label, size_t label_len,
751                              const char *unit_id,
752                              int priority) {
753         int rl;
754         char *path = NULL, *c;
755
756         assert(s);
757         assert(iovec || n == 0);
758
759         if (n == 0)
760                 return;
761
762         if (LOG_PRI(priority) > s->max_level_store)
763                 return;
764
765         if (!ucred)
766                 goto finish;
767
768         path = shortened_cgroup_path(ucred->pid);
769         if (!path)
770                 goto finish;
771
772         /* example: /user/lennart/3/foobar
773          *          /system/dbus.service/foobar
774          *
775          * So let's cut of everything past the third /, since that is
776          * wher user directories start */
777
778         c = strchr(path, '/');
779         if (c) {
780                 c = strchr(c+1, '/');
781                 if (c) {
782                         c = strchr(c+1, '/');
783                         if (c)
784                                 *c = 0;
785                 }
786         }
787
788         rl = journal_rate_limit_test(s->rate_limit, path, priority & LOG_PRIMASK, available_space(s));
789
790         if (rl == 0) {
791                 free(path);
792                 return;
793         }
794
795         /* Write a suppression message if we suppressed something */
796         if (rl > 1)
797                 driver_message(s, SD_MESSAGE_JOURNAL_DROPPED, "Suppressed %u messages from %s", rl - 1, path);
798
799         free(path);
800
801 finish:
802         dispatch_message_real(s, iovec, n, m, ucred, tv, label, label_len, unit_id);
803 }
804
805 static void forward_syslog_iovec(Server *s, const struct iovec *iovec, unsigned n_iovec, struct ucred *ucred, struct timeval *tv) {
806         struct msghdr msghdr;
807         struct cmsghdr *cmsg;
808         union {
809                 struct cmsghdr cmsghdr;
810                 uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
811         } control;
812         union sockaddr_union sa;
813
814         assert(s);
815         assert(iovec);
816         assert(n_iovec > 0);
817
818         zero(msghdr);
819         msghdr.msg_iov = (struct iovec*) iovec;
820         msghdr.msg_iovlen = n_iovec;
821
822         zero(sa);
823         sa.un.sun_family = AF_UNIX;
824         strncpy(sa.un.sun_path, "/run/systemd/journal/syslog", sizeof(sa.un.sun_path));
825         msghdr.msg_name = &sa;
826         msghdr.msg_namelen = offsetof(union sockaddr_union, un.sun_path) + strlen(sa.un.sun_path);
827
828         if (ucred) {
829                 zero(control);
830                 msghdr.msg_control = &control;
831                 msghdr.msg_controllen = sizeof(control);
832
833                 cmsg = CMSG_FIRSTHDR(&msghdr);
834                 cmsg->cmsg_level = SOL_SOCKET;
835                 cmsg->cmsg_type = SCM_CREDENTIALS;
836                 cmsg->cmsg_len = CMSG_LEN(sizeof(struct ucred));
837                 memcpy(CMSG_DATA(cmsg), ucred, sizeof(struct ucred));
838                 msghdr.msg_controllen = cmsg->cmsg_len;
839         }
840
841         /* Forward the syslog message we received via /dev/log to
842          * /run/systemd/syslog. Unfortunately we currently can't set
843          * the SO_TIMESTAMP auxiliary data, and hence we don't. */
844
845         if (sendmsg(s->syslog_fd, &msghdr, MSG_NOSIGNAL) >= 0)
846                 return;
847
848         /* The socket is full? I guess the syslog implementation is
849          * too slow, and we shouldn't wait for that... */
850         if (errno == EAGAIN)
851                 return;
852
853         if (ucred && errno == ESRCH) {
854                 struct ucred u;
855
856                 /* Hmm, presumably the sender process vanished
857                  * by now, so let's fix it as good as we
858                  * can, and retry */
859
860                 u = *ucred;
861                 u.pid = getpid();
862                 memcpy(CMSG_DATA(cmsg), &u, sizeof(struct ucred));
863
864                 if (sendmsg(s->syslog_fd, &msghdr, MSG_NOSIGNAL) >= 0)
865                         return;
866
867                 if (errno == EAGAIN)
868                         return;
869         }
870
871         if (errno != ENOENT)
872                 log_debug("Failed to forward syslog message: %m");
873 }
874
875 static void forward_syslog_raw(Server *s, int priority, const char *buffer, struct ucred *ucred, struct timeval *tv) {
876         struct iovec iovec;
877
878         assert(s);
879         assert(buffer);
880
881         if (LOG_PRI(priority) > s->max_level_syslog)
882                 return;
883
884         IOVEC_SET_STRING(iovec, buffer);
885         forward_syslog_iovec(s, &iovec, 1, ucred, tv);
886 }
887
888 static void forward_syslog(Server *s, int priority, const char *identifier, const char *message, struct ucred *ucred, struct timeval *tv) {
889         struct iovec iovec[5];
890         char header_priority[6], header_time[64], header_pid[16];
891         int n = 0;
892         time_t t;
893         struct tm *tm;
894         char *ident_buf = NULL;
895
896         assert(s);
897         assert(priority >= 0);
898         assert(priority <= 999);
899         assert(message);
900
901         if (LOG_PRI(priority) > s->max_level_syslog)
902                 return;
903
904         /* First: priority field */
905         snprintf(header_priority, sizeof(header_priority), "<%i>", priority);
906         char_array_0(header_priority);
907         IOVEC_SET_STRING(iovec[n++], header_priority);
908
909         /* Second: timestamp */
910         t = tv ? tv->tv_sec : ((time_t) (now(CLOCK_REALTIME) / USEC_PER_SEC));
911         tm = localtime(&t);
912         if (!tm)
913                 return;
914         if (strftime(header_time, sizeof(header_time), "%h %e %T ", tm) <= 0)
915                 return;
916         IOVEC_SET_STRING(iovec[n++], header_time);
917
918         /* Third: identifier and PID */
919         if (ucred) {
920                 if (!identifier) {
921                         get_process_comm(ucred->pid, &ident_buf);
922                         identifier = ident_buf;
923                 }
924
925                 snprintf(header_pid, sizeof(header_pid), "[%lu]: ", (unsigned long) ucred->pid);
926                 char_array_0(header_pid);
927
928                 if (identifier)
929                         IOVEC_SET_STRING(iovec[n++], identifier);
930
931                 IOVEC_SET_STRING(iovec[n++], header_pid);
932         } else if (identifier) {
933                 IOVEC_SET_STRING(iovec[n++], identifier);
934                 IOVEC_SET_STRING(iovec[n++], ": ");
935         }
936
937         /* Fourth: message */
938         IOVEC_SET_STRING(iovec[n++], message);
939
940         forward_syslog_iovec(s, iovec, n, ucred, tv);
941
942         free(ident_buf);
943 }
944
945 static int fixup_priority(int priority) {
946
947         if ((priority & LOG_FACMASK) == 0)
948                 return (priority & LOG_PRIMASK) | LOG_USER;
949
950         return priority;
951 }
952
953 static void forward_kmsg(Server *s, int priority, const char *identifier, const char *message, struct ucred *ucred) {
954         struct iovec iovec[5];
955         char header_priority[6], header_pid[16];
956         int n = 0;
957         char *ident_buf = NULL;
958         int fd;
959
960         assert(s);
961         assert(priority >= 0);
962         assert(priority <= 999);
963         assert(message);
964
965         if (LOG_PRI(priority) > s->max_level_kmsg)
966                 return;
967
968         /* Never allow messages with kernel facility to be written to
969          * kmsg, regardless where the data comes from. */
970         priority = fixup_priority(priority);
971
972         /* First: priority field */
973         snprintf(header_priority, sizeof(header_priority), "<%i>", priority);
974         char_array_0(header_priority);
975         IOVEC_SET_STRING(iovec[n++], header_priority);
976
977         /* Second: identifier and PID */
978         if (ucred) {
979                 if (!identifier) {
980                         get_process_comm(ucred->pid, &ident_buf);
981                         identifier = ident_buf;
982                 }
983
984                 snprintf(header_pid, sizeof(header_pid), "[%lu]: ", (unsigned long) ucred->pid);
985                 char_array_0(header_pid);
986
987                 if (identifier)
988                         IOVEC_SET_STRING(iovec[n++], identifier);
989
990                 IOVEC_SET_STRING(iovec[n++], header_pid);
991         } else if (identifier) {
992                 IOVEC_SET_STRING(iovec[n++], identifier);
993                 IOVEC_SET_STRING(iovec[n++], ": ");
994         }
995
996         /* Fourth: message */
997         IOVEC_SET_STRING(iovec[n++], message);
998         IOVEC_SET_STRING(iovec[n++], "\n");
999
1000         fd = open("/dev/kmsg", O_WRONLY|O_NOCTTY|O_CLOEXEC);
1001         if (fd < 0) {
1002                 log_debug("Failed to open /dev/kmsg for logging: %s", strerror(errno));
1003                 goto finish;
1004         }
1005
1006         if (writev(fd, iovec, n) < 0)
1007                 log_debug("Failed to write to /dev/kmsg for logging: %s", strerror(errno));
1008
1009         close_nointr_nofail(fd);
1010
1011 finish:
1012         free(ident_buf);
1013 }
1014
1015 static void forward_console(Server *s, int priority, const char *identifier, const char *message, struct ucred *ucred) {
1016         struct iovec iovec[4];
1017         char header_pid[16];
1018         int n = 0, fd;
1019         char *ident_buf = NULL;
1020         const char *tty;
1021
1022         assert(s);
1023         assert(message);
1024
1025         if (LOG_PRI(priority) > s->max_level_console)
1026                 return;
1027
1028         /* First: identifier and PID */
1029         if (ucred) {
1030                 if (!identifier) {
1031                         get_process_comm(ucred->pid, &ident_buf);
1032                         identifier = ident_buf;
1033                 }
1034
1035                 snprintf(header_pid, sizeof(header_pid), "[%lu]: ", (unsigned long) ucred->pid);
1036                 char_array_0(header_pid);
1037
1038                 if (identifier)
1039                         IOVEC_SET_STRING(iovec[n++], identifier);
1040
1041                 IOVEC_SET_STRING(iovec[n++], header_pid);
1042         } else if (identifier) {
1043                 IOVEC_SET_STRING(iovec[n++], identifier);
1044                 IOVEC_SET_STRING(iovec[n++], ": ");
1045         }
1046
1047         /* Third: message */
1048         IOVEC_SET_STRING(iovec[n++], message);
1049         IOVEC_SET_STRING(iovec[n++], "\n");
1050
1051         tty = s->tty_path ? s->tty_path : "/dev/console";
1052
1053         fd = open_terminal(tty, O_WRONLY|O_NOCTTY|O_CLOEXEC);
1054         if (fd < 0) {
1055                 log_debug("Failed to open %s for logging: %s", tty, strerror(errno));
1056                 goto finish;
1057         }
1058
1059         if (writev(fd, iovec, n) < 0)
1060                 log_debug("Failed to write to %s for logging: %s", tty, strerror(errno));
1061
1062         close_nointr_nofail(fd);
1063
1064 finish:
1065         free(ident_buf);
1066 }
1067
1068 static void read_identifier(const char **buf, char **identifier, char **pid) {
1069         const char *p;
1070         char *t;
1071         size_t l, e;
1072
1073         assert(buf);
1074         assert(identifier);
1075         assert(pid);
1076
1077         p = *buf;
1078
1079         p += strspn(p, WHITESPACE);
1080         l = strcspn(p, WHITESPACE);
1081
1082         if (l <= 0 ||
1083             p[l-1] != ':')
1084                 return;
1085
1086         e = l;
1087         l--;
1088
1089         if (p[l-1] == ']') {
1090                 size_t k = l-1;
1091
1092                 for (;;) {
1093
1094                         if (p[k] == '[') {
1095                                 t = strndup(p+k+1, l-k-2);
1096                                 if (t)
1097                                         *pid = t;
1098
1099                                 l = k;
1100                                 break;
1101                         }
1102
1103                         if (k == 0)
1104                                 break;
1105
1106                         k--;
1107                 }
1108         }
1109
1110         t = strndup(p, l);
1111         if (t)
1112                 *identifier = t;
1113
1114         *buf = p + e;
1115         *buf += strspn(*buf, WHITESPACE);
1116 }
1117
1118 static void process_syslog_message(Server *s, const char *buf, struct ucred *ucred, struct timeval *tv, const char *label, size_t label_len) {
1119         char *message = NULL, *syslog_priority = NULL, *syslog_facility = NULL, *syslog_identifier = NULL, *syslog_pid = NULL;
1120         struct iovec iovec[N_IOVEC_META_FIELDS + 6];
1121         unsigned n = 0;
1122         int priority = LOG_USER | LOG_INFO;
1123         char *identifier = NULL, *pid = NULL;
1124         const char *orig;
1125
1126         assert(s);
1127         assert(buf);
1128
1129         orig = buf;
1130         parse_syslog_priority((char**) &buf, &priority);
1131
1132         if (s->forward_to_syslog)
1133                 forward_syslog_raw(s, priority, orig, ucred, tv);
1134
1135         skip_syslog_date((char**) &buf);
1136         read_identifier(&buf, &identifier, &pid);
1137
1138         if (s->forward_to_kmsg)
1139                 forward_kmsg(s, priority, identifier, buf, ucred);
1140
1141         if (s->forward_to_console)
1142                 forward_console(s, priority, identifier, buf, ucred);
1143
1144         IOVEC_SET_STRING(iovec[n++], "_TRANSPORT=syslog");
1145
1146         if (asprintf(&syslog_priority, "PRIORITY=%i", priority & LOG_PRIMASK) >= 0)
1147                 IOVEC_SET_STRING(iovec[n++], syslog_priority);
1148
1149         if (priority & LOG_FACMASK)
1150                 if (asprintf(&syslog_facility, "SYSLOG_FACILITY=%i", LOG_FAC(priority)) >= 0)
1151                         IOVEC_SET_STRING(iovec[n++], syslog_facility);
1152
1153         if (identifier) {
1154                 syslog_identifier = strappend("SYSLOG_IDENTIFIER=", identifier);
1155                 if (syslog_identifier)
1156                         IOVEC_SET_STRING(iovec[n++], syslog_identifier);
1157         }
1158
1159         if (pid) {
1160                 syslog_pid = strappend("SYSLOG_PID=", pid);
1161                 if (syslog_pid)
1162                         IOVEC_SET_STRING(iovec[n++], syslog_pid);
1163         }
1164
1165         message = strappend("MESSAGE=", buf);
1166         if (message)
1167                 IOVEC_SET_STRING(iovec[n++], message);
1168
1169         dispatch_message(s, iovec, n, ELEMENTSOF(iovec), ucred, tv, label, label_len, NULL, priority);
1170
1171         free(message);
1172         free(identifier);
1173         free(pid);
1174         free(syslog_priority);
1175         free(syslog_facility);
1176         free(syslog_identifier);
1177 }
1178
1179 static bool valid_user_field(const char *p, size_t l) {
1180         const char *a;
1181
1182         /* We kinda enforce POSIX syntax recommendations for
1183            environment variables here, but make a couple of additional
1184            requirements.
1185
1186            http://pubs.opengroup.org/onlinepubs/000095399/basedefs/xbd_chap08.html */
1187
1188         /* No empty field names */
1189         if (l <= 0)
1190                 return false;
1191
1192         /* Don't allow names longer than 64 chars */
1193         if (l > 64)
1194                 return false;
1195
1196         /* Variables starting with an underscore are protected */
1197         if (p[0] == '_')
1198                 return false;
1199
1200         /* Don't allow digits as first character */
1201         if (p[0] >= '0' && p[0] <= '9')
1202                 return false;
1203
1204         /* Only allow A-Z0-9 and '_' */
1205         for (a = p; a < p + l; a++)
1206                 if (!((*a >= 'A' && *a <= 'Z') ||
1207                       (*a >= '0' && *a <= '9') ||
1208                       *a == '_'))
1209                         return false;
1210
1211         return true;
1212 }
1213
1214 static void process_native_message(
1215                 Server *s,
1216                 const void *buffer, size_t buffer_size,
1217                 struct ucred *ucred,
1218                 struct timeval *tv,
1219                 const char *label, size_t label_len) {
1220
1221         struct iovec *iovec = NULL;
1222         unsigned n = 0, m = 0, j, tn = (unsigned) -1;
1223         const char *p;
1224         size_t remaining;
1225         int priority = LOG_INFO;
1226         char *identifier = NULL, *message = NULL;
1227
1228         assert(s);
1229         assert(buffer || buffer_size == 0);
1230
1231         p = buffer;
1232         remaining = buffer_size;
1233
1234         while (remaining > 0) {
1235                 const char *e, *q;
1236
1237                 e = memchr(p, '\n', remaining);
1238
1239                 if (!e) {
1240                         /* Trailing noise, let's ignore it, and flush what we collected */
1241                         log_debug("Received message with trailing noise, ignoring.");
1242                         break;
1243                 }
1244
1245                 if (e == p) {
1246                         /* Entry separator */
1247                         dispatch_message(s, iovec, n, m, ucred, tv, label, label_len, NULL, priority);
1248                         n = 0;
1249                         priority = LOG_INFO;
1250
1251                         p++;
1252                         remaining--;
1253                         continue;
1254                 }
1255
1256                 if (*p == '.' || *p == '#') {
1257                         /* Ignore control commands for now, and
1258                          * comments too. */
1259                         remaining -= (e - p) + 1;
1260                         p = e + 1;
1261                         continue;
1262                 }
1263
1264                 /* A property follows */
1265
1266                 if (n+N_IOVEC_META_FIELDS >= m) {
1267                         struct iovec *c;
1268                         unsigned u;
1269
1270                         u = MAX((n+N_IOVEC_META_FIELDS+1) * 2U, 4U);
1271                         c = realloc(iovec, u * sizeof(struct iovec));
1272                         if (!c) {
1273                                 log_error("Out of memory.");
1274                                 break;
1275                         }
1276
1277                         iovec = c;
1278                         m = u;
1279                 }
1280
1281                 q = memchr(p, '=', e - p);
1282                 if (q) {
1283                         if (valid_user_field(p, q - p)) {
1284                                 size_t l;
1285
1286                                 l = e - p;
1287
1288                                 /* If the field name starts with an
1289                                  * underscore, skip the variable,
1290                                  * since that indidates a trusted
1291                                  * field */
1292                                 iovec[n].iov_base = (char*) p;
1293                                 iovec[n].iov_len = l;
1294                                 n++;
1295
1296                                 /* We need to determine the priority
1297                                  * of this entry for the rate limiting
1298                                  * logic */
1299                                 if (l == 10 &&
1300                                     memcmp(p, "PRIORITY=", 9) == 0 &&
1301                                     p[9] >= '0' && p[9] <= '9')
1302                                         priority = (priority & LOG_FACMASK) | (p[9] - '0');
1303
1304                                 else if (l == 17 &&
1305                                          memcmp(p, "SYSLOG_FACILITY=", 16) == 0 &&
1306                                          p[16] >= '0' && p[16] <= '9')
1307                                         priority = (priority & LOG_PRIMASK) | ((p[16] - '0') << 3);
1308
1309                                 else if (l == 18 &&
1310                                          memcmp(p, "SYSLOG_FACILITY=", 16) == 0 &&
1311                                          p[16] >= '0' && p[16] <= '9' &&
1312                                          p[17] >= '0' && p[17] <= '9')
1313                                         priority = (priority & LOG_PRIMASK) | (((p[16] - '0')*10 + (p[17] - '0')) << 3);
1314
1315                                 else if (l >= 19 &&
1316                                          memcmp(p, "SYSLOG_IDENTIFIER=", 18) == 0) {
1317                                         char *t;
1318
1319                                         t = strndup(p + 18, l - 18);
1320                                         if (t) {
1321                                                 free(identifier);
1322                                                 identifier = t;
1323                                         }
1324                                 } else if (l >= 8 &&
1325                                            memcmp(p, "MESSAGE=", 8) == 0) {
1326                                         char *t;
1327
1328                                         t = strndup(p + 8, l - 8);
1329                                         if (t) {
1330                                                 free(message);
1331                                                 message = t;
1332                                         }
1333                                 }
1334                         }
1335
1336                         remaining -= (e - p) + 1;
1337                         p = e + 1;
1338                         continue;
1339                 } else {
1340                         le64_t l_le;
1341                         uint64_t l;
1342                         char *k;
1343
1344                         if (remaining < e - p + 1 + sizeof(uint64_t) + 1) {
1345                                 log_debug("Failed to parse message, ignoring.");
1346                                 break;
1347                         }
1348
1349                         memcpy(&l_le, e + 1, sizeof(uint64_t));
1350                         l = le64toh(l_le);
1351
1352                         if (remaining < e - p + 1 + sizeof(uint64_t) + l + 1 ||
1353                             e[1+sizeof(uint64_t)+l] != '\n') {
1354                                 log_debug("Failed to parse message, ignoring.");
1355                                 break;
1356                         }
1357
1358                         k = malloc((e - p) + 1 + l);
1359                         if (!k) {
1360                                 log_error("Out of memory.");
1361                                 break;
1362                         }
1363
1364                         memcpy(k, p, e - p);
1365                         k[e - p] = '=';
1366                         memcpy(k + (e - p) + 1, e + 1 + sizeof(uint64_t), l);
1367
1368                         if (valid_user_field(p, e - p)) {
1369                                 iovec[n].iov_base = k;
1370                                 iovec[n].iov_len = (e - p) + 1 + l;
1371                                 n++;
1372                         } else
1373                                 free(k);
1374
1375                         remaining -= (e - p) + 1 + sizeof(uint64_t) + l + 1;
1376                         p = e + 1 + sizeof(uint64_t) + l + 1;
1377                 }
1378         }
1379
1380         if (n <= 0)
1381                 goto finish;
1382
1383         tn = n++;
1384         IOVEC_SET_STRING(iovec[tn], "_TRANSPORT=journal");
1385
1386         if (message) {
1387                 if (s->forward_to_syslog)
1388                         forward_syslog(s, priority, identifier, message, ucred, tv);
1389
1390                 if (s->forward_to_kmsg)
1391                         forward_kmsg(s, priority, identifier, message, ucred);
1392
1393                 if (s->forward_to_console)
1394                         forward_console(s, priority, identifier, message, ucred);
1395         }
1396
1397         dispatch_message(s, iovec, n, m, ucred, tv, label, label_len, NULL, priority);
1398
1399 finish:
1400         for (j = 0; j < n; j++)  {
1401                 if (j == tn)
1402                         continue;
1403
1404                 if (iovec[j].iov_base < buffer ||
1405                     (const uint8_t*) iovec[j].iov_base >= (const uint8_t*) buffer + buffer_size)
1406                         free(iovec[j].iov_base);
1407         }
1408
1409         free(iovec);
1410         free(identifier);
1411         free(message);
1412 }
1413
1414 static void process_native_file(
1415                 Server *s,
1416                 int fd,
1417                 struct ucred *ucred,
1418                 struct timeval *tv,
1419                 const char *label, size_t label_len) {
1420
1421         struct stat st;
1422         void *p;
1423         ssize_t n;
1424
1425         assert(s);
1426         assert(fd >= 0);
1427
1428         /* Data is in the passed file, since it didn't fit in a
1429          * datagram. We can't map the file here, since clients might
1430          * then truncate it and trigger a SIGBUS for us. So let's
1431          * stupidly read it */
1432
1433         if (fstat(fd, &st) < 0) {
1434                 log_error("Failed to stat passed file, ignoring: %m");
1435                 return;
1436         }
1437
1438         if (!S_ISREG(st.st_mode)) {
1439                 log_error("File passed is not regular. Ignoring.");
1440                 return;
1441         }
1442
1443         if (st.st_size <= 0)
1444                 return;
1445
1446         if (st.st_size > ENTRY_SIZE_MAX) {
1447                 log_error("File passed too large. Ignoring.");
1448                 return;
1449         }
1450
1451         p = malloc(st.st_size);
1452         if (!p) {
1453                 log_error("Out of memory.");
1454                 return;
1455         }
1456
1457         n = pread(fd, p, st.st_size, 0);
1458         if (n < 0)
1459                 log_error("Failed to read file, ignoring: %s", strerror(-n));
1460         else if (n > 0)
1461                 process_native_message(s, p, n, ucred, tv, label, label_len);
1462
1463         free(p);
1464 }
1465
1466 static int stdout_stream_log(StdoutStream *s, const char *p) {
1467         struct iovec iovec[N_IOVEC_META_FIELDS + 5];
1468         char *message = NULL, *syslog_priority = NULL, *syslog_facility = NULL, *syslog_identifier = NULL;
1469         unsigned n = 0;
1470         int priority;
1471         char *label = NULL;
1472         size_t label_len = 0;
1473
1474         assert(s);
1475         assert(p);
1476
1477         if (isempty(p))
1478                 return 0;
1479
1480         priority = s->priority;
1481
1482         if (s->level_prefix)
1483                 parse_syslog_priority((char**) &p, &priority);
1484
1485         if (s->forward_to_syslog || s->server->forward_to_syslog)
1486                 forward_syslog(s->server, fixup_priority(priority), s->identifier, p, &s->ucred, NULL);
1487
1488         if (s->forward_to_kmsg || s->server->forward_to_kmsg)
1489                 forward_kmsg(s->server, priority, s->identifier, p, &s->ucred);
1490
1491         if (s->forward_to_console || s->server->forward_to_console)
1492                 forward_console(s->server, priority, s->identifier, p, &s->ucred);
1493
1494         IOVEC_SET_STRING(iovec[n++], "_TRANSPORT=stdout");
1495
1496         if (asprintf(&syslog_priority, "PRIORITY=%i", priority & LOG_PRIMASK) >= 0)
1497                 IOVEC_SET_STRING(iovec[n++], syslog_priority);
1498
1499         if (priority & LOG_FACMASK)
1500                 if (asprintf(&syslog_facility, "SYSLOG_FACILITY=%i", LOG_FAC(priority)) >= 0)
1501                         IOVEC_SET_STRING(iovec[n++], syslog_facility);
1502
1503         if (s->identifier) {
1504                 syslog_identifier = strappend("SYSLOG_IDENTIFIER=", s->identifier);
1505                 if (syslog_identifier)
1506                         IOVEC_SET_STRING(iovec[n++], syslog_identifier);
1507         }
1508
1509         message = strappend("MESSAGE=", p);
1510         if (message)
1511                 IOVEC_SET_STRING(iovec[n++], message);
1512
1513 #ifdef HAVE_SELINUX
1514         if (s->security_context) {
1515                 label = (char*) s->security_context;
1516                 label_len = strlen((char*) s->security_context);
1517         }
1518 #endif
1519
1520         dispatch_message(s->server, iovec, n, ELEMENTSOF(iovec), &s->ucred, NULL, label, label_len, s->unit_id, priority);
1521
1522         free(message);
1523         free(syslog_priority);
1524         free(syslog_facility);
1525         free(syslog_identifier);
1526
1527         return 0;
1528 }
1529
1530 static int stdout_stream_line(StdoutStream *s, char *p) {
1531         int r;
1532
1533         assert(s);
1534         assert(p);
1535
1536         p = strstrip(p);
1537
1538         switch (s->state) {
1539
1540         case STDOUT_STREAM_IDENTIFIER:
1541                 if (isempty(p))
1542                         s->identifier = NULL;
1543                 else  {
1544                         s->identifier = strdup(p);
1545                         if (!s->identifier) {
1546                                 log_error("Out of memory.");
1547                                 return -ENOMEM;
1548                         }
1549                 }
1550
1551                 s->state = STDOUT_STREAM_UNIT_ID;
1552                 return 0;
1553
1554         case STDOUT_STREAM_UNIT_ID:
1555                 if (s->ucred.uid == 0) {
1556                         if (isempty(p))
1557                                 s->unit_id = NULL;
1558                         else  {
1559                                 s->unit_id = strdup(p);
1560                                 if (!s->unit_id) {
1561                                         log_error("Out of memory.");
1562                                         return -ENOMEM;
1563                                 }
1564                         }
1565                 }
1566
1567                 s->state = STDOUT_STREAM_PRIORITY;
1568                 return 0;
1569
1570         case STDOUT_STREAM_PRIORITY:
1571                 r = safe_atoi(p, &s->priority);
1572                 if (r < 0 || s->priority <= 0 || s->priority >= 999) {
1573                         log_warning("Failed to parse log priority line.");
1574                         return -EINVAL;
1575                 }
1576
1577                 s->state = STDOUT_STREAM_LEVEL_PREFIX;
1578                 return 0;
1579
1580         case STDOUT_STREAM_LEVEL_PREFIX:
1581                 r = parse_boolean(p);
1582                 if (r < 0) {
1583                         log_warning("Failed to parse level prefix line.");
1584                         return -EINVAL;
1585                 }
1586
1587                 s->level_prefix = !!r;
1588                 s->state = STDOUT_STREAM_FORWARD_TO_SYSLOG;
1589                 return 0;
1590
1591         case STDOUT_STREAM_FORWARD_TO_SYSLOG:
1592                 r = parse_boolean(p);
1593                 if (r < 0) {
1594                         log_warning("Failed to parse forward to syslog line.");
1595                         return -EINVAL;
1596                 }
1597
1598                 s->forward_to_syslog = !!r;
1599                 s->state = STDOUT_STREAM_FORWARD_TO_KMSG;
1600                 return 0;
1601
1602         case STDOUT_STREAM_FORWARD_TO_KMSG:
1603                 r = parse_boolean(p);
1604                 if (r < 0) {
1605                         log_warning("Failed to parse copy to kmsg line.");
1606                         return -EINVAL;
1607                 }
1608
1609                 s->forward_to_kmsg = !!r;
1610                 s->state = STDOUT_STREAM_FORWARD_TO_CONSOLE;
1611                 return 0;
1612
1613         case STDOUT_STREAM_FORWARD_TO_CONSOLE:
1614                 r = parse_boolean(p);
1615                 if (r < 0) {
1616                         log_warning("Failed to parse copy to console line.");
1617                         return -EINVAL;
1618                 }
1619
1620                 s->forward_to_console = !!r;
1621                 s->state = STDOUT_STREAM_RUNNING;
1622                 return 0;
1623
1624         case STDOUT_STREAM_RUNNING:
1625                 return stdout_stream_log(s, p);
1626         }
1627
1628         assert_not_reached("Unknown stream state");
1629 }
1630
1631 static int stdout_stream_scan(StdoutStream *s, bool force_flush) {
1632         char *p;
1633         size_t remaining;
1634         int r;
1635
1636         assert(s);
1637
1638         p = s->buffer;
1639         remaining = s->length;
1640         for (;;) {
1641                 char *end;
1642                 size_t skip;
1643
1644                 end = memchr(p, '\n', remaining);
1645                 if (end)
1646                         skip = end - p + 1;
1647                 else if (remaining >= sizeof(s->buffer) - 1) {
1648                         end = p + sizeof(s->buffer) - 1;
1649                         skip = remaining;
1650                 } else
1651                         break;
1652
1653                 *end = 0;
1654
1655                 r = stdout_stream_line(s, p);
1656                 if (r < 0)
1657                         return r;
1658
1659                 remaining -= skip;
1660                 p += skip;
1661         }
1662
1663         if (force_flush && remaining > 0) {
1664                 p[remaining] = 0;
1665                 r = stdout_stream_line(s, p);
1666                 if (r < 0)
1667                         return r;
1668
1669                 p += remaining;
1670                 remaining = 0;
1671         }
1672
1673         if (p > s->buffer) {
1674                 memmove(s->buffer, p, remaining);
1675                 s->length = remaining;
1676         }
1677
1678         return 0;
1679 }
1680
1681 static int stdout_stream_process(StdoutStream *s) {
1682         ssize_t l;
1683         int r;
1684
1685         assert(s);
1686
1687         l = read(s->fd, s->buffer+s->length, sizeof(s->buffer)-1-s->length);
1688         if (l < 0) {
1689
1690                 if (errno == EAGAIN)
1691                         return 0;
1692
1693                 log_warning("Failed to read from stream: %m");
1694                 return -errno;
1695         }
1696
1697         if (l == 0) {
1698                 r = stdout_stream_scan(s, true);
1699                 if (r < 0)
1700                         return r;
1701
1702                 return 0;
1703         }
1704
1705         s->length += l;
1706         r = stdout_stream_scan(s, false);
1707         if (r < 0)
1708                 return r;
1709
1710         return 1;
1711
1712 }
1713
1714 static void stdout_stream_free(StdoutStream *s) {
1715         assert(s);
1716
1717         if (s->server) {
1718                 assert(s->server->n_stdout_streams > 0);
1719                 s->server->n_stdout_streams --;
1720                 LIST_REMOVE(StdoutStream, stdout_stream, s->server->stdout_streams, s);
1721         }
1722
1723         if (s->fd >= 0) {
1724                 if (s->server)
1725                         epoll_ctl(s->server->epoll_fd, EPOLL_CTL_DEL, s->fd, NULL);
1726
1727                 close_nointr_nofail(s->fd);
1728         }
1729
1730 #ifdef HAVE_SELINUX
1731         if (s->security_context)
1732                 freecon(s->security_context);
1733 #endif
1734
1735         free(s->identifier);
1736         free(s);
1737 }
1738
1739 static int stdout_stream_new(Server *s) {
1740         StdoutStream *stream;
1741         int fd, r;
1742         socklen_t len;
1743         struct epoll_event ev;
1744
1745         assert(s);
1746
1747         fd = accept4(s->stdout_fd, NULL, NULL, SOCK_NONBLOCK|SOCK_CLOEXEC);
1748         if (fd < 0) {
1749                 if (errno == EAGAIN)
1750                         return 0;
1751
1752                 log_error("Failed to accept stdout connection: %m");
1753                 return -errno;
1754         }
1755
1756         if (s->n_stdout_streams >= STDOUT_STREAMS_MAX) {
1757                 log_warning("Too many stdout streams, refusing connection.");
1758                 close_nointr_nofail(fd);
1759                 return 0;
1760         }
1761
1762         stream = new0(StdoutStream, 1);
1763         if (!stream) {
1764                 log_error("Out of memory.");
1765                 close_nointr_nofail(fd);
1766                 return -ENOMEM;
1767         }
1768
1769         stream->fd = fd;
1770
1771         len = sizeof(stream->ucred);
1772         if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &stream->ucred, &len) < 0) {
1773                 log_error("Failed to determine peer credentials: %m");
1774                 r = -errno;
1775                 goto fail;
1776         }
1777
1778 #ifdef HAVE_SELINUX
1779         if (getpeercon(fd, &stream->security_context) < 0 && errno != ENOPROTOOPT)
1780                 log_error("Failed to determine peer security context: %m");
1781 #endif
1782
1783         if (shutdown(fd, SHUT_WR) < 0) {
1784                 log_error("Failed to shutdown writing side of socket: %m");
1785                 r = -errno;
1786                 goto fail;
1787         }
1788
1789         zero(ev);
1790         ev.data.ptr = stream;
1791         ev.events = EPOLLIN;
1792         if (epoll_ctl(s->epoll_fd, EPOLL_CTL_ADD, fd, &ev) < 0) {
1793                 log_error("Failed to add stream to event loop: %m");
1794                 r = -errno;
1795                 goto fail;
1796         }
1797
1798         stream->server = s;
1799         LIST_PREPEND(StdoutStream, stdout_stream, s->stdout_streams, stream);
1800         s->n_stdout_streams ++;
1801
1802         return 0;
1803
1804 fail:
1805         stdout_stream_free(stream);
1806         return r;
1807 }
1808
1809 static int parse_kernel_timestamp(char **_p, usec_t *t) {
1810         usec_t r;
1811         int k, i;
1812         char *p;
1813
1814         assert(_p);
1815         assert(*_p);
1816         assert(t);
1817
1818         p = *_p;
1819
1820         if (strlen(p) < 14 || p[0] != '[' || p[13] != ']' || p[6] != '.')
1821                 return 0;
1822
1823         r = 0;
1824
1825         for (i = 1; i <= 5; i++) {
1826                 r *= 10;
1827
1828                 if (p[i] == ' ')
1829                         continue;
1830
1831                 k = undecchar(p[i]);
1832                 if (k < 0)
1833                         return 0;
1834
1835                 r += k;
1836         }
1837
1838         for (i = 7; i <= 12; i++) {
1839                 r *= 10;
1840
1841                 k = undecchar(p[i]);
1842                 if (k < 0)
1843                         return 0;
1844
1845                 r += k;
1846         }
1847
1848         *t = r;
1849         *_p += 14;
1850         *_p += strspn(*_p, WHITESPACE);
1851
1852         return 1;
1853 }
1854
1855 static bool is_us(const char *pid) {
1856         pid_t t;
1857
1858         assert(pid);
1859
1860         if (parse_pid(pid, &t) < 0)
1861                 return false;
1862
1863         return t == getpid();
1864 }
1865
1866 static void proc_kmsg_line(Server *s, const char *p) {
1867         struct iovec iovec[N_IOVEC_META_FIELDS + 7];
1868         char *message = NULL, *syslog_priority = NULL, *syslog_pid = NULL, *syslog_facility = NULL, *syslog_identifier = NULL, *source_time = NULL;
1869         int priority = LOG_KERN | LOG_INFO;
1870         unsigned n = 0;
1871         usec_t usec;
1872         char *identifier = NULL, *pid = NULL;
1873
1874         assert(s);
1875         assert(p);
1876
1877         if (isempty(p))
1878                 return;
1879
1880         parse_syslog_priority((char **) &p, &priority);
1881
1882         if (s->forward_to_kmsg && (priority & LOG_FACMASK) != LOG_KERN)
1883                 return;
1884
1885         if (parse_kernel_timestamp((char **) &p, &usec) > 0) {
1886                 if (asprintf(&source_time, "_SOURCE_MONOTONIC_TIMESTAMP=%llu",
1887                              (unsigned long long) usec) >= 0)
1888                         IOVEC_SET_STRING(iovec[n++], source_time);
1889         }
1890
1891         IOVEC_SET_STRING(iovec[n++], "_TRANSPORT=kernel");
1892
1893         if (asprintf(&syslog_priority, "PRIORITY=%i", priority & LOG_PRIMASK) >= 0)
1894                 IOVEC_SET_STRING(iovec[n++], syslog_priority);
1895
1896         if ((priority & LOG_FACMASK) == LOG_KERN) {
1897
1898                 if (s->forward_to_syslog)
1899                         forward_syslog(s, priority, "kernel", p, NULL, NULL);
1900
1901                 IOVEC_SET_STRING(iovec[n++], "SYSLOG_IDENTIFIER=kernel");
1902         } else {
1903                 read_identifier(&p, &identifier, &pid);
1904
1905                 /* Avoid any messages we generated ourselves via
1906                  * log_info() and friends. */
1907                 if (pid && is_us(pid))
1908                         goto finish;
1909
1910                 if (s->forward_to_syslog)
1911                         forward_syslog(s, priority, identifier, p, NULL, NULL);
1912
1913                 if (identifier) {
1914                         syslog_identifier = strappend("SYSLOG_IDENTIFIER=", identifier);
1915                         if (syslog_identifier)
1916                                 IOVEC_SET_STRING(iovec[n++], syslog_identifier);
1917                 }
1918
1919                 if (pid) {
1920                         syslog_pid = strappend("SYSLOG_PID=", pid);
1921                         if (syslog_pid)
1922                                 IOVEC_SET_STRING(iovec[n++], syslog_pid);
1923                 }
1924
1925                 if (asprintf(&syslog_facility, "SYSLOG_FACILITY=%i", LOG_FAC(priority)) >= 0)
1926                         IOVEC_SET_STRING(iovec[n++], syslog_facility);
1927         }
1928
1929         message = strappend("MESSAGE=", p);
1930         if (message)
1931                 IOVEC_SET_STRING(iovec[n++], message);
1932
1933         dispatch_message(s, iovec, n, ELEMENTSOF(iovec), NULL, NULL, NULL, 0, NULL, priority);
1934
1935 finish:
1936         free(message);
1937         free(syslog_priority);
1938         free(syslog_identifier);
1939         free(syslog_pid);
1940         free(syslog_facility);
1941         free(source_time);
1942         free(identifier);
1943         free(pid);
1944 }
1945
1946 static void proc_kmsg_scan(Server *s) {
1947         char *p;
1948         size_t remaining;
1949
1950         assert(s);
1951
1952         p = s->proc_kmsg_buffer;
1953         remaining = s->proc_kmsg_length;
1954         for (;;) {
1955                 char *end;
1956                 size_t skip;
1957
1958                 end = memchr(p, '\n', remaining);
1959                 if (end)
1960                         skip = end - p + 1;
1961                 else if (remaining >= sizeof(s->proc_kmsg_buffer) - 1) {
1962                         end = p + sizeof(s->proc_kmsg_buffer) - 1;
1963                         skip = remaining;
1964                 } else
1965                         break;
1966
1967                 *end = 0;
1968
1969                 proc_kmsg_line(s, p);
1970
1971                 remaining -= skip;
1972                 p += skip;
1973         }
1974
1975         if (p > s->proc_kmsg_buffer) {
1976                 memmove(s->proc_kmsg_buffer, p, remaining);
1977                 s->proc_kmsg_length = remaining;
1978         }
1979 }
1980
1981 static int system_journal_open(Server *s) {
1982         int r;
1983         char *fn;
1984         sd_id128_t machine;
1985         char ids[33];
1986
1987         r = sd_id128_get_machine(&machine);
1988         if (r < 0)
1989                 return r;
1990
1991         sd_id128_to_string(machine, ids);
1992
1993         if (!s->system_journal &&
1994             (s->storage == STORAGE_PERSISTENT || s->storage == STORAGE_AUTO) &&
1995             access("/run/systemd/journal/flushed", F_OK) >= 0) {
1996
1997                 /* If in auto mode: first try to create the machine
1998                  * path, but not the prefix.
1999                  *
2000                  * If in persistent mode: create /var/log/journal and
2001                  * the machine path */
2002
2003                 if (s->storage == STORAGE_PERSISTENT)
2004                         (void) mkdir("/var/log/journal/", 0755);
2005
2006                 fn = strappend("/var/log/journal/", ids);
2007                 if (!fn)
2008                         return -ENOMEM;
2009
2010                 (void) mkdir(fn, 0755);
2011                 free(fn);
2012
2013                 fn = strjoin("/var/log/journal/", ids, "/system.journal", NULL);
2014                 if (!fn)
2015                         return -ENOMEM;
2016
2017                 r = journal_file_open_reliably(fn, O_RDWR|O_CREAT, 0640, &s->system_metrics, NULL, &s->system_journal);
2018                 free(fn);
2019
2020                 if (r >= 0) {
2021                         s->system_journal->compress = s->compress;
2022
2023                         server_fix_perms(s, s->system_journal, 0);
2024                 } else if (r < 0) {
2025
2026                         if (r != -ENOENT && r != -EROFS)
2027                                 log_warning("Failed to open system journal: %s", strerror(-r));
2028
2029                         r = 0;
2030                 }
2031         }
2032
2033         if (!s->runtime_journal &&
2034             (s->storage != STORAGE_NONE)) {
2035
2036                 fn = strjoin("/run/log/journal/", ids, "/system.journal", NULL);
2037                 if (!fn)
2038                         return -ENOMEM;
2039
2040                 if (s->system_journal) {
2041
2042                         /* Try to open the runtime journal, but only
2043                          * if it already exists, so that we can flush
2044                          * it into the system journal */
2045
2046                         r = journal_file_open(fn, O_RDWR, 0640, &s->runtime_metrics, NULL, &s->runtime_journal);
2047                         free(fn);
2048
2049                         if (r < 0) {
2050                                 if (r != -ENOENT)
2051                                         log_warning("Failed to open runtime journal: %s", strerror(-r));
2052
2053                                 r = 0;
2054                         }
2055
2056                 } else {
2057
2058                         /* OK, we really need the runtime journal, so create
2059                          * it if necessary. */
2060
2061                         (void) mkdir_parents(fn, 0755);
2062                         r = journal_file_open_reliably(fn, O_RDWR|O_CREAT, 0640, &s->runtime_metrics, NULL, &s->runtime_journal);
2063                         free(fn);
2064
2065                         if (r < 0) {
2066                                 log_error("Failed to open runtime journal: %s", strerror(-r));
2067                                 return r;
2068                         }
2069                 }
2070
2071                 if (s->runtime_journal) {
2072                         s->runtime_journal->compress = s->compress;
2073
2074                         server_fix_perms(s, s->runtime_journal, 0);
2075                 }
2076         }
2077
2078         return r;
2079 }
2080
2081 static int server_flush_to_var(Server *s) {
2082         Object *o = NULL;
2083         int r;
2084         sd_id128_t machine;
2085         sd_journal *j;
2086
2087         assert(s);
2088
2089         if (s->storage != STORAGE_AUTO &&
2090             s->storage != STORAGE_PERSISTENT)
2091                 return 0;
2092
2093         if (!s->runtime_journal)
2094                 return 0;
2095
2096         system_journal_open(s);
2097
2098         if (!s->system_journal)
2099                 return 0;
2100
2101         log_info("Flushing to /var...");
2102
2103         r = sd_id128_get_machine(&machine);
2104         if (r < 0) {
2105                 log_error("Failed to get machine id: %s", strerror(-r));
2106                 return r;
2107         }
2108
2109         r = sd_journal_open(&j, SD_JOURNAL_RUNTIME_ONLY);
2110         if (r < 0) {
2111                 log_error("Failed to read runtime journal: %s", strerror(-r));
2112                 return r;
2113         }
2114
2115         SD_JOURNAL_FOREACH(j) {
2116                 JournalFile *f;
2117
2118                 f = j->current_file;
2119                 assert(f && f->current_offset > 0);
2120
2121                 r = journal_file_move_to_object(f, OBJECT_ENTRY, f->current_offset, &o);
2122                 if (r < 0) {
2123                         log_error("Can't read entry: %s", strerror(-r));
2124                         goto finish;
2125                 }
2126
2127                 r = journal_file_copy_entry(f, s->system_journal, o, f->current_offset, NULL, NULL, NULL);
2128                 if (r == -E2BIG) {
2129                         log_info("Allocation limit reached.");
2130
2131                         journal_file_post_change(s->system_journal);
2132                         server_rotate(s);
2133                         server_vacuum(s);
2134
2135                         r = journal_file_copy_entry(f, s->system_journal, o, f->current_offset, NULL, NULL, NULL);
2136                 }
2137
2138                 if (r < 0) {
2139                         log_error("Can't write entry: %s", strerror(-r));
2140                         goto finish;
2141                 }
2142         }
2143
2144 finish:
2145         journal_file_post_change(s->system_journal);
2146
2147         journal_file_close(s->runtime_journal);
2148         s->runtime_journal = NULL;
2149
2150         if (r >= 0)
2151                 rm_rf("/run/log/journal", false, true, false);
2152
2153         return r;
2154 }
2155
2156 static int server_read_proc_kmsg(Server *s) {
2157         ssize_t l;
2158         assert(s);
2159         assert(s->proc_kmsg_fd >= 0);
2160
2161         l = read(s->proc_kmsg_fd, s->proc_kmsg_buffer + s->proc_kmsg_length, sizeof(s->proc_kmsg_buffer) - 1 - s->proc_kmsg_length);
2162         if (l == 0) /* the kernel is stupid and in some race
2163                      * conditions returns 0 in the middle of the
2164                      * stream. */
2165                 return 0;
2166         if (l < 0) {
2167
2168                 if (errno == EAGAIN || errno == EINTR)
2169                         return 0;
2170
2171                 log_error("Failed to read from kernel: %m");
2172                 return -errno;
2173         }
2174
2175         s->proc_kmsg_length += l;
2176
2177         proc_kmsg_scan(s);
2178         return 1;
2179 }
2180
2181 static int server_flush_proc_kmsg(Server *s) {
2182         int r;
2183
2184         assert(s);
2185
2186         if (s->proc_kmsg_fd < 0)
2187                 return 0;
2188
2189         log_info("Flushing /proc/kmsg...");
2190
2191         for (;;) {
2192                 r = server_read_proc_kmsg(s);
2193                 if (r < 0)
2194                         return r;
2195
2196                 if (r == 0)
2197                         break;
2198         }
2199
2200         return 0;
2201 }
2202
2203 static int process_event(Server *s, struct epoll_event *ev) {
2204         assert(s);
2205         assert(ev);
2206
2207         if (ev->data.fd == s->signal_fd) {
2208                 struct signalfd_siginfo sfsi;
2209                 ssize_t n;
2210
2211                 if (ev->events != EPOLLIN) {
2212                         log_info("Got invalid event from epoll.");
2213                         return -EIO;
2214                 }
2215
2216                 n = read(s->signal_fd, &sfsi, sizeof(sfsi));
2217                 if (n != sizeof(sfsi)) {
2218
2219                         if (n >= 0)
2220                                 return -EIO;
2221
2222                         if (errno == EINTR || errno == EAGAIN)
2223                                 return 1;
2224
2225                         return -errno;
2226                 }
2227
2228                 log_info("Received SIG%s", signal_to_string(sfsi.ssi_signo));
2229
2230                 if (sfsi.ssi_signo == SIGUSR1) {
2231                         touch("/run/systemd/journal/flushed");
2232                         server_flush_to_var(s);
2233                         return 1;
2234                 }
2235
2236                 if (sfsi.ssi_signo == SIGUSR2) {
2237                         server_rotate(s);
2238                         server_vacuum(s);
2239                         return 1;
2240                 }
2241
2242                 return 0;
2243
2244         } else if (ev->data.fd == s->proc_kmsg_fd) {
2245                 int r;
2246
2247                 if (ev->events != EPOLLIN) {
2248                         log_info("Got invalid event from epoll.");
2249                         return -EIO;
2250                 }
2251
2252                 r = server_read_proc_kmsg(s);
2253                 if (r < 0)
2254                         return r;
2255
2256                 return 1;
2257
2258         } else if (ev->data.fd == s->native_fd ||
2259                    ev->data.fd == s->syslog_fd) {
2260
2261                 if (ev->events != EPOLLIN) {
2262                         log_info("Got invalid event from epoll.");
2263                         return -EIO;
2264                 }
2265
2266                 for (;;) {
2267                         struct msghdr msghdr;
2268                         struct iovec iovec;
2269                         struct ucred *ucred = NULL;
2270                         struct timeval *tv = NULL;
2271                         struct cmsghdr *cmsg;
2272                         char *label = NULL;
2273                         size_t label_len = 0;
2274                         union {
2275                                 struct cmsghdr cmsghdr;
2276
2277                                 /* We use NAME_MAX space for the
2278                                  * SELinux label here. The kernel
2279                                  * currently enforces no limit, but
2280                                  * according to suggestions from the
2281                                  * SELinux people this will change and
2282                                  * it will probably be identical to
2283                                  * NAME_MAX. For now we use that, but
2284                                  * this should be updated one day when
2285                                  * the final limit is known.*/
2286                                 uint8_t buf[CMSG_SPACE(sizeof(struct ucred)) +
2287                                             CMSG_SPACE(sizeof(struct timeval)) +
2288                                             CMSG_SPACE(sizeof(int)) + /* fd */
2289                                             CMSG_SPACE(NAME_MAX)]; /* selinux label */
2290                         } control;
2291                         ssize_t n;
2292                         int v;
2293                         int *fds = NULL;
2294                         unsigned n_fds = 0;
2295
2296                         if (ioctl(ev->data.fd, SIOCINQ, &v) < 0) {
2297                                 log_error("SIOCINQ failed: %m");
2298                                 return -errno;
2299                         }
2300
2301                         if (s->buffer_size < (size_t) v) {
2302                                 void *b;
2303                                 size_t l;
2304
2305                                 l = MAX(LINE_MAX + (size_t) v, s->buffer_size * 2);
2306                                 b = realloc(s->buffer, l+1);
2307
2308                                 if (!b) {
2309                                         log_error("Couldn't increase buffer.");
2310                                         return -ENOMEM;
2311                                 }
2312
2313                                 s->buffer_size = l;
2314                                 s->buffer = b;
2315                         }
2316
2317                         zero(iovec);
2318                         iovec.iov_base = s->buffer;
2319                         iovec.iov_len = s->buffer_size;
2320
2321                         zero(control);
2322                         zero(msghdr);
2323                         msghdr.msg_iov = &iovec;
2324                         msghdr.msg_iovlen = 1;
2325                         msghdr.msg_control = &control;
2326                         msghdr.msg_controllen = sizeof(control);
2327
2328                         n = recvmsg(ev->data.fd, &msghdr, MSG_DONTWAIT|MSG_CMSG_CLOEXEC);
2329                         if (n < 0) {
2330
2331                                 if (errno == EINTR || errno == EAGAIN)
2332                                         return 1;
2333
2334                                 log_error("recvmsg() failed: %m");
2335                                 return -errno;
2336                         }
2337
2338                         for (cmsg = CMSG_FIRSTHDR(&msghdr); cmsg; cmsg = CMSG_NXTHDR(&msghdr, cmsg)) {
2339
2340                                 if (cmsg->cmsg_level == SOL_SOCKET &&
2341                                     cmsg->cmsg_type == SCM_CREDENTIALS &&
2342                                     cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred)))
2343                                         ucred = (struct ucred*) CMSG_DATA(cmsg);
2344                                 else if (cmsg->cmsg_level == SOL_SOCKET &&
2345                                          cmsg->cmsg_type == SCM_SECURITY) {
2346                                         label = (char*) CMSG_DATA(cmsg);
2347                                         label_len = cmsg->cmsg_len - CMSG_LEN(0);
2348                                 } else if (cmsg->cmsg_level == SOL_SOCKET &&
2349                                          cmsg->cmsg_type == SO_TIMESTAMP &&
2350                                          cmsg->cmsg_len == CMSG_LEN(sizeof(struct timeval)))
2351                                         tv = (struct timeval*) CMSG_DATA(cmsg);
2352                                 else if (cmsg->cmsg_level == SOL_SOCKET &&
2353                                          cmsg->cmsg_type == SCM_RIGHTS) {
2354                                         fds = (int*) CMSG_DATA(cmsg);
2355                                         n_fds = (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
2356                                 }
2357                         }
2358
2359                         if (ev->data.fd == s->syslog_fd) {
2360                                 char *e;
2361
2362                                 if (n > 0 && n_fds == 0) {
2363                                         e = memchr(s->buffer, '\n', n);
2364                                         if (e)
2365                                                 *e = 0;
2366                                         else
2367                                                 s->buffer[n] = 0;
2368
2369                                         process_syslog_message(s, strstrip(s->buffer), ucred, tv, label, label_len);
2370                                 } else if (n_fds > 0)
2371                                         log_warning("Got file descriptors via syslog socket. Ignoring.");
2372
2373                         } else {
2374                                 if (n > 0 && n_fds == 0)
2375                                         process_native_message(s, s->buffer, n, ucred, tv, label, label_len);
2376                                 else if (n == 0 && n_fds == 1)
2377                                         process_native_file(s, fds[0], ucred, tv, label, label_len);
2378                                 else if (n_fds > 0)
2379                                         log_warning("Got too many file descriptors via native socket. Ignoring.");
2380                         }
2381
2382                         close_many(fds, n_fds);
2383                 }
2384
2385                 return 1;
2386
2387         } else if (ev->data.fd == s->stdout_fd) {
2388
2389                 if (ev->events != EPOLLIN) {
2390                         log_info("Got invalid event from epoll.");
2391                         return -EIO;
2392                 }
2393
2394                 stdout_stream_new(s);
2395                 return 1;
2396
2397         } else {
2398                 StdoutStream *stream;
2399
2400                 if ((ev->events|EPOLLIN|EPOLLHUP) != (EPOLLIN|EPOLLHUP)) {
2401                         log_info("Got invalid event from epoll.");
2402                         return -EIO;
2403                 }
2404
2405                 /* If it is none of the well-known fds, it must be an
2406                  * stdout stream fd. Note that this is a bit ugly here
2407                  * (since we rely that none of the well-known fds
2408                  * could be interpreted as pointer), but nonetheless
2409                  * safe, since the well-known fds would never get an
2410                  * fd > 4096, i.e. beyond the first memory page */
2411
2412                 stream = ev->data.ptr;
2413
2414                 if (stdout_stream_process(stream) <= 0)
2415                         stdout_stream_free(stream);
2416
2417                 return 1;
2418         }
2419
2420         log_error("Unknown event.");
2421         return 0;
2422 }
2423
2424 static int open_syslog_socket(Server *s) {
2425         union sockaddr_union sa;
2426         int one, r;
2427         struct epoll_event ev;
2428
2429         assert(s);
2430
2431         if (s->syslog_fd < 0) {
2432
2433                 s->syslog_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
2434                 if (s->syslog_fd < 0) {
2435                         log_error("socket() failed: %m");
2436                         return -errno;
2437                 }
2438
2439                 zero(sa);
2440                 sa.un.sun_family = AF_UNIX;
2441                 strncpy(sa.un.sun_path, "/dev/log", sizeof(sa.un.sun_path));
2442
2443                 unlink(sa.un.sun_path);
2444
2445                 r = bind(s->syslog_fd, &sa.sa, offsetof(union sockaddr_union, un.sun_path) + strlen(sa.un.sun_path));
2446                 if (r < 0) {
2447                         log_error("bind() failed: %m");
2448                         return -errno;
2449                 }
2450
2451                 chmod(sa.un.sun_path, 0666);
2452         } else
2453                 fd_nonblock(s->syslog_fd, 1);
2454
2455         one = 1;
2456         r = setsockopt(s->syslog_fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one));
2457         if (r < 0) {
2458                 log_error("SO_PASSCRED failed: %m");
2459                 return -errno;
2460         }
2461
2462 #ifdef HAVE_SELINUX
2463         one = 1;
2464         r = setsockopt(s->syslog_fd, SOL_SOCKET, SO_PASSSEC, &one, sizeof(one));
2465         if (r < 0)
2466                 log_warning("SO_PASSSEC failed: %m");
2467 #endif
2468
2469         one = 1;
2470         r = setsockopt(s->syslog_fd, SOL_SOCKET, SO_TIMESTAMP, &one, sizeof(one));
2471         if (r < 0) {
2472                 log_error("SO_TIMESTAMP failed: %m");
2473                 return -errno;
2474         }
2475
2476         zero(ev);
2477         ev.events = EPOLLIN;
2478         ev.data.fd = s->syslog_fd;
2479         if (epoll_ctl(s->epoll_fd, EPOLL_CTL_ADD, s->syslog_fd, &ev) < 0) {
2480                 log_error("Failed to add syslog server fd to epoll object: %m");
2481                 return -errno;
2482         }
2483
2484         return 0;
2485 }
2486
2487 static int open_native_socket(Server*s) {
2488         union sockaddr_union sa;
2489         int one, r;
2490         struct epoll_event ev;
2491
2492         assert(s);
2493
2494         if (s->native_fd < 0) {
2495
2496                 s->native_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
2497                 if (s->native_fd < 0) {
2498                         log_error("socket() failed: %m");
2499                         return -errno;
2500                 }
2501
2502                 zero(sa);
2503                 sa.un.sun_family = AF_UNIX;
2504                 strncpy(sa.un.sun_path, "/run/systemd/journal/socket", sizeof(sa.un.sun_path));
2505
2506                 unlink(sa.un.sun_path);
2507
2508                 r = bind(s->native_fd, &sa.sa, offsetof(union sockaddr_union, un.sun_path) + strlen(sa.un.sun_path));
2509                 if (r < 0) {
2510                         log_error("bind() failed: %m");
2511                         return -errno;
2512                 }
2513
2514                 chmod(sa.un.sun_path, 0666);
2515         } else
2516                 fd_nonblock(s->native_fd, 1);
2517
2518         one = 1;
2519         r = setsockopt(s->native_fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one));
2520         if (r < 0) {
2521                 log_error("SO_PASSCRED failed: %m");
2522                 return -errno;
2523         }
2524
2525 #ifdef HAVE_SELINUX
2526         one = 1;
2527         r = setsockopt(s->syslog_fd, SOL_SOCKET, SO_PASSSEC, &one, sizeof(one));
2528         if (r < 0)
2529                 log_warning("SO_PASSSEC failed: %m");
2530 #endif
2531
2532         one = 1;
2533         r = setsockopt(s->native_fd, SOL_SOCKET, SO_TIMESTAMP, &one, sizeof(one));
2534         if (r < 0) {
2535                 log_error("SO_TIMESTAMP failed: %m");
2536                 return -errno;
2537         }
2538
2539         zero(ev);
2540         ev.events = EPOLLIN;
2541         ev.data.fd = s->native_fd;
2542         if (epoll_ctl(s->epoll_fd, EPOLL_CTL_ADD, s->native_fd, &ev) < 0) {
2543                 log_error("Failed to add native server fd to epoll object: %m");
2544                 return -errno;
2545         }
2546
2547         return 0;
2548 }
2549
2550 static int open_stdout_socket(Server *s) {
2551         union sockaddr_union sa;
2552         int r;
2553         struct epoll_event ev;
2554
2555         assert(s);
2556
2557         if (s->stdout_fd < 0) {
2558
2559                 s->stdout_fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
2560                 if (s->stdout_fd < 0) {
2561                         log_error("socket() failed: %m");
2562                         return -errno;
2563                 }
2564
2565                 zero(sa);
2566                 sa.un.sun_family = AF_UNIX;
2567                 strncpy(sa.un.sun_path, "/run/systemd/journal/stdout", sizeof(sa.un.sun_path));
2568
2569                 unlink(sa.un.sun_path);
2570
2571                 r = bind(s->stdout_fd, &sa.sa, offsetof(union sockaddr_union, un.sun_path) + strlen(sa.un.sun_path));
2572                 if (r < 0) {
2573                         log_error("bind() failed: %m");
2574                         return -errno;
2575                 }
2576
2577                 chmod(sa.un.sun_path, 0666);
2578
2579                 if (listen(s->stdout_fd, SOMAXCONN) < 0) {
2580                         log_error("liste() failed: %m");
2581                         return -errno;
2582                 }
2583         } else
2584                 fd_nonblock(s->stdout_fd, 1);
2585
2586         zero(ev);
2587         ev.events = EPOLLIN;
2588         ev.data.fd = s->stdout_fd;
2589         if (epoll_ctl(s->epoll_fd, EPOLL_CTL_ADD, s->stdout_fd, &ev) < 0) {
2590                 log_error("Failed to add stdout server fd to epoll object: %m");
2591                 return -errno;
2592         }
2593
2594         return 0;
2595 }
2596
2597 static int open_proc_kmsg(Server *s) {
2598         struct epoll_event ev;
2599
2600         assert(s);
2601
2602         if (!s->import_proc_kmsg)
2603                 return 0;
2604
2605         s->proc_kmsg_fd = open("/proc/kmsg", O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY);
2606         if (s->proc_kmsg_fd < 0) {
2607                 log_warning("Failed to open /proc/kmsg, ignoring: %m");
2608                 return 0;
2609         }
2610
2611         zero(ev);
2612         ev.events = EPOLLIN;
2613         ev.data.fd = s->proc_kmsg_fd;
2614         if (epoll_ctl(s->epoll_fd, EPOLL_CTL_ADD, s->proc_kmsg_fd, &ev) < 0) {
2615                 log_error("Failed to add /proc/kmsg fd to epoll object: %m");
2616                 return -errno;
2617         }
2618
2619         return 0;
2620 }
2621
2622 static int open_signalfd(Server *s) {
2623         sigset_t mask;
2624         struct epoll_event ev;
2625
2626         assert(s);
2627
2628         assert_se(sigemptyset(&mask) == 0);
2629         sigset_add_many(&mask, SIGINT, SIGTERM, SIGUSR1, SIGUSR2, -1);
2630         assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
2631
2632         s->signal_fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
2633         if (s->signal_fd < 0) {
2634                 log_error("signalfd(): %m");
2635                 return -errno;
2636         }
2637
2638         zero(ev);
2639         ev.events = EPOLLIN;
2640         ev.data.fd = s->signal_fd;
2641
2642         if (epoll_ctl(s->epoll_fd, EPOLL_CTL_ADD, s->signal_fd, &ev) < 0) {
2643                 log_error("epoll_ctl(): %m");
2644                 return -errno;
2645         }
2646
2647         return 0;
2648 }
2649
2650 static int server_parse_proc_cmdline(Server *s) {
2651         char *line, *w, *state;
2652         int r;
2653         size_t l;
2654
2655         if (detect_container(NULL) > 0)
2656                 return 0;
2657
2658         r = read_one_line_file("/proc/cmdline", &line);
2659         if (r < 0) {
2660                 log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
2661                 return 0;
2662         }
2663
2664         FOREACH_WORD_QUOTED(w, l, line, state) {
2665                 char *word;
2666
2667                 word = strndup(w, l);
2668                 if (!word) {
2669                         r = -ENOMEM;
2670                         goto finish;
2671                 }
2672
2673                 if (startswith(word, "systemd.journald.forward_to_syslog=")) {
2674                         r = parse_boolean(word + 35);
2675                         if (r < 0)
2676                                 log_warning("Failed to parse forward to syslog switch %s. Ignoring.", word + 35);
2677                         else
2678                                 s->forward_to_syslog = r;
2679                 } else if (startswith(word, "systemd.journald.forward_to_kmsg=")) {
2680                         r = parse_boolean(word + 33);
2681                         if (r < 0)
2682                                 log_warning("Failed to parse forward to kmsg switch %s. Ignoring.", word + 33);
2683                         else
2684                                 s->forward_to_kmsg = r;
2685                 } else if (startswith(word, "systemd.journald.forward_to_console=")) {
2686                         r = parse_boolean(word + 36);
2687                         if (r < 0)
2688                                 log_warning("Failed to parse forward to console switch %s. Ignoring.", word + 36);
2689                         else
2690                                 s->forward_to_console = r;
2691                 } else if (startswith(word, "systemd.journald"))
2692                         log_warning("Invalid systemd.journald parameter. Ignoring.");
2693
2694                 free(word);
2695         }
2696
2697         r = 0;
2698
2699 finish:
2700         free(line);
2701         return r;
2702 }
2703
2704 static int server_parse_config_file(Server *s) {
2705         FILE *f;
2706         const char *fn;
2707         int r;
2708
2709         assert(s);
2710
2711         fn = "/etc/systemd/journald.conf";
2712         f = fopen(fn, "re");
2713         if (!f) {
2714                 if (errno == ENOENT)
2715                         return 0;
2716
2717                 log_warning("Failed to open configuration file %s: %m", fn);
2718                 return -errno;
2719         }
2720
2721         r = config_parse(fn, f, "Journal\0", config_item_perf_lookup, (void*) journald_gperf_lookup, false, s);
2722         if (r < 0)
2723                 log_warning("Failed to parse configuration file: %s", strerror(-r));
2724
2725         fclose(f);
2726
2727         return r;
2728 }
2729
2730 static int server_init(Server *s) {
2731         int n, r, fd;
2732
2733         assert(s);
2734
2735         zero(*s);
2736         s->syslog_fd = s->native_fd = s->stdout_fd = s->signal_fd = s->epoll_fd = s->proc_kmsg_fd = -1;
2737         s->compress = true;
2738
2739         s->rate_limit_interval = DEFAULT_RATE_LIMIT_INTERVAL;
2740         s->rate_limit_burst = DEFAULT_RATE_LIMIT_BURST;
2741
2742         s->forward_to_syslog = true;
2743
2744         s->max_level_store = LOG_DEBUG;
2745         s->max_level_syslog = LOG_DEBUG;
2746         s->max_level_kmsg = LOG_NOTICE;
2747         s->max_level_console = LOG_INFO;
2748
2749         memset(&s->system_metrics, 0xFF, sizeof(s->system_metrics));
2750         memset(&s->runtime_metrics, 0xFF, sizeof(s->runtime_metrics));
2751
2752         server_parse_config_file(s);
2753         server_parse_proc_cmdline(s);
2754
2755         s->user_journals = hashmap_new(trivial_hash_func, trivial_compare_func);
2756         if (!s->user_journals) {
2757                 log_error("Out of memory.");
2758                 return -ENOMEM;
2759         }
2760
2761         s->epoll_fd = epoll_create1(EPOLL_CLOEXEC);
2762         if (s->epoll_fd < 0) {
2763                 log_error("Failed to create epoll object: %m");
2764                 return -errno;
2765         }
2766
2767         n = sd_listen_fds(true);
2768         if (n < 0) {
2769                 log_error("Failed to read listening file descriptors from environment: %s", strerror(-n));
2770                 return n;
2771         }
2772
2773         for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd++) {
2774
2775                 if (sd_is_socket_unix(fd, SOCK_DGRAM, -1, "/run/systemd/journal/socket", 0) > 0) {
2776
2777                         if (s->native_fd >= 0) {
2778                                 log_error("Too many native sockets passed.");
2779                                 return -EINVAL;
2780                         }
2781
2782                         s->native_fd = fd;
2783
2784                 } else if (sd_is_socket_unix(fd, SOCK_STREAM, 1, "/run/systemd/journal/stdout", 0) > 0) {
2785
2786                         if (s->stdout_fd >= 0) {
2787                                 log_error("Too many stdout sockets passed.");
2788                                 return -EINVAL;
2789                         }
2790
2791                         s->stdout_fd = fd;
2792
2793                 } else if (sd_is_socket_unix(fd, SOCK_DGRAM, -1, "/dev/log", 0) > 0) {
2794
2795                         if (s->syslog_fd >= 0) {
2796                                 log_error("Too many /dev/log sockets passed.");
2797                                 return -EINVAL;
2798                         }
2799
2800                         s->syslog_fd = fd;
2801
2802                 } else {
2803                         log_error("Unknown socket passed.");
2804                         return -EINVAL;
2805                 }
2806         }
2807
2808         r = open_syslog_socket(s);
2809         if (r < 0)
2810                 return r;
2811
2812         r = open_native_socket(s);
2813         if (r < 0)
2814                 return r;
2815
2816         r = open_stdout_socket(s);
2817         if (r < 0)
2818                 return r;
2819
2820         r = open_proc_kmsg(s);
2821         if (r < 0)
2822                 return r;
2823
2824         r = open_signalfd(s);
2825         if (r < 0)
2826                 return r;
2827
2828         s->rate_limit = journal_rate_limit_new(s->rate_limit_interval, s->rate_limit_burst);
2829         if (!s->rate_limit)
2830                 return -ENOMEM;
2831
2832         r = system_journal_open(s);
2833         if (r < 0)
2834                 return r;
2835
2836         return 0;
2837 }
2838
2839 static void server_done(Server *s) {
2840         JournalFile *f;
2841         assert(s);
2842
2843         while (s->stdout_streams)
2844                 stdout_stream_free(s->stdout_streams);
2845
2846         if (s->system_journal)
2847                 journal_file_close(s->system_journal);
2848
2849         if (s->runtime_journal)
2850                 journal_file_close(s->runtime_journal);
2851
2852         while ((f = hashmap_steal_first(s->user_journals)))
2853                 journal_file_close(f);
2854
2855         hashmap_free(s->user_journals);
2856
2857         if (s->epoll_fd >= 0)
2858                 close_nointr_nofail(s->epoll_fd);
2859
2860         if (s->signal_fd >= 0)
2861                 close_nointr_nofail(s->signal_fd);
2862
2863         if (s->syslog_fd >= 0)
2864                 close_nointr_nofail(s->syslog_fd);
2865
2866         if (s->native_fd >= 0)
2867                 close_nointr_nofail(s->native_fd);
2868
2869         if (s->stdout_fd >= 0)
2870                 close_nointr_nofail(s->stdout_fd);
2871
2872         if (s->proc_kmsg_fd >= 0)
2873                 close_nointr_nofail(s->proc_kmsg_fd);
2874
2875         if (s->rate_limit)
2876                 journal_rate_limit_free(s->rate_limit);
2877
2878         free(s->buffer);
2879         free(s->tty_path);
2880 }
2881
2882 int main(int argc, char *argv[]) {
2883         Server server;
2884         int r;
2885
2886         /* if (getppid() != 1) { */
2887         /*         log_error("This program should be invoked by init only."); */
2888         /*         return EXIT_FAILURE; */
2889         /* } */
2890
2891         if (argc > 1) {
2892                 log_error("This program does not take arguments.");
2893                 return EXIT_FAILURE;
2894         }
2895
2896         log_set_target(LOG_TARGET_SAFE);
2897         log_set_facility(LOG_SYSLOG);
2898         log_parse_environment();
2899         log_open();
2900
2901         umask(0022);
2902
2903         r = server_init(&server);
2904         if (r < 0)
2905                 goto finish;
2906
2907         server_vacuum(&server);
2908         server_flush_to_var(&server);
2909         server_flush_proc_kmsg(&server);
2910
2911         log_debug("systemd-journald running as pid %lu", (unsigned long) getpid());
2912         driver_message(&server, SD_MESSAGE_JOURNAL_START, "Journal started");
2913
2914         sd_notify(false,
2915                   "READY=1\n"
2916                   "STATUS=Processing requests...");
2917
2918         for (;;) {
2919                 struct epoll_event event;
2920
2921                 r = epoll_wait(server.epoll_fd, &event, 1, -1);
2922                 if (r < 0) {
2923
2924                         if (errno == EINTR)
2925                                 continue;
2926
2927                         log_error("epoll_wait() failed: %m");
2928                         r = -errno;
2929                         goto finish;
2930                 } else if (r == 0)
2931                         break;
2932
2933                 r = process_event(&server, &event);
2934                 if (r < 0)
2935                         goto finish;
2936                 else if (r == 0)
2937                         break;
2938         }
2939
2940         log_debug("systemd-journald stopped as pid %lu", (unsigned long) getpid());
2941         driver_message(&server, SD_MESSAGE_JOURNAL_STOP, "Journal stopped");
2942
2943 finish:
2944         sd_notify(false,
2945                   "STATUS=Shutting down...");
2946
2947         server_done(&server);
2948
2949         return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
2950 }