]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/journal/journald-server.c
Merge pull request #12222 from yuwata/macsec
[thirdparty/systemd.git] / src / journal / journald-server.c
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
d025f1e4 2
349cc4a5 3#if HAVE_SELINUX
24882e06
LP
4#include <selinux/selinux.h>
5#endif
8580d1f7
LP
6#include <sys/ioctl.h>
7#include <sys/mman.h>
8#include <sys/signalfd.h>
9#include <sys/statvfs.h>
07630cea 10#include <linux/sockios.h>
24882e06 11
8580d1f7 12#include "sd-daemon.h"
74df0fca
LP
13#include "sd-journal.h"
14#include "sd-messages.h"
8580d1f7
LP
15
16#include "acl-util.h"
b5efdb8a 17#include "alloc-util.h"
430f0182 18#include "audit-util.h"
d025f1e4 19#include "cgroup-util.h"
d025f1e4 20#include "conf-parser.h"
a0956174 21#include "dirent-util.h"
0dec689b 22#include "extract-word.h"
3ffd4af2 23#include "fd-util.h"
33d52ab9 24#include "fileio.h"
f97b34a6 25#include "format-util.h"
f4f15635 26#include "fs-util.h"
8580d1f7 27#include "hashmap.h"
958b66ea 28#include "hostname-util.h"
4b58153d 29#include "id128-util.h"
afc5dbf3 30#include "io-util.h"
8580d1f7
LP
31#include "journal-authenticate.h"
32#include "journal-file.h"
d025f1e4
ZJS
33#include "journal-internal.h"
34#include "journal-vacuum.h"
8580d1f7 35#include "journald-audit.h"
22e3a02b 36#include "journald-context.h"
d025f1e4 37#include "journald-kmsg.h"
d025f1e4 38#include "journald-native.h"
8580d1f7 39#include "journald-rate-limit.h"
3ffd4af2 40#include "journald-server.h"
8580d1f7
LP
41#include "journald-stream.h"
42#include "journald-syslog.h"
4b58153d 43#include "log.h"
07630cea
LP
44#include "missing.h"
45#include "mkdir.h"
6bedfcbb 46#include "parse-util.h"
4e731273 47#include "proc-cmdline.h"
07630cea
LP
48#include "process-util.h"
49#include "rm-rf.h"
50#include "selinux-util.h"
51#include "signal-util.h"
52#include "socket-util.h"
32917e33 53#include "stdio-util.h"
8b43440b 54#include "string-table.h"
07630cea 55#include "string-util.h"
863a5610 56#include "syslog-util.h"
22e3a02b 57#include "user-util.h"
d025f1e4 58
d025f1e4
ZJS
59#define USER_JOURNALS_MAX 1024
60
26687bf8 61#define DEFAULT_SYNC_INTERVAL_USEC (5*USEC_PER_MINUTE)
7f1ad696 62#define DEFAULT_RATE_LIMIT_INTERVAL (30*USEC_PER_SEC)
3de8ff5a 63#define DEFAULT_RATE_LIMIT_BURST 10000
e150e820 64#define DEFAULT_MAX_FILE_USEC USEC_PER_MONTH
d025f1e4 65
8580d1f7 66#define RECHECK_SPACE_USEC (30*USEC_PER_SEC)
d025f1e4 67
e22aa3d3
LP
68#define NOTIFY_SNDBUF_SIZE (8*1024*1024)
69
7a24f3bf
VC
70/* The period to insert between posting changes for coalescing */
71#define POST_CHANGE_TIMER_INTERVAL_USEC (250*USEC_PER_MSEC)
72
ec20fe5f
LP
73/* Pick a good default that is likely to fit into AF_UNIX and AF_INET SOCK_DGRAM datagrams, and even leaves some room
74 * for a bit of additional metadata. */
75#define DEFAULT_LINE_MAX (48*1024)
76
a33687b7
LP
77#define DEFERRED_CLOSES_MAX (4096)
78
e0ed6db9
FB
79static int determine_path_usage(Server *s, const char *path, uint64_t *ret_used, uint64_t *ret_free) {
80 _cleanup_closedir_ DIR *d = NULL;
81 struct dirent *de;
82 struct statvfs ss;
e0ed6db9
FB
83
84 assert(ret_used);
85 assert(ret_free);
86
266a4700 87 d = opendir(path);
e0ed6db9
FB
88 if (!d)
89 return log_full_errno(errno == ENOENT ? LOG_DEBUG : LOG_ERR,
266a4700 90 errno, "Failed to open %s: %m", path);
e0ed6db9
FB
91
92 if (fstatvfs(dirfd(d), &ss) < 0)
266a4700 93 return log_error_errno(errno, "Failed to fstatvfs(%s): %m", path);
e0ed6db9
FB
94
95 *ret_free = ss.f_bsize * ss.f_bavail;
96 *ret_used = 0;
97 FOREACH_DIRENT_ALL(de, d, break) {
98 struct stat st;
99
100 if (!endswith(de->d_name, ".journal") &&
101 !endswith(de->d_name, ".journal~"))
102 continue;
103
104 if (fstatat(dirfd(d), de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0) {
266a4700 105 log_debug_errno(errno, "Failed to stat %s/%s, ignoring: %m", path, de->d_name);
e0ed6db9
FB
106 continue;
107 }
108
109 if (!S_ISREG(st.st_mode))
110 continue;
111
112 *ret_used += (uint64_t) st.st_blocks * 512UL;
113 }
114
115 return 0;
116}
117
a0edc477 118static void cache_space_invalidate(JournalStorageSpace *space) {
67319249 119 zero(*space);
a0edc477
FB
120}
121
57f443a6 122static int cache_space_refresh(Server *s, JournalStorage *storage) {
23aba343 123 JournalStorageSpace *space;
266a4700 124 JournalMetrics *metrics;
23aba343 125 uint64_t vfs_used, vfs_avail, avail;
d025f1e4 126 usec_t ts;
e0ed6db9 127 int r;
d025f1e4 128
8580d1f7 129 assert(s);
266a4700 130
266a4700 131 metrics = &storage->metrics;
23aba343 132 space = &storage->space;
d025f1e4 133
8580d1f7 134 ts = now(CLOCK_MONOTONIC);
d025f1e4 135
3099caf2 136 if (space->timestamp != 0 && space->timestamp + RECHECK_SPACE_USEC > ts)
d025f1e4
ZJS
137 return 0;
138
23aba343 139 r = determine_path_usage(s, storage->path, &vfs_used, &vfs_avail);
e0ed6db9
FB
140 if (r < 0)
141 return r;
d025f1e4 142
23aba343
FB
143 space->vfs_used = vfs_used;
144 space->vfs_available = vfs_avail;
145
146 avail = LESS_BY(vfs_avail, metrics->keep_free);
147
23aba343
FB
148 space->limit = MIN(MAX(vfs_used + avail, metrics->min_use), metrics->max_use);
149 space->available = LESS_BY(space->limit, vfs_used);
150 space->timestamp = ts;
8580d1f7
LP
151 return 1;
152}
153
3a19f215
FB
154static void patch_min_use(JournalStorage *storage) {
155 assert(storage);
156
157 /* Let's bump the min_use limit to the current usage on disk. We do
158 * this when starting up and first opening the journal files. This way
159 * sudden spikes in disk usage will not cause journald to vacuum files
160 * without bounds. Note that this means that only a restart of journald
161 * will make it reset this value. */
162
163 storage->metrics.min_use = MAX(storage->metrics.min_use, storage->space.vfs_used);
164}
165
3a19f215 166static int determine_space(Server *s, uint64_t *available, uint64_t *limit) {
266a4700 167 JournalStorage *js;
57f443a6 168 int r;
8580d1f7
LP
169
170 assert(s);
171
266a4700 172 js = s->system_journal ? &s->system_storage : &s->runtime_storage;
57f443a6
FB
173
174 r = cache_space_refresh(s, js);
175 if (r >= 0) {
176 if (available)
177 *available = js->space.available;
178 if (limit)
179 *limit = js->space.limit;
180 }
181 return r;
d025f1e4
ZJS
182}
183
cba5629e
FB
184void server_space_usage_message(Server *s, JournalStorage *storage) {
185 char fb1[FORMAT_BYTES_MAX], fb2[FORMAT_BYTES_MAX], fb3[FORMAT_BYTES_MAX],
186 fb4[FORMAT_BYTES_MAX], fb5[FORMAT_BYTES_MAX], fb6[FORMAT_BYTES_MAX];
187 JournalMetrics *metrics;
cba5629e
FB
188
189 assert(s);
190
191 if (!storage)
192 storage = s->system_journal ? &s->system_storage : &s->runtime_storage;
193
57f443a6 194 if (cache_space_refresh(s, storage) < 0)
cba5629e
FB
195 return;
196
197 metrics = &storage->metrics;
23aba343 198 format_bytes(fb1, sizeof(fb1), storage->space.vfs_used);
cba5629e
FB
199 format_bytes(fb2, sizeof(fb2), metrics->max_use);
200 format_bytes(fb3, sizeof(fb3), metrics->keep_free);
23aba343 201 format_bytes(fb4, sizeof(fb4), storage->space.vfs_available);
cba5629e
FB
202 format_bytes(fb5, sizeof(fb5), storage->space.limit);
203 format_bytes(fb6, sizeof(fb6), storage->space.available);
204
13181942
LP
205 server_driver_message(s, 0,
206 "MESSAGE_ID=" SD_MESSAGE_JOURNAL_USAGE_STR,
cba5629e
FB
207 LOG_MESSAGE("%s (%s) is %s, max %s, %s free.",
208 storage->name, storage->path, fb1, fb5, fb6),
209 "JOURNAL_NAME=%s", storage->name,
210 "JOURNAL_PATH=%s", storage->path,
23aba343 211 "CURRENT_USE=%"PRIu64, storage->space.vfs_used,
cba5629e
FB
212 "CURRENT_USE_PRETTY=%s", fb1,
213 "MAX_USE=%"PRIu64, metrics->max_use,
214 "MAX_USE_PRETTY=%s", fb2,
215 "DISK_KEEP_FREE=%"PRIu64, metrics->keep_free,
216 "DISK_KEEP_FREE_PRETTY=%s", fb3,
23aba343 217 "DISK_AVAILABLE=%"PRIu64, storage->space.vfs_available,
cba5629e
FB
218 "DISK_AVAILABLE_PRETTY=%s", fb4,
219 "LIMIT=%"PRIu64, storage->space.limit,
220 "LIMIT_PRETTY=%s", fb5,
221 "AVAILABLE=%"PRIu64, storage->space.available,
222 "AVAILABLE_PRETTY=%s", fb6,
223 NULL);
224}
225
2fce06b0
LP
226static bool uid_for_system_journal(uid_t uid) {
227
228 /* Returns true if the specified UID shall get its data stored in the system journal*/
229
230 return uid_is_system(uid) || uid_is_dynamic(uid) || uid == UID_NOBODY;
231}
232
5c3bde3f 233static void server_add_acls(JournalFile *f, uid_t uid) {
349cc4a5 234#if HAVE_ACL
5c3bde3f 235 int r;
d025f1e4 236#endif
d025f1e4
ZJS
237 assert(f);
238
349cc4a5 239#if HAVE_ACL
2fce06b0 240 if (uid_for_system_journal(uid))
d025f1e4
ZJS
241 return;
242
5c3bde3f
ZJS
243 r = add_acls_for_user(f->fd, uid);
244 if (r < 0)
245 log_warning_errno(r, "Failed to set ACL on %s, ignoring: %m", f->path);
d025f1e4
ZJS
246#endif
247}
248
7a24f3bf
VC
249static int open_journal(
250 Server *s,
251 bool reliably,
252 const char *fname,
253 int flags,
254 bool seal,
255 JournalMetrics *metrics,
7a24f3bf 256 JournalFile **ret) {
e8591544 257
e167d7fd 258 JournalFile *f;
e8591544 259 int r;
7a24f3bf
VC
260
261 assert(s);
262 assert(fname);
263 assert(ret);
264
265 if (reliably)
1b7cf0e5
AG
266 r = journal_file_open_reliably(fname, flags, 0640, s->compress.enabled, s->compress.threshold_bytes,
267 seal, metrics, s->mmap, s->deferred_closes, NULL, &f);
7a24f3bf 268 else
1b7cf0e5
AG
269 r = journal_file_open(-1, fname, flags, 0640, s->compress.enabled, s->compress.threshold_bytes, seal,
270 metrics, s->mmap, s->deferred_closes, NULL, &f);
271
7a24f3bf
VC
272 if (r < 0)
273 return r;
274
e167d7fd 275 r = journal_file_enable_post_change_timer(f, s->event, POST_CHANGE_TIMER_INTERVAL_USEC);
7a24f3bf 276 if (r < 0) {
69a3a6fd 277 (void) journal_file_close(f);
7a24f3bf
VC
278 return r;
279 }
280
e167d7fd 281 *ret = f;
7a24f3bf
VC
282 return r;
283}
284
6431c7e2 285static bool flushed_flag_is_set(void) {
f78273c8 286 return access("/run/systemd/journal/flushed", F_OK) >= 0;
6431c7e2
VC
287}
288
105bdb46
VC
289static int system_journal_open(Server *s, bool flush_requested) {
290 const char *fn;
291 int r = 0;
292
293 if (!s->system_journal &&
f78273c8
LP
294 IN_SET(s->storage, STORAGE_PERSISTENT, STORAGE_AUTO) &&
295 (flush_requested || flushed_flag_is_set())) {
105bdb46
VC
296
297 /* If in auto mode: first try to create the machine
298 * path, but not the prefix.
299 *
300 * If in persistent mode: create /var/log/journal and
301 * the machine path */
302
303 if (s->storage == STORAGE_PERSISTENT)
304 (void) mkdir_p("/var/log/journal/", 0755);
305
266a4700 306 (void) mkdir(s->system_storage.path, 0755);
105bdb46 307
266a4700
FB
308 fn = strjoina(s->system_storage.path, "/system.journal");
309 r = open_journal(s, true, fn, O_RDWR|O_CREAT, s->seal, &s->system_storage.metrics, &s->system_journal);
105bdb46
VC
310 if (r >= 0) {
311 server_add_acls(s->system_journal, 0);
57f443a6 312 (void) cache_space_refresh(s, &s->system_storage);
3a19f215 313 patch_min_use(&s->system_storage);
29bfb683 314 } else {
4c701096 315 if (!IN_SET(r, -ENOENT, -EROFS))
105bdb46
VC
316 log_warning_errno(r, "Failed to open system journal: %m");
317
318 r = 0;
319 }
929eeb54
VC
320
321 /* If the runtime journal is open, and we're post-flush, we're
322 * recovering from a failed system journal rotate (ENOSPC)
323 * for which the runtime journal was reopened.
324 *
325 * Perform an implicit flush to var, leaving the runtime
326 * journal closed, now that the system journal is back.
327 */
f78273c8
LP
328 if (!flush_requested)
329 (void) server_flush_to_var(s, true);
105bdb46
VC
330 }
331
332 if (!s->runtime_journal &&
333 (s->storage != STORAGE_NONE)) {
334
266a4700 335 fn = strjoina(s->runtime_storage.path, "/system.journal");
105bdb46
VC
336
337 if (s->system_journal) {
338
339 /* Try to open the runtime journal, but only
340 * if it already exists, so that we can flush
341 * it into the system journal */
342
266a4700 343 r = open_journal(s, false, fn, O_RDWR, false, &s->runtime_storage.metrics, &s->runtime_journal);
105bdb46
VC
344 if (r < 0) {
345 if (r != -ENOENT)
346 log_warning_errno(r, "Failed to open runtime journal: %m");
347
348 r = 0;
349 }
350
351 } else {
352
353 /* OK, we really need the runtime journal, so create
354 * it if necessary. */
355
356 (void) mkdir("/run/log", 0755);
357 (void) mkdir("/run/log/journal", 0755);
358 (void) mkdir_parents(fn, 0750);
359
266a4700 360 r = open_journal(s, true, fn, O_RDWR|O_CREAT, false, &s->runtime_storage.metrics, &s->runtime_journal);
105bdb46
VC
361 if (r < 0)
362 return log_error_errno(r, "Failed to open runtime journal: %m");
363 }
364
365 if (s->runtime_journal) {
366 server_add_acls(s->runtime_journal, 0);
57f443a6 367 (void) cache_space_refresh(s, &s->runtime_storage);
3a19f215 368 patch_min_use(&s->runtime_storage);
105bdb46
VC
369 }
370 }
371
372 return r;
373}
374
d025f1e4 375static JournalFile* find_journal(Server *s, uid_t uid) {
ed375beb 376 _cleanup_free_ char *p = NULL;
d025f1e4
ZJS
377 int r;
378 JournalFile *f;
379 sd_id128_t machine;
380
381 assert(s);
382
105bdb46
VC
383 /* A rotate that fails to create the new journal (ENOSPC) leaves the
384 * rotated journal as NULL. Unless we revisit opening, even after
385 * space is made available we'll continue to return NULL indefinitely.
386 *
387 * system_journal_open() is a noop if the journals are already open, so
388 * we can just call it here to recover from failed rotates (or anything
389 * else that's left the journals as NULL).
390 *
391 * Fixes https://github.com/systemd/systemd/issues/3968 */
392 (void) system_journal_open(s, false);
393
d025f1e4
ZJS
394 /* We split up user logs only on /var, not on /run. If the
395 * runtime file is open, we write to it exclusively, in order
396 * to guarantee proper order as soon as we flush /run to
397 * /var and close the runtime file. */
398
399 if (s->runtime_journal)
400 return s->runtime_journal;
401
2fce06b0 402 if (uid_for_system_journal(uid))
d025f1e4
ZJS
403 return s->system_journal;
404
4a0b58c4 405 f = ordered_hashmap_get(s->user_journals, UID_TO_PTR(uid));
d025f1e4
ZJS
406 if (f)
407 return f;
408
e8591544
LP
409 r = sd_id128_get_machine(&machine);
410 if (r < 0) {
411 log_debug_errno(r, "Failed to determine machine ID, using system log: %m");
412 return s->system_journal;
413 }
414
de0671ee 415 if (asprintf(&p, "/var/log/journal/" SD_ID128_FORMAT_STR "/user-"UID_FMT".journal",
d0307775
LP
416 SD_ID128_FORMAT_VAL(machine), uid) < 0) {
417 log_oom();
d025f1e4 418 return s->system_journal;
d0307775 419 }
d025f1e4 420
43cf8388 421 while (ordered_hashmap_size(s->user_journals) >= USER_JOURNALS_MAX) {
d025f1e4 422 /* Too many open? Then let's close one */
43cf8388 423 f = ordered_hashmap_steal_first(s->user_journals);
d025f1e4 424 assert(f);
69a3a6fd 425 (void) journal_file_close(f);
d025f1e4
ZJS
426 }
427
266a4700 428 r = open_journal(s, true, p, O_RDWR|O_CREAT, s->seal, &s->system_storage.metrics, &f);
d025f1e4
ZJS
429 if (r < 0)
430 return s->system_journal;
431
5c3bde3f 432 server_add_acls(f, uid);
d025f1e4 433
4a0b58c4 434 r = ordered_hashmap_put(s->user_journals, UID_TO_PTR(uid), f);
d025f1e4 435 if (r < 0) {
69a3a6fd 436 (void) journal_file_close(f);
d025f1e4
ZJS
437 return s->system_journal;
438 }
439
440 return f;
441}
442
ea69bd41
LP
443static int do_rotate(
444 Server *s,
445 JournalFile **f,
446 const char* name,
447 bool seal,
448 uint32_t uid) {
449
fc55baee
ZJS
450 int r;
451 assert(s);
452
453 if (!*f)
454 return -EINVAL;
455
1b7cf0e5 456 r = journal_file_rotate(f, s->compress.enabled, s->compress.threshold_bytes, seal, s->deferred_closes);
bb6b922f 457 if (r < 0) {
fc55baee 458 if (*f)
bb6b922f 459 return log_error_errno(r, "Failed to rotate %s: %m", (*f)->path);
fc55baee 460 else
bb6b922f
YW
461 return log_error_errno(r, "Failed to create new %s journal: %m", name);
462 }
463
464 server_add_acls(*f, uid);
2678031a 465
fc55baee
ZJS
466 return r;
467}
468
f760d8a8
LP
469static void server_process_deferred_closes(Server *s) {
470 JournalFile *f;
471 Iterator i;
472
473 /* Perform any deferred closes which aren't still offlining. */
a33687b7
LP
474 SET_FOREACH(f, s->deferred_closes, i) {
475 if (journal_file_is_offlining(f))
476 continue;
477
478 (void) set_remove(s->deferred_closes, f);
479 (void) journal_file_close(f);
480 }
481}
482
483static void server_vacuum_deferred_closes(Server *s) {
484 assert(s);
485
486 /* Make some room in the deferred closes list, so that it doesn't grow without bounds */
487 if (set_size(s->deferred_closes) < DEFERRED_CLOSES_MAX)
488 return;
489
490 /* Let's first remove all journal files that might already have completed closing */
491 server_process_deferred_closes(s);
492
493 /* And now, let's close some more until we reach the limit again. */
494 while (set_size(s->deferred_closes) >= DEFERRED_CLOSES_MAX) {
495 JournalFile *f;
496
497 assert_se(f = set_steal_first(s->deferred_closes));
498 journal_file_close(f);
499 }
500}
501
502static int open_user_journal_directory(Server *s, DIR **ret_dir, char **ret_path) {
503 _cleanup_closedir_ DIR *dir = NULL;
504 _cleanup_free_ char *path = NULL;
505 sd_id128_t machine;
506 int r;
507
508 assert(s);
509
510 r = sd_id128_get_machine(&machine);
511 if (r < 0)
512 return log_error_errno(r, "Failed to determine machine ID, ignoring: %m");
513
514 if (asprintf(&path, "/var/log/journal/" SD_ID128_FORMAT_STR "/", SD_ID128_FORMAT_VAL(machine)) < 0)
515 return log_oom();
516
517 dir = opendir(path);
518 if (!dir)
519 return log_error_errno(errno, "Failed to open user journal directory '%s': %m", path);
520
521 if (ret_dir)
522 *ret_dir = TAKE_PTR(dir);
523 if (ret_path)
524 *ret_path = TAKE_PTR(path);
525
526 return 0;
f760d8a8
LP
527}
528
d025f1e4 529void server_rotate(Server *s) {
a33687b7
LP
530 _cleanup_free_ char *path = NULL;
531 _cleanup_closedir_ DIR *d = NULL;
d025f1e4 532 JournalFile *f;
d025f1e4 533 Iterator i;
a33687b7 534 void *k;
d025f1e4
ZJS
535 int r;
536
537 log_debug("Rotating...");
538
a33687b7 539 /* First, rotate the system journal (either in its runtime flavour or in its runtime flavour) */
8580d1f7
LP
540 (void) do_rotate(s, &s->runtime_journal, "runtime", false, 0);
541 (void) do_rotate(s, &s->system_journal, "system", s->seal, 0);
d025f1e4 542
a33687b7 543 /* Then, rotate all user journals we have open (keeping them open) */
43cf8388 544 ORDERED_HASHMAP_FOREACH_KEY(f, k, s->user_journals, i) {
4a0b58c4 545 r = do_rotate(s, &f, "user", s->seal, PTR_TO_UID(k));
fc55baee 546 if (r >= 0)
43cf8388 547 ordered_hashmap_replace(s->user_journals, k, f);
fc55baee
ZJS
548 else if (!f)
549 /* Old file has been closed and deallocated */
43cf8388 550 ordered_hashmap_remove(s->user_journals, k);
d025f1e4 551 }
b58c888f 552
30acbadc
LP
553 /* Finally, also rotate all user journals we currently do not have open. (But do so only if we actually have
554 * access to /var, i.e. are not in the log-to-runtime-journal mode). */
555 if (!s->runtime_journal &&
556 open_user_journal_directory(s, &d, &path) >= 0) {
557
a33687b7
LP
558 struct dirent *de;
559
560 FOREACH_DIRENT(de, d, log_warning_errno(errno, "Failed to enumerate %s, ignoring: %m", path)) {
561 _cleanup_free_ char *u = NULL, *full = NULL;
562 _cleanup_close_ int fd = -1;
563 const char *a, *b;
564 uid_t uid;
565
566 a = startswith(de->d_name, "user-");
567 if (!a)
568 continue;
569 b = endswith(de->d_name, ".journal");
570 if (!b)
571 continue;
572
573 u = strndup(a, b-a);
574 if (!u) {
575 log_oom();
576 break;
577 }
578
579 r = parse_uid(u, &uid);
580 if (r < 0) {
581 log_debug_errno(r, "Failed to parse UID from file name '%s', ignoring: %m", de->d_name);
582 continue;
583 }
584
585 /* Already rotated in the above loop? i.e. is it an open user journal? */
586 if (ordered_hashmap_contains(s->user_journals, UID_TO_PTR(uid)))
587 continue;
588
589 full = strjoin(path, de->d_name);
590 if (!full) {
591 log_oom();
592 break;
593 }
594
595 fd = openat(dirfd(d), de->d_name, O_RDWR|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW|O_NONBLOCK);
596 if (fd < 0) {
597 log_full_errno(IN_SET(errno, ELOOP, ENOENT) ? LOG_DEBUG : LOG_WARNING, errno,
598 "Failed to open journal file '%s' for rotation: %m", full);
599 continue;
600 }
601
602 /* Make some room in the set of deferred close()s */
603 server_vacuum_deferred_closes(s);
604
605 /* Open the file briefly, so that we can archive it */
606 r = journal_file_open(fd,
607 full,
608 O_RDWR,
609 0640,
610 s->compress.enabled,
611 s->compress.threshold_bytes,
612 s->seal,
613 &s->system_storage.metrics,
614 s->mmap,
615 s->deferred_closes,
616 NULL,
617 &f);
618 if (r < 0) {
619 log_warning_errno(r, "Failed to read journal file %s for rotation, trying to move it out of the way: %m", full);
620
621 r = journal_file_dispose(dirfd(d), de->d_name);
622 if (r < 0)
623 log_warning_errno(r, "Failed to move %s out of the way, ignoring: %m", full);
624 else
625 log_debug("Successfully moved %s out of the way.", full);
626
627 continue;
628 }
629
630 TAKE_FD(fd); /* Donated to journal_file_open() */
631
632 r = journal_file_archive(f);
633 if (r < 0)
634 log_debug_errno(r, "Failed to archive journal file '%s', ignoring: %m", full);
635
636 f = journal_initiate_close(f, s->deferred_closes);
637 }
638 }
639
f760d8a8 640 server_process_deferred_closes(s);
d025f1e4
ZJS
641}
642
26687bf8
OS
643void server_sync(Server *s) {
644 JournalFile *f;
26687bf8
OS
645 Iterator i;
646 int r;
647
26687bf8 648 if (s->system_journal) {
ac2e41f5 649 r = journal_file_set_offline(s->system_journal, false);
26687bf8 650 if (r < 0)
65089b82 651 log_warning_errno(r, "Failed to sync system journal, ignoring: %m");
26687bf8
OS
652 }
653
65c1d46b 654 ORDERED_HASHMAP_FOREACH(f, s->user_journals, i) {
ac2e41f5 655 r = journal_file_set_offline(f, false);
26687bf8 656 if (r < 0)
65089b82 657 log_warning_errno(r, "Failed to sync user journal, ignoring: %m");
26687bf8
OS
658 }
659
f9a810be
LP
660 if (s->sync_event_source) {
661 r = sd_event_source_set_enabled(s->sync_event_source, SD_EVENT_OFF);
662 if (r < 0)
da927ba9 663 log_error_errno(r, "Failed to disable sync timer source: %m");
f9a810be 664 }
26687bf8
OS
665
666 s->sync_scheduled = false;
667}
668
3a19f215 669static void do_vacuum(Server *s, JournalStorage *storage, bool verbose) {
ea69bd41 670
63c8666b
ZJS
671 int r;
672
8580d1f7 673 assert(s);
266a4700 674 assert(storage);
8580d1f7 675
57f443a6 676 (void) cache_space_refresh(s, storage);
18e758bf
FB
677
678 if (verbose)
679 server_space_usage_message(s, storage);
8580d1f7 680
57f443a6
FB
681 r = journal_directory_vacuum(storage->path, storage->space.limit,
682 storage->metrics.n_max_files, s->max_retention_usec,
683 &s->oldest_file_usec, verbose);
63c8666b 684 if (r < 0 && r != -ENOENT)
266a4700
FB
685 log_warning_errno(r, "Failed to vacuum %s, ignoring: %m", storage->path);
686
a0edc477 687 cache_space_invalidate(&storage->space);
63c8666b
ZJS
688}
689
3a19f215 690int server_vacuum(Server *s, bool verbose) {
8580d1f7 691 assert(s);
d025f1e4
ZJS
692
693 log_debug("Vacuuming...");
694
695 s->oldest_file_usec = 0;
696
266a4700 697 if (s->system_journal)
3a19f215 698 do_vacuum(s, &s->system_storage, verbose);
266a4700 699 if (s->runtime_journal)
3a19f215 700 do_vacuum(s, &s->runtime_storage, verbose);
d025f1e4 701
8580d1f7 702 return 0;
d025f1e4
ZJS
703}
704
0c24bb23
LP
705static void server_cache_machine_id(Server *s) {
706 sd_id128_t id;
707 int r;
708
709 assert(s);
710
711 r = sd_id128_get_machine(&id);
712 if (r < 0)
713 return;
714
715 sd_id128_to_string(id, stpcpy(s->machine_id_field, "_MACHINE_ID="));
716}
717
718static void server_cache_boot_id(Server *s) {
719 sd_id128_t id;
720 int r;
721
722 assert(s);
723
724 r = sd_id128_get_boot(&id);
725 if (r < 0)
726 return;
727
728 sd_id128_to_string(id, stpcpy(s->boot_id_field, "_BOOT_ID="));
729}
730
731static void server_cache_hostname(Server *s) {
732 _cleanup_free_ char *t = NULL;
733 char *x;
734
735 assert(s);
736
737 t = gethostname_malloc();
738 if (!t)
739 return;
740
741 x = strappend("_HOSTNAME=", t);
742 if (!x)
743 return;
744
745 free(s->hostname_field);
746 s->hostname_field = x;
747}
748
8531ae70 749static bool shall_try_append_again(JournalFile *f, int r) {
6e1045e5 750 switch(r) {
ae739cc1 751
6e1045e5
ZJS
752 case -E2BIG: /* Hit configured limit */
753 case -EFBIG: /* Hit fs limit */
754 case -EDQUOT: /* Quota limit hit */
755 case -ENOSPC: /* Disk full */
d025f1e4 756 log_debug("%s: Allocation limit reached, rotating.", f->path);
6e1045e5 757 return true;
ae739cc1 758
6e1045e5
ZJS
759 case -EIO: /* I/O error of some kind (mmap) */
760 log_warning("%s: IO error, rotating.", f->path);
761 return true;
ae739cc1 762
6e1045e5 763 case -EHOSTDOWN: /* Other machine */
d025f1e4 764 log_info("%s: Journal file from other machine, rotating.", f->path);
6e1045e5 765 return true;
ae739cc1 766
6e1045e5 767 case -EBUSY: /* Unclean shutdown */
d025f1e4 768 log_info("%s: Unclean shutdown, rotating.", f->path);
6e1045e5 769 return true;
ae739cc1 770
6e1045e5 771 case -EPROTONOSUPPORT: /* Unsupported feature */
d025f1e4 772 log_info("%s: Unsupported feature, rotating.", f->path);
6e1045e5 773 return true;
ae739cc1 774
6e1045e5
ZJS
775 case -EBADMSG: /* Corrupted */
776 case -ENODATA: /* Truncated */
777 case -ESHUTDOWN: /* Already archived */
d025f1e4 778 log_warning("%s: Journal file corrupted, rotating.", f->path);
6e1045e5 779 return true;
ae739cc1 780
6e1045e5 781 case -EIDRM: /* Journal file has been deleted */
2678031a 782 log_warning("%s: Journal file has been deleted, rotating.", f->path);
6e1045e5 783 return true;
ae739cc1
LP
784
785 case -ETXTBSY: /* Journal file is from the future */
c1a9199e 786 log_warning("%s: Journal file is from the future, rotating.", f->path);
ae739cc1
LP
787 return true;
788
6e1045e5 789 default:
d025f1e4 790 return false;
6e1045e5 791 }
d025f1e4
ZJS
792}
793
da6053d0 794static void write_to_journal(Server *s, uid_t uid, struct iovec *iovec, size_t n, int priority) {
7c070017 795 bool vacuumed = false, rotate = false;
0f972d66 796 struct dual_timestamp ts;
d025f1e4 797 JournalFile *f;
d025f1e4
ZJS
798 int r;
799
800 assert(s);
801 assert(iovec);
802 assert(n > 0);
803
0f972d66
LP
804 /* Get the closest, linearized time we have for this log event from the event loop. (Note that we do not use
805 * the source time, and not even the time the event was originally seen, but instead simply the time we started
806 * processing it, as we want strictly linear ordering in what we write out.) */
807 assert_se(sd_event_now(s->event, CLOCK_REALTIME, &ts.realtime) >= 0);
808 assert_se(sd_event_now(s->event, CLOCK_MONOTONIC, &ts.monotonic) >= 0);
809
7c070017
LP
810 if (ts.realtime < s->last_realtime_clock) {
811 /* When the time jumps backwards, let's immediately rotate. Of course, this should not happen during
812 * regular operation. However, when it does happen, then we should make sure that we start fresh files
813 * to ensure that the entries in the journal files are strictly ordered by time, in order to ensure
814 * bisection works correctly. */
d025f1e4 815
7c070017
LP
816 log_debug("Time jumped backwards, rotating.");
817 rotate = true;
818 } else {
819
820 f = find_journal(s, uid);
821 if (!f)
822 return;
823
824 if (journal_file_rotate_suggested(f, s->max_file_usec)) {
825 log_debug("%s: Journal header limits reached or header out-of-date, rotating.", f->path);
826 rotate = true;
827 }
828 }
d025f1e4 829
7c070017 830 if (rotate) {
d025f1e4 831 server_rotate(s);
3a19f215 832 server_vacuum(s, false);
d025f1e4
ZJS
833 vacuumed = true;
834
835 f = find_journal(s, uid);
836 if (!f)
837 return;
838 }
839
7c070017
LP
840 s->last_realtime_clock = ts.realtime;
841
d180c349 842 r = journal_file_append_entry(f, &ts, NULL, iovec, n, &s->seqnum, NULL, NULL);
26687bf8 843 if (r >= 0) {
d07f7b9e 844 server_schedule_sync(s, priority);
d025f1e4 845 return;
26687bf8 846 }
d025f1e4
ZJS
847
848 if (vacuumed || !shall_try_append_again(f, r)) {
da6053d0 849 log_error_errno(r, "Failed to write entry (%zu items, %zu bytes), ignoring: %m", n, IOVEC_TOTAL_SIZE(iovec, n));
d025f1e4
ZJS
850 return;
851 }
852
853 server_rotate(s);
3a19f215 854 server_vacuum(s, false);
d025f1e4
ZJS
855
856 f = find_journal(s, uid);
857 if (!f)
858 return;
859
860 log_debug("Retrying write.");
d180c349 861 r = journal_file_append_entry(f, &ts, NULL, iovec, n, &s->seqnum, NULL, NULL);
8266e1c0 862 if (r < 0)
da6053d0 863 log_error_errno(r, "Failed to write entry (%zu items, %zu bytes) despite vacuuming, ignoring: %m", n, IOVEC_TOTAL_SIZE(iovec, n));
8266e1c0 864 else
d07f7b9e 865 server_schedule_sync(s, priority);
d025f1e4
ZJS
866}
867
22e3a02b
LP
868#define IOVEC_ADD_NUMERIC_FIELD(iovec, n, value, type, isset, format, field) \
869 if (isset(value)) { \
870 char *k; \
fbd0b64f 871 k = newa(char, STRLEN(field "=") + DECIMAL_STR_MAX(type) + 1); \
22e3a02b 872 sprintf(k, field "=" format, value); \
e6a7ec4b 873 iovec[n++] = IOVEC_MAKE_STRING(k); \
22e3a02b 874 }
4b58153d 875
22e3a02b
LP
876#define IOVEC_ADD_STRING_FIELD(iovec, n, value, field) \
877 if (!isempty(value)) { \
878 char *k; \
879 k = strjoina(field "=", value); \
e6a7ec4b 880 iovec[n++] = IOVEC_MAKE_STRING(k); \
22e3a02b 881 }
4b58153d 882
22e3a02b
LP
883#define IOVEC_ADD_ID128_FIELD(iovec, n, value, field) \
884 if (!sd_id128_is_null(value)) { \
885 char *k; \
fbd0b64f 886 k = newa(char, STRLEN(field "=") + SD_ID128_STRING_MAX); \
22e3a02b 887 sd_id128_to_string(value, stpcpy(k, field "=")); \
e6a7ec4b 888 iovec[n++] = IOVEC_MAKE_STRING(k); \
22e3a02b 889 }
4b58153d 890
22e3a02b
LP
891#define IOVEC_ADD_SIZED_FIELD(iovec, n, value, value_size, field) \
892 if (value_size > 0) { \
893 char *k; \
fbd0b64f 894 k = newa(char, STRLEN(field "=") + value_size + 1); \
22e3a02b 895 *((char*) mempcpy(stpcpy(k, field "="), value, value_size)) = 0; \
e6a7ec4b 896 iovec[n++] = IOVEC_MAKE_STRING(k); \
22e3a02b 897 } \
4b58153d 898
d025f1e4
ZJS
899static void dispatch_message_real(
900 Server *s,
d3070fbd 901 struct iovec *iovec, size_t n, size_t m,
22e3a02b 902 const ClientContext *c,
3b3154df 903 const struct timeval *tv,
d07f7b9e 904 int priority,
22e3a02b
LP
905 pid_t object_pid) {
906
907 char source_time[sizeof("_SOURCE_REALTIME_TIMESTAMP=") + DECIMAL_STR_MAX(usec_t)];
084eeb86 908 _cleanup_free_ char *cmdline1 = NULL, *cmdline2 = NULL;
22e3a02b
LP
909 uid_t journal_uid;
910 ClientContext *o;
d025f1e4
ZJS
911
912 assert(s);
913 assert(iovec);
914 assert(n > 0);
d3070fbd
LP
915 assert(n +
916 N_IOVEC_META_FIELDS +
917 (pid_is_valid(object_pid) ? N_IOVEC_OBJECT_FIELDS : 0) +
918 client_context_extra_fields_n_iovec(c) <= m);
19cace37 919
22e3a02b
LP
920 if (c) {
921 IOVEC_ADD_NUMERIC_FIELD(iovec, n, c->pid, pid_t, pid_is_valid, PID_FMT, "_PID");
922 IOVEC_ADD_NUMERIC_FIELD(iovec, n, c->uid, uid_t, uid_is_valid, UID_FMT, "_UID");
923 IOVEC_ADD_NUMERIC_FIELD(iovec, n, c->gid, gid_t, gid_is_valid, GID_FMT, "_GID");
4b58153d 924
084eeb86
ZJS
925 IOVEC_ADD_STRING_FIELD(iovec, n, c->comm, "_COMM"); /* At most TASK_COMM_LENGTH (16 bytes) */
926 IOVEC_ADD_STRING_FIELD(iovec, n, c->exe, "_EXE"); /* A path, so at most PATH_MAX (4096 bytes) */
d025f1e4 927
084eeb86
ZJS
928 if (c->cmdline)
929 /* At most _SC_ARG_MAX (2MB usually), which is too much to put on stack.
930 * Let's use a heap allocation for this one. */
931 cmdline1 = set_iovec_string_field(iovec, &n, "_CMDLINE=", c->cmdline);
ae018d9b 932
084eeb86
ZJS
933 IOVEC_ADD_STRING_FIELD(iovec, n, c->capeff, "_CAP_EFFECTIVE"); /* Read from /proc/.../status */
934 IOVEC_ADD_SIZED_FIELD(iovec, n, c->label, c->label_size, "_SELINUX_CONTEXT");
22e3a02b
LP
935 IOVEC_ADD_NUMERIC_FIELD(iovec, n, c->auditid, uint32_t, audit_session_is_valid, "%" PRIu32, "_AUDIT_SESSION");
936 IOVEC_ADD_NUMERIC_FIELD(iovec, n, c->loginuid, uid_t, uid_is_valid, UID_FMT, "_AUDIT_LOGINUID");
d025f1e4 937
084eeb86 938 IOVEC_ADD_STRING_FIELD(iovec, n, c->cgroup, "_SYSTEMD_CGROUP"); /* A path */
22e3a02b
LP
939 IOVEC_ADD_STRING_FIELD(iovec, n, c->session, "_SYSTEMD_SESSION");
940 IOVEC_ADD_NUMERIC_FIELD(iovec, n, c->owner_uid, uid_t, uid_is_valid, UID_FMT, "_SYSTEMD_OWNER_UID");
084eeb86 941 IOVEC_ADD_STRING_FIELD(iovec, n, c->unit, "_SYSTEMD_UNIT"); /* Unit names are bounded by UNIT_NAME_MAX */
22e3a02b
LP
942 IOVEC_ADD_STRING_FIELD(iovec, n, c->user_unit, "_SYSTEMD_USER_UNIT");
943 IOVEC_ADD_STRING_FIELD(iovec, n, c->slice, "_SYSTEMD_SLICE");
944 IOVEC_ADD_STRING_FIELD(iovec, n, c->user_slice, "_SYSTEMD_USER_SLICE");
e7ff4e7f 945
22e3a02b 946 IOVEC_ADD_ID128_FIELD(iovec, n, c->invocation_id, "_SYSTEMD_INVOCATION_ID");
d3070fbd
LP
947
948 if (c->extra_fields_n_iovec > 0) {
949 memcpy(iovec + n, c->extra_fields_iovec, c->extra_fields_n_iovec * sizeof(struct iovec));
950 n += c->extra_fields_n_iovec;
951 }
d025f1e4 952 }
968f3196 953
22e3a02b 954 assert(n <= m);
968f3196 955
22e3a02b 956 if (pid_is_valid(object_pid) && client_context_get(s, object_pid, NULL, NULL, 0, NULL, &o) >= 0) {
968f3196 957
22e3a02b
LP
958 IOVEC_ADD_NUMERIC_FIELD(iovec, n, o->pid, pid_t, pid_is_valid, PID_FMT, "OBJECT_PID");
959 IOVEC_ADD_NUMERIC_FIELD(iovec, n, o->uid, uid_t, uid_is_valid, UID_FMT, "OBJECT_UID");
960 IOVEC_ADD_NUMERIC_FIELD(iovec, n, o->gid, gid_t, gid_is_valid, GID_FMT, "OBJECT_GID");
968f3196 961
084eeb86 962 /* See above for size limits, only ->cmdline may be large, so use a heap allocation for it. */
22e3a02b
LP
963 IOVEC_ADD_STRING_FIELD(iovec, n, o->comm, "OBJECT_COMM");
964 IOVEC_ADD_STRING_FIELD(iovec, n, o->exe, "OBJECT_EXE");
084eeb86
ZJS
965 if (o->cmdline)
966 cmdline2 = set_iovec_string_field(iovec, &n, "OBJECT_CMDLINE=", o->cmdline);
968f3196 967
084eeb86 968 IOVEC_ADD_STRING_FIELD(iovec, n, o->capeff, "OBJECT_CAP_EFFECTIVE");
22e3a02b 969 IOVEC_ADD_SIZED_FIELD(iovec, n, o->label, o->label_size, "OBJECT_SELINUX_CONTEXT");
22e3a02b
LP
970 IOVEC_ADD_NUMERIC_FIELD(iovec, n, o->auditid, uint32_t, audit_session_is_valid, "%" PRIu32, "OBJECT_AUDIT_SESSION");
971 IOVEC_ADD_NUMERIC_FIELD(iovec, n, o->loginuid, uid_t, uid_is_valid, UID_FMT, "OBJECT_AUDIT_LOGINUID");
d473176a 972
22e3a02b
LP
973 IOVEC_ADD_STRING_FIELD(iovec, n, o->cgroup, "OBJECT_SYSTEMD_CGROUP");
974 IOVEC_ADD_STRING_FIELD(iovec, n, o->session, "OBJECT_SYSTEMD_SESSION");
975 IOVEC_ADD_NUMERIC_FIELD(iovec, n, o->owner_uid, uid_t, uid_is_valid, UID_FMT, "OBJECT_SYSTEMD_OWNER_UID");
976 IOVEC_ADD_STRING_FIELD(iovec, n, o->unit, "OBJECT_SYSTEMD_UNIT");
977 IOVEC_ADD_STRING_FIELD(iovec, n, o->user_unit, "OBJECT_SYSTEMD_USER_UNIT");
978 IOVEC_ADD_STRING_FIELD(iovec, n, o->slice, "OBJECT_SYSTEMD_SLICE");
979 IOVEC_ADD_STRING_FIELD(iovec, n, o->user_slice, "OBJECT_SYSTEMD_USER_SLICE");
d473176a 980
22e3a02b 981 IOVEC_ADD_ID128_FIELD(iovec, n, o->invocation_id, "OBJECT_SYSTEMD_INVOCATION_ID=");
968f3196 982 }
22e3a02b 983
968f3196 984 assert(n <= m);
d025f1e4
ZJS
985
986 if (tv) {
398a50cd 987 sprintf(source_time, "_SOURCE_REALTIME_TIMESTAMP=" USEC_FMT, timeval_load(tv));
e6a7ec4b 988 iovec[n++] = IOVEC_MAKE_STRING(source_time);
d025f1e4
ZJS
989 }
990
991 /* Note that strictly speaking storing the boot id here is
992 * redundant since the entry includes this in-line
993 * anyway. However, we need this indexed, too. */
0c24bb23 994 if (!isempty(s->boot_id_field))
e6a7ec4b 995 iovec[n++] = IOVEC_MAKE_STRING(s->boot_id_field);
d025f1e4 996
0c24bb23 997 if (!isempty(s->machine_id_field))
e6a7ec4b 998 iovec[n++] = IOVEC_MAKE_STRING(s->machine_id_field);
d025f1e4 999
0c24bb23 1000 if (!isempty(s->hostname_field))
e6a7ec4b 1001 iovec[n++] = IOVEC_MAKE_STRING(s->hostname_field);
d025f1e4
ZJS
1002
1003 assert(n <= m);
1004
22e3a02b
LP
1005 if (s->split_mode == SPLIT_UID && c && uid_is_valid(c->uid))
1006 /* Split up strictly by (non-root) UID */
1007 journal_uid = c->uid;
1008 else if (s->split_mode == SPLIT_LOGIN && c && c->uid > 0 && uid_is_valid(c->owner_uid))
edc3797f
LP
1009 /* Split up by login UIDs. We do this only if the
1010 * realuid is not root, in order not to accidentally
1011 * leak privileged information to the user that is
1012 * logged by a privileged process that is part of an
7517e174 1013 * unprivileged session. */
22e3a02b 1014 journal_uid = c->owner_uid;
da499392
KS
1015 else
1016 journal_uid = 0;
759c945a 1017
d07f7b9e 1018 write_to_journal(s, journal_uid, iovec, n, priority);
d025f1e4
ZJS
1019}
1020
13181942 1021void server_driver_message(Server *s, pid_t object_pid, const char *message_id, const char *format, ...) {
22e3a02b 1022
d3070fbd
LP
1023 struct iovec *iovec;
1024 size_t n = 0, k, m;
d025f1e4 1025 va_list ap;
22e3a02b 1026 int r;
d025f1e4
ZJS
1027
1028 assert(s);
1029 assert(format);
1030
f643ae71 1031 m = N_IOVEC_META_FIELDS + 5 + N_IOVEC_PAYLOAD_FIELDS + client_context_extra_fields_n_iovec(s->my_context) + N_IOVEC_OBJECT_FIELDS;
d3070fbd
LP
1032 iovec = newa(struct iovec, m);
1033
4850d39a 1034 assert_cc(3 == LOG_FAC(LOG_DAEMON));
e6a7ec4b
LP
1035 iovec[n++] = IOVEC_MAKE_STRING("SYSLOG_FACILITY=3");
1036 iovec[n++] = IOVEC_MAKE_STRING("SYSLOG_IDENTIFIER=systemd-journald");
b6fa2555 1037
e6a7ec4b 1038 iovec[n++] = IOVEC_MAKE_STRING("_TRANSPORT=driver");
4850d39a 1039 assert_cc(6 == LOG_INFO);
e6a7ec4b 1040 iovec[n++] = IOVEC_MAKE_STRING("PRIORITY=6");
d025f1e4 1041
2b044526 1042 if (message_id)
e6a7ec4b 1043 iovec[n++] = IOVEC_MAKE_STRING(message_id);
d3070fbd 1044 k = n;
8a03c9ef
ZJS
1045
1046 va_start(ap, format);
d3070fbd 1047 r = log_format_iovec(iovec, m, &n, false, 0, format, ap);
32917e33 1048 /* Error handling below */
8a03c9ef
ZJS
1049 va_end(ap);
1050
32917e33 1051 if (r >= 0)
d3070fbd 1052 dispatch_message_real(s, iovec, n, m, s->my_context, NULL, LOG_INFO, object_pid);
8a03c9ef 1053
d3070fbd
LP
1054 while (k < n)
1055 free(iovec[k++].iov_base);
32917e33
ZJS
1056
1057 if (r < 0) {
1058 /* We failed to format the message. Emit a warning instead. */
1059 char buf[LINE_MAX];
1060
1061 xsprintf(buf, "MESSAGE=Entry printing failed: %s", strerror(-r));
1062
1063 n = 3;
e6a7ec4b
LP
1064 iovec[n++] = IOVEC_MAKE_STRING("PRIORITY=4");
1065 iovec[n++] = IOVEC_MAKE_STRING(buf);
d3070fbd 1066 dispatch_message_real(s, iovec, n, m, s->my_context, NULL, LOG_INFO, object_pid);
32917e33 1067 }
d025f1e4
ZJS
1068}
1069
1070void server_dispatch_message(
1071 Server *s,
d3070fbd 1072 struct iovec *iovec, size_t n, size_t m,
22e3a02b 1073 ClientContext *c,
3b3154df 1074 const struct timeval *tv,
968f3196
ZJS
1075 int priority,
1076 pid_t object_pid) {
d025f1e4 1077
8580d1f7 1078 uint64_t available = 0;
22e3a02b 1079 int rl;
d025f1e4
ZJS
1080
1081 assert(s);
1082 assert(iovec || n == 0);
1083
1084 if (n == 0)
1085 return;
1086
1087 if (LOG_PRI(priority) > s->max_level_store)
1088 return;
1089
2f5df74a
HHPF
1090 /* Stop early in case the information will not be stored
1091 * in a journal. */
1092 if (s->storage == STORAGE_NONE)
1093 return;
1094
22e3a02b
LP
1095 if (c && c->unit) {
1096 (void) determine_space(s, &available, NULL);
d025f1e4 1097
90fc172e 1098 rl = journal_rate_limit_test(s->rate_limit, c->unit, c->log_rate_limit_interval, c->log_rate_limit_burst, priority & LOG_PRIMASK, available);
22e3a02b
LP
1099 if (rl == 0)
1100 return;
d025f1e4 1101
22e3a02b
LP
1102 /* Write a suppression message if we suppressed something */
1103 if (rl > 1)
13181942
LP
1104 server_driver_message(s, c->pid,
1105 "MESSAGE_ID=" SD_MESSAGE_JOURNAL_DROPPED_STR,
1106 LOG_MESSAGE("Suppressed %i messages from %s", rl - 1, c->unit),
5908ff1c 1107 "N_DROPPED=%i", rl - 1,
22e3a02b 1108 NULL);
d025f1e4
ZJS
1109 }
1110
22e3a02b 1111 dispatch_message_real(s, iovec, n, m, c, tv, priority, object_pid);
d025f1e4
ZJS
1112}
1113
f78273c8 1114int server_flush_to_var(Server *s, bool require_flag_file) {
d025f1e4
ZJS
1115 sd_id128_t machine;
1116 sd_journal *j = NULL;
fbb63411
LP
1117 char ts[FORMAT_TIMESPAN_MAX];
1118 usec_t start;
1119 unsigned n = 0;
1120 int r;
d025f1e4
ZJS
1121
1122 assert(s);
1123
f78273c8 1124 if (!IN_SET(s->storage, STORAGE_AUTO, STORAGE_PERSISTENT))
d025f1e4
ZJS
1125 return 0;
1126
1127 if (!s->runtime_journal)
1128 return 0;
1129
f78273c8
LP
1130 if (require_flag_file && !flushed_flag_is_set())
1131 return 0;
1132
8580d1f7 1133 (void) system_journal_open(s, true);
d025f1e4
ZJS
1134
1135 if (!s->system_journal)
1136 return 0;
1137
1138 log_debug("Flushing to /var...");
1139
fbb63411
LP
1140 start = now(CLOCK_MONOTONIC);
1141
d025f1e4 1142 r = sd_id128_get_machine(&machine);
00a16861 1143 if (r < 0)
d025f1e4 1144 return r;
d025f1e4
ZJS
1145
1146 r = sd_journal_open(&j, SD_JOURNAL_RUNTIME_ONLY);
23bbb0de
MS
1147 if (r < 0)
1148 return log_error_errno(r, "Failed to read runtime journal: %m");
d025f1e4 1149
93b73b06
LP
1150 sd_journal_set_data_threshold(j, 0);
1151
d025f1e4
ZJS
1152 SD_JOURNAL_FOREACH(j) {
1153 Object *o = NULL;
1154 JournalFile *f;
1155
1156 f = j->current_file;
1157 assert(f && f->current_offset > 0);
1158
fbb63411
LP
1159 n++;
1160
d025f1e4
ZJS
1161 r = journal_file_move_to_object(f, OBJECT_ENTRY, f->current_offset, &o);
1162 if (r < 0) {
da927ba9 1163 log_error_errno(r, "Can't read entry: %m");
d025f1e4
ZJS
1164 goto finish;
1165 }
1166
5a271b08 1167 r = journal_file_copy_entry(f, s->system_journal, o, f->current_offset);
d025f1e4
ZJS
1168 if (r >= 0)
1169 continue;
1170
1171 if (!shall_try_append_again(s->system_journal, r)) {
da927ba9 1172 log_error_errno(r, "Can't write entry: %m");
d025f1e4
ZJS
1173 goto finish;
1174 }
1175
1176 server_rotate(s);
3a19f215 1177 server_vacuum(s, false);
d025f1e4 1178
253f59df
LP
1179 if (!s->system_journal) {
1180 log_notice("Didn't flush runtime journal since rotation of system journal wasn't successful.");
1181 r = -EIO;
1182 goto finish;
1183 }
1184
d025f1e4 1185 log_debug("Retrying write.");
5a271b08 1186 r = journal_file_copy_entry(f, s->system_journal, o, f->current_offset);
d025f1e4 1187 if (r < 0) {
da927ba9 1188 log_error_errno(r, "Can't write entry: %m");
d025f1e4
ZJS
1189 goto finish;
1190 }
1191 }
1192
804ae586
LP
1193 r = 0;
1194
d025f1e4 1195finish:
fd790d6f
RM
1196 if (s->system_journal)
1197 journal_file_post_change(s->system_journal);
d025f1e4 1198
804ae586 1199 s->runtime_journal = journal_file_close(s->runtime_journal);
d025f1e4
ZJS
1200
1201 if (r >= 0)
c6878637 1202 (void) rm_rf("/run/log/journal", REMOVE_ROOT);
d025f1e4 1203
763c7aa2 1204 sd_journal_close(j);
d025f1e4 1205
13181942 1206 server_driver_message(s, 0, NULL,
8a03c9ef
ZJS
1207 LOG_MESSAGE("Time spent on flushing to /var is %s for %u entries.",
1208 format_timespan(ts, sizeof(ts), now(CLOCK_MONOTONIC) - start, 0),
1209 n),
1210 NULL);
fbb63411 1211
d025f1e4
ZJS
1212 return r;
1213}
1214
8531ae70 1215int server_process_datagram(sd_event_source *es, int fd, uint32_t revents, void *userdata) {
f9a810be 1216 Server *s = userdata;
a315ac4e
LP
1217 struct ucred *ucred = NULL;
1218 struct timeval *tv = NULL;
1219 struct cmsghdr *cmsg;
1220 char *label = NULL;
1221 size_t label_len = 0, m;
1222 struct iovec iovec;
1223 ssize_t n;
1224 int *fds = NULL, v = 0;
da6053d0 1225 size_t n_fds = 0;
a315ac4e
LP
1226
1227 union {
1228 struct cmsghdr cmsghdr;
1229
1230 /* We use NAME_MAX space for the SELinux label
1231 * here. The kernel currently enforces no
1232 * limit, but according to suggestions from
1233 * the SELinux people this will change and it
1234 * will probably be identical to NAME_MAX. For
1235 * now we use that, but this should be updated
1236 * one day when the final limit is known. */
1237 uint8_t buf[CMSG_SPACE(sizeof(struct ucred)) +
1238 CMSG_SPACE(sizeof(struct timeval)) +
1239 CMSG_SPACE(sizeof(int)) + /* fd */
1240 CMSG_SPACE(NAME_MAX)]; /* selinux label */
1241 } control = {};
1242
1243 union sockaddr_union sa = {};
1244
1245 struct msghdr msghdr = {
1246 .msg_iov = &iovec,
1247 .msg_iovlen = 1,
1248 .msg_control = &control,
1249 .msg_controllen = sizeof(control),
1250 .msg_name = &sa,
1251 .msg_namelen = sizeof(sa),
1252 };
f9a810be 1253
d025f1e4 1254 assert(s);
875c2e22 1255 assert(fd == s->native_fd || fd == s->syslog_fd || fd == s->audit_fd);
f9a810be 1256
baaa35ad
ZJS
1257 if (revents != EPOLLIN)
1258 return log_error_errno(SYNTHETIC_ERRNO(EIO),
1259 "Got invalid event from epoll for datagram fd: %" PRIx32,
1260 revents);
f9a810be 1261
22e3a02b
LP
1262 /* Try to get the right size, if we can. (Not all sockets support SIOCINQ, hence we just try, but don't rely on
1263 * it.) */
a315ac4e 1264 (void) ioctl(fd, SIOCINQ, &v);
d025f1e4 1265
a315ac4e
LP
1266 /* Fix it up, if it is too small. We use the same fixed value as auditd here. Awful! */
1267 m = PAGE_ALIGN(MAX3((size_t) v + 1,
1268 (size_t) LINE_MAX,
1269 ALIGN(sizeof(struct nlmsghdr)) + ALIGN((size_t) MAX_AUDIT_MESSAGE_LENGTH)) + 1);
d025f1e4 1270
a315ac4e
LP
1271 if (!GREEDY_REALLOC(s->buffer, s->buffer_size, m))
1272 return log_oom();
875c2e22 1273
5cfa2c3d 1274 iovec = IOVEC_MAKE(s->buffer, s->buffer_size - 1); /* Leave room for trailing NUL we add later */
d025f1e4 1275
a315ac4e
LP
1276 n = recvmsg(fd, &msghdr, MSG_DONTWAIT|MSG_CMSG_CLOEXEC);
1277 if (n < 0) {
3742095b 1278 if (IN_SET(errno, EINTR, EAGAIN))
a315ac4e 1279 return 0;
875c2e22 1280
a315ac4e
LP
1281 return log_error_errno(errno, "recvmsg() failed: %m");
1282 }
875c2e22 1283
bc2762a3 1284 CMSG_FOREACH(cmsg, &msghdr)
a315ac4e
LP
1285 if (cmsg->cmsg_level == SOL_SOCKET &&
1286 cmsg->cmsg_type == SCM_CREDENTIALS &&
1287 cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred)))
1288 ucred = (struct ucred*) CMSG_DATA(cmsg);
1289 else if (cmsg->cmsg_level == SOL_SOCKET &&
1290 cmsg->cmsg_type == SCM_SECURITY) {
1291 label = (char*) CMSG_DATA(cmsg);
1292 label_len = cmsg->cmsg_len - CMSG_LEN(0);
1293 } else if (cmsg->cmsg_level == SOL_SOCKET &&
1294 cmsg->cmsg_type == SO_TIMESTAMP &&
1295 cmsg->cmsg_len == CMSG_LEN(sizeof(struct timeval)))
1296 tv = (struct timeval*) CMSG_DATA(cmsg);
1297 else if (cmsg->cmsg_level == SOL_SOCKET &&
1298 cmsg->cmsg_type == SCM_RIGHTS) {
1299 fds = (int*) CMSG_DATA(cmsg);
1300 n_fds = (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
d025f1e4
ZJS
1301 }
1302
a315ac4e
LP
1303 /* And a trailing NUL, just in case */
1304 s->buffer[n] = 0;
1305
1306 if (fd == s->syslog_fd) {
1307 if (n > 0 && n_fds == 0)
bb3ff70a 1308 server_process_syslog_message(s, s->buffer, n, ucred, tv, label, label_len);
a315ac4e
LP
1309 else if (n_fds > 0)
1310 log_warning("Got file descriptors via syslog socket. Ignoring.");
1311
1312 } else if (fd == s->native_fd) {
1313 if (n > 0 && n_fds == 0)
1314 server_process_native_message(s, s->buffer, n, ucred, tv, label, label_len);
1315 else if (n == 0 && n_fds == 1)
1316 server_process_native_file(s, fds[0], ucred, tv, label, label_len);
1317 else if (n_fds > 0)
1318 log_warning("Got too many file descriptors via native socket. Ignoring.");
1319
1320 } else {
1321 assert(fd == s->audit_fd);
1322
1323 if (n > 0 && n_fds == 0)
1324 server_process_audit_message(s, s->buffer, n, ucred, &sa, msghdr.msg_namelen);
1325 else if (n_fds > 0)
1326 log_warning("Got file descriptors via audit socket. Ignoring.");
f9a810be 1327 }
a315ac4e
LP
1328
1329 close_many(fds, n_fds);
1330 return 0;
f9a810be 1331}
d025f1e4 1332
f9a810be
LP
1333static int dispatch_sigusr1(sd_event_source *es, const struct signalfd_siginfo *si, void *userdata) {
1334 Server *s = userdata;
33d52ab9 1335 int r;
d025f1e4 1336
f9a810be 1337 assert(s);
d025f1e4 1338
94b65516 1339 log_info("Received request to flush runtime journal from PID " PID_FMT, si->ssi_pid);
d025f1e4 1340
f78273c8 1341 (void) server_flush_to_var(s, false);
f9a810be 1342 server_sync(s);
3a19f215 1343 server_vacuum(s, false);
d025f1e4 1344
33d52ab9
LP
1345 r = touch("/run/systemd/journal/flushed");
1346 if (r < 0)
1347 log_warning_errno(r, "Failed to touch /run/systemd/journal/flushed, ignoring: %m");
74055aa7 1348
18e758bf 1349 server_space_usage_message(s, NULL);
f9a810be
LP
1350 return 0;
1351}
d025f1e4 1352
f9a810be
LP
1353static int dispatch_sigusr2(sd_event_source *es, const struct signalfd_siginfo *si, void *userdata) {
1354 Server *s = userdata;
33d52ab9 1355 int r;
d025f1e4 1356
f9a810be 1357 assert(s);
d025f1e4 1358
94b65516 1359 log_info("Received request to rotate journal from PID " PID_FMT, si->ssi_pid);
f9a810be 1360 server_rotate(s);
3a19f215
FB
1361 server_vacuum(s, true);
1362
1363 if (s->system_journal)
1364 patch_min_use(&s->system_storage);
1365 if (s->runtime_journal)
1366 patch_min_use(&s->runtime_storage);
d025f1e4 1367
dbd6e31c 1368 /* Let clients know when the most recent rotation happened. */
33d52ab9
LP
1369 r = write_timestamp_file_atomic("/run/systemd/journal/rotated", now(CLOCK_MONOTONIC));
1370 if (r < 0)
1371 log_warning_errno(r, "Failed to write /run/systemd/journal/rotated, ignoring: %m");
dbd6e31c 1372
f9a810be
LP
1373 return 0;
1374}
d025f1e4 1375
f9a810be
LP
1376static int dispatch_sigterm(sd_event_source *es, const struct signalfd_siginfo *si, void *userdata) {
1377 Server *s = userdata;
d025f1e4 1378
f9a810be 1379 assert(s);
d025f1e4 1380
4daf54a8 1381 log_received_signal(LOG_INFO, si);
d025f1e4 1382
6203e07a 1383 sd_event_exit(s->event, 0);
d025f1e4
ZJS
1384 return 0;
1385}
1386
94b65516
LP
1387static int dispatch_sigrtmin1(sd_event_source *es, const struct signalfd_siginfo *si, void *userdata) {
1388 Server *s = userdata;
33d52ab9 1389 int r;
94b65516
LP
1390
1391 assert(s);
1392
1393 log_debug("Received request to sync from PID " PID_FMT, si->ssi_pid);
1394
1395 server_sync(s);
1396
1397 /* Let clients know when the most recent sync happened. */
33d52ab9
LP
1398 r = write_timestamp_file_atomic("/run/systemd/journal/synced", now(CLOCK_MONOTONIC));
1399 if (r < 0)
1400 log_warning_errno(r, "Failed to write /run/systemd/journal/synced, ignoring: %m");
94b65516
LP
1401
1402 return 0;
1403}
1404
f9a810be 1405static int setup_signals(Server *s) {
f9a810be 1406 int r;
d025f1e4
ZJS
1407
1408 assert(s);
1409
9bab3b65 1410 assert_se(sigprocmask_many(SIG_SETMASK, NULL, SIGINT, SIGTERM, SIGUSR1, SIGUSR2, SIGRTMIN+1, -1) >= 0);
d025f1e4 1411
151b9b96 1412 r = sd_event_add_signal(s->event, &s->sigusr1_event_source, SIGUSR1, dispatch_sigusr1, s);
f9a810be
LP
1413 if (r < 0)
1414 return r;
1415
151b9b96 1416 r = sd_event_add_signal(s->event, &s->sigusr2_event_source, SIGUSR2, dispatch_sigusr2, s);
f9a810be
LP
1417 if (r < 0)
1418 return r;
d025f1e4 1419
151b9b96 1420 r = sd_event_add_signal(s->event, &s->sigterm_event_source, SIGTERM, dispatch_sigterm, s);
f9a810be
LP
1421 if (r < 0)
1422 return r;
d025f1e4 1423
b374689c
LP
1424 /* Let's process SIGTERM late, so that we flush all queued
1425 * messages to disk before we exit */
1426 r = sd_event_source_set_priority(s->sigterm_event_source, SD_EVENT_PRIORITY_NORMAL+20);
1427 if (r < 0)
1428 return r;
1429
1430 /* When journald is invoked on the terminal (when debugging),
1431 * it's useful if C-c is handled equivalent to SIGTERM. */
151b9b96 1432 r = sd_event_add_signal(s->event, &s->sigint_event_source, SIGINT, dispatch_sigterm, s);
f9a810be
LP
1433 if (r < 0)
1434 return r;
d025f1e4 1435
b374689c
LP
1436 r = sd_event_source_set_priority(s->sigint_event_source, SD_EVENT_PRIORITY_NORMAL+20);
1437 if (r < 0)
1438 return r;
1439
94b65516
LP
1440 /* SIGRTMIN+1 causes an immediate sync. We process this very
1441 * late, so that everything else queued at this point is
1442 * really written to disk. Clients can watch
1443 * /run/systemd/journal/synced with inotify until its mtime
1444 * changes to see when a sync happened. */
1445 r = sd_event_add_signal(s->event, &s->sigrtmin1_event_source, SIGRTMIN+1, dispatch_sigrtmin1, s);
1446 if (r < 0)
1447 return r;
1448
1449 r = sd_event_source_set_priority(s->sigrtmin1_event_source, SD_EVENT_PRIORITY_NORMAL+15);
1450 if (r < 0)
1451 return r;
1452
d025f1e4
ZJS
1453 return 0;
1454}
1455
5707ecf3
ZJS
1456static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
1457 Server *s = data;
74df0fca 1458 int r;
d025f1e4 1459
5707ecf3 1460 assert(s);
d025f1e4 1461
1d84ad94
LP
1462 if (proc_cmdline_key_streq(key, "systemd.journald.forward_to_syslog")) {
1463
5707ecf3 1464 r = value ? parse_boolean(value) : true;
d581d9d9 1465 if (r < 0)
5707ecf3
ZJS
1466 log_warning("Failed to parse forward to syslog switch \"%s\". Ignoring.", value);
1467 else
1468 s->forward_to_syslog = r;
1d84ad94
LP
1469
1470 } else if (proc_cmdline_key_streq(key, "systemd.journald.forward_to_kmsg")) {
1471
5707ecf3
ZJS
1472 r = value ? parse_boolean(value) : true;
1473 if (r < 0)
1474 log_warning("Failed to parse forward to kmsg switch \"%s\". Ignoring.", value);
1475 else
1476 s->forward_to_kmsg = r;
1d84ad94
LP
1477
1478 } else if (proc_cmdline_key_streq(key, "systemd.journald.forward_to_console")) {
1479
5707ecf3
ZJS
1480 r = value ? parse_boolean(value) : true;
1481 if (r < 0)
1482 log_warning("Failed to parse forward to console switch \"%s\". Ignoring.", value);
1483 else
1484 s->forward_to_console = r;
1d84ad94
LP
1485
1486 } else if (proc_cmdline_key_streq(key, "systemd.journald.forward_to_wall")) {
1487
5707ecf3
ZJS
1488 r = value ? parse_boolean(value) : true;
1489 if (r < 0)
1490 log_warning("Failed to parse forward to wall switch \"%s\". Ignoring.", value);
1491 else
1492 s->forward_to_wall = r;
1d84ad94
LP
1493
1494 } else if (proc_cmdline_key_streq(key, "systemd.journald.max_level_console")) {
1495
1496 if (proc_cmdline_value_missing(key, value))
1497 return 0;
1498
5707ecf3
ZJS
1499 r = log_level_from_string(value);
1500 if (r < 0)
1501 log_warning("Failed to parse max level console value \"%s\". Ignoring.", value);
1502 else
1503 s->max_level_console = r;
1d84ad94
LP
1504
1505 } else if (proc_cmdline_key_streq(key, "systemd.journald.max_level_store")) {
1506
1507 if (proc_cmdline_value_missing(key, value))
1508 return 0;
1509
5707ecf3
ZJS
1510 r = log_level_from_string(value);
1511 if (r < 0)
1512 log_warning("Failed to parse max level store value \"%s\". Ignoring.", value);
1513 else
1514 s->max_level_store = r;
1d84ad94
LP
1515
1516 } else if (proc_cmdline_key_streq(key, "systemd.journald.max_level_syslog")) {
1517
1518 if (proc_cmdline_value_missing(key, value))
1519 return 0;
1520
5707ecf3
ZJS
1521 r = log_level_from_string(value);
1522 if (r < 0)
1523 log_warning("Failed to parse max level syslog value \"%s\". Ignoring.", value);
1524 else
1525 s->max_level_syslog = r;
1d84ad94
LP
1526
1527 } else if (proc_cmdline_key_streq(key, "systemd.journald.max_level_kmsg")) {
1528
1529 if (proc_cmdline_value_missing(key, value))
1530 return 0;
1531
5707ecf3
ZJS
1532 r = log_level_from_string(value);
1533 if (r < 0)
1534 log_warning("Failed to parse max level kmsg value \"%s\". Ignoring.", value);
1535 else
1536 s->max_level_kmsg = r;
1d84ad94
LP
1537
1538 } else if (proc_cmdline_key_streq(key, "systemd.journald.max_level_wall")) {
1539
1540 if (proc_cmdline_value_missing(key, value))
1541 return 0;
1542
5707ecf3
ZJS
1543 r = log_level_from_string(value);
1544 if (r < 0)
1545 log_warning("Failed to parse max level wall value \"%s\". Ignoring.", value);
1546 else
1547 s->max_level_wall = r;
1d84ad94 1548
5707ecf3
ZJS
1549 } else if (startswith(key, "systemd.journald"))
1550 log_warning("Unknown journald kernel command line option \"%s\". Ignoring.", key);
d025f1e4 1551
804ae586 1552 /* do not warn about state here, since probably systemd already did */
db91ea32 1553 return 0;
d025f1e4
ZJS
1554}
1555
1556static int server_parse_config_file(Server *s) {
d025f1e4
ZJS
1557 assert(s);
1558
43688c49 1559 return config_parse_many_nulstr(PKGSYSCONFDIR "/journald.conf",
da412854
YW
1560 CONF_PATHS_NULSTR("systemd/journald.conf.d"),
1561 "Journal\0",
1562 config_item_perf_lookup, journald_gperf_lookup,
bcde742e 1563 CONFIG_PARSE_WARN, s);
d025f1e4
ZJS
1564}
1565
f9a810be
LP
1566static int server_dispatch_sync(sd_event_source *es, usec_t t, void *userdata) {
1567 Server *s = userdata;
26687bf8
OS
1568
1569 assert(s);
1570
f9a810be 1571 server_sync(s);
26687bf8
OS
1572 return 0;
1573}
1574
d07f7b9e 1575int server_schedule_sync(Server *s, int priority) {
26687bf8
OS
1576 int r;
1577
26687bf8
OS
1578 assert(s);
1579
d07f7b9e
LP
1580 if (priority <= LOG_CRIT) {
1581 /* Immediately sync to disk when this is of priority CRIT, ALERT, EMERG */
1582 server_sync(s);
1583 return 0;
1584 }
1585
26687bf8
OS
1586 if (s->sync_scheduled)
1587 return 0;
1588
f9a810be
LP
1589 if (s->sync_interval_usec > 0) {
1590 usec_t when;
ca267016 1591
6a0f1f6d 1592 r = sd_event_now(s->event, CLOCK_MONOTONIC, &when);
f9a810be
LP
1593 if (r < 0)
1594 return r;
26687bf8 1595
f9a810be
LP
1596 when += s->sync_interval_usec;
1597
1598 if (!s->sync_event_source) {
6a0f1f6d
LP
1599 r = sd_event_add_time(
1600 s->event,
1601 &s->sync_event_source,
1602 CLOCK_MONOTONIC,
1603 when, 0,
1604 server_dispatch_sync, s);
f9a810be
LP
1605 if (r < 0)
1606 return r;
1607
1608 r = sd_event_source_set_priority(s->sync_event_source, SD_EVENT_PRIORITY_IMPORTANT);
1609 } else {
1610 r = sd_event_source_set_time(s->sync_event_source, when);
1611 if (r < 0)
1612 return r;
1613
1614 r = sd_event_source_set_enabled(s->sync_event_source, SD_EVENT_ONESHOT);
1615 }
26687bf8 1616 if (r < 0)
f9a810be 1617 return r;
26687bf8 1618
f9a810be
LP
1619 s->sync_scheduled = true;
1620 }
26687bf8
OS
1621
1622 return 0;
1623}
1624
0c24bb23
LP
1625static int dispatch_hostname_change(sd_event_source *es, int fd, uint32_t revents, void *userdata) {
1626 Server *s = userdata;
1627
1628 assert(s);
1629
1630 server_cache_hostname(s);
1631 return 0;
1632}
1633
1634static int server_open_hostname(Server *s) {
1635 int r;
1636
1637 assert(s);
1638
db4a47e9
LP
1639 s->hostname_fd = open("/proc/sys/kernel/hostname",
1640 O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY);
4a62c710
MS
1641 if (s->hostname_fd < 0)
1642 return log_error_errno(errno, "Failed to open /proc/sys/kernel/hostname: %m");
0c24bb23 1643
151b9b96 1644 r = sd_event_add_io(s->event, &s->hostname_event_source, s->hostname_fd, 0, dispatch_hostname_change, s);
0c24bb23 1645 if (r < 0) {
28def94c
DR
1646 /* kernels prior to 3.2 don't support polling this file. Ignore
1647 * the failure. */
1648 if (r == -EPERM) {
e53fc357 1649 log_warning_errno(r, "Failed to register hostname fd in event loop, ignoring: %m");
03e334a1 1650 s->hostname_fd = safe_close(s->hostname_fd);
28def94c
DR
1651 return 0;
1652 }
1653
23bbb0de 1654 return log_error_errno(r, "Failed to register hostname fd in event loop: %m");
0c24bb23
LP
1655 }
1656
1657 r = sd_event_source_set_priority(s->hostname_event_source, SD_EVENT_PRIORITY_IMPORTANT-10);
23bbb0de
MS
1658 if (r < 0)
1659 return log_error_errno(r, "Failed to adjust priority of host name event source: %m");
0c24bb23
LP
1660
1661 return 0;
1662}
1663
e22aa3d3
LP
1664static int dispatch_notify_event(sd_event_source *es, int fd, uint32_t revents, void *userdata) {
1665 Server *s = userdata;
1666 int r;
1667
1668 assert(s);
1669 assert(s->notify_event_source == es);
1670 assert(s->notify_fd == fd);
1671
e22aa3d3 1672 /* The $NOTIFY_SOCKET is writable again, now send exactly one
dd835265 1673 * message on it. Either it's the watchdog event, the initial
119e9655
LP
1674 * READY=1 event or an stdout stream event. If there's nothing
1675 * to write anymore, turn our event source off. The next time
1676 * there's something to send it will be turned on again. */
e22aa3d3
LP
1677
1678 if (!s->sent_notify_ready) {
1679 static const char p[] =
1680 "READY=1\n"
1681 "STATUS=Processing requests...";
1682 ssize_t l;
1683
1684 l = send(s->notify_fd, p, strlen(p), MSG_DONTWAIT);
1685 if (l < 0) {
1686 if (errno == EAGAIN)
1687 return 0;
1688
1689 return log_error_errno(errno, "Failed to send READY=1 notification message: %m");
1690 }
1691
1692 s->sent_notify_ready = true;
1693 log_debug("Sent READY=1 notification.");
1694
119e9655
LP
1695 } else if (s->send_watchdog) {
1696
1697 static const char p[] =
1698 "WATCHDOG=1";
1699
1700 ssize_t l;
1701
1702 l = send(s->notify_fd, p, strlen(p), MSG_DONTWAIT);
1703 if (l < 0) {
1704 if (errno == EAGAIN)
1705 return 0;
1706
1707 return log_error_errno(errno, "Failed to send WATCHDOG=1 notification message: %m");
1708 }
1709
1710 s->send_watchdog = false;
1711 log_debug("Sent WATCHDOG=1 notification.");
1712
e22aa3d3
LP
1713 } else if (s->stdout_streams_notify_queue)
1714 /* Dispatch one stream notification event */
1715 stdout_stream_send_notify(s->stdout_streams_notify_queue);
1716
61233823 1717 /* Leave us enabled if there's still more to do. */
119e9655 1718 if (s->send_watchdog || s->stdout_streams_notify_queue)
e22aa3d3
LP
1719 return 0;
1720
1721 /* There was nothing to do anymore, let's turn ourselves off. */
1722 r = sd_event_source_set_enabled(es, SD_EVENT_OFF);
1723 if (r < 0)
1724 return log_error_errno(r, "Failed to turn off notify event source: %m");
1725
1726 return 0;
1727}
1728
119e9655
LP
1729static int dispatch_watchdog(sd_event_source *es, uint64_t usec, void *userdata) {
1730 Server *s = userdata;
1731 int r;
1732
1733 assert(s);
1734
1735 s->send_watchdog = true;
1736
1737 r = sd_event_source_set_enabled(s->notify_event_source, SD_EVENT_ON);
1738 if (r < 0)
1739 log_warning_errno(r, "Failed to turn on notify event source: %m");
1740
1741 r = sd_event_source_set_time(s->watchdog_event_source, usec + s->watchdog_usec / 2);
1742 if (r < 0)
1743 return log_error_errno(r, "Failed to restart watchdog event source: %m");
1744
1745 r = sd_event_source_set_enabled(s->watchdog_event_source, SD_EVENT_ON);
1746 if (r < 0)
1747 return log_error_errno(r, "Failed to enable watchdog event source: %m");
1748
1749 return 0;
1750}
1751
e22aa3d3 1752static int server_connect_notify(Server *s) {
15a3e96f 1753 union sockaddr_union sa = {};
e22aa3d3 1754 const char *e;
15a3e96f 1755 int r, salen;
e22aa3d3
LP
1756
1757 assert(s);
1758 assert(s->notify_fd < 0);
1759 assert(!s->notify_event_source);
1760
1761 /*
1762 So here's the problem: we'd like to send notification
1763 messages to PID 1, but we cannot do that via sd_notify(),
1764 since that's synchronous, and we might end up blocking on
1765 it. Specifically: given that PID 1 might block on
1766 dbus-daemon during IPC, and dbus-daemon is logging to us,
1767 and might hence block on us, we might end up in a deadlock
ccddd104 1768 if we block on sending PID 1 notification messages — by
e22aa3d3
LP
1769 generating a full blocking circle. To avoid this, let's
1770 create a non-blocking socket, and connect it to the
1771 notification socket, and then wait for POLLOUT before we
1772 send anything. This should efficiently avoid any deadlocks,
1773 as we'll never block on PID 1, hence PID 1 can safely block
1774 on dbus-daemon which can safely block on us again.
1775
1776 Don't think that this issue is real? It is, see:
1777 https://github.com/systemd/systemd/issues/1505
1778 */
1779
1780 e = getenv("NOTIFY_SOCKET");
1781 if (!e)
1782 return 0;
1783
15a3e96f
LP
1784 salen = sockaddr_un_set_path(&sa.un, e);
1785 if (salen < 0)
1786 return log_error_errno(salen, "NOTIFY_SOCKET set to invalid value '%s': %m", e);
e22aa3d3
LP
1787
1788 s->notify_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1789 if (s->notify_fd < 0)
1790 return log_error_errno(errno, "Failed to create notify socket: %m");
1791
1792 (void) fd_inc_sndbuf(s->notify_fd, NOTIFY_SNDBUF_SIZE);
1793
15a3e96f 1794 r = connect(s->notify_fd, &sa.sa, salen);
e22aa3d3
LP
1795 if (r < 0)
1796 return log_error_errno(errno, "Failed to connect to notify socket: %m");
1797
1798 r = sd_event_add_io(s->event, &s->notify_event_source, s->notify_fd, EPOLLOUT, dispatch_notify_event, s);
1799 if (r < 0)
1800 return log_error_errno(r, "Failed to watch notification socket: %m");
1801
119e9655
LP
1802 if (sd_watchdog_enabled(false, &s->watchdog_usec) > 0) {
1803 s->send_watchdog = true;
1804
4de2402b 1805 r = sd_event_add_time(s->event, &s->watchdog_event_source, CLOCK_MONOTONIC, now(CLOCK_MONOTONIC) + s->watchdog_usec/2, s->watchdog_usec/4, dispatch_watchdog, s);
119e9655
LP
1806 if (r < 0)
1807 return log_error_errno(r, "Failed to add watchdog time event: %m");
1808 }
1809
e22aa3d3
LP
1810 /* This should fire pretty soon, which we'll use to send the
1811 * READY=1 event. */
1812
1813 return 0;
1814}
1815
d025f1e4 1816int server_init(Server *s) {
13790add 1817 _cleanup_fdset_free_ FDSet *fds = NULL;
d025f1e4 1818 int n, r, fd;
7d18d348 1819 bool no_sockets;
d025f1e4
ZJS
1820
1821 assert(s);
1822
1823 zero(*s);
e22aa3d3 1824 s->syslog_fd = s->native_fd = s->stdout_fd = s->dev_kmsg_fd = s->audit_fd = s->hostname_fd = s->notify_fd = -1;
1b7cf0e5
AG
1825 s->compress.enabled = true;
1826 s->compress.threshold_bytes = (uint64_t) -1;
d025f1e4 1827 s->seal = true;
b2392ff3 1828 s->read_kmsg = true;
d025f1e4 1829
119e9655
LP
1830 s->watchdog_usec = USEC_INFINITY;
1831
26687bf8
OS
1832 s->sync_interval_usec = DEFAULT_SYNC_INTERVAL_USEC;
1833 s->sync_scheduled = false;
1834
d025f1e4
ZJS
1835 s->rate_limit_interval = DEFAULT_RATE_LIMIT_INTERVAL;
1836 s->rate_limit_burst = DEFAULT_RATE_LIMIT_BURST;
1837
40b71e89 1838 s->forward_to_wall = true;
d025f1e4 1839
e150e820
MB
1840 s->max_file_usec = DEFAULT_MAX_FILE_USEC;
1841
d025f1e4
ZJS
1842 s->max_level_store = LOG_DEBUG;
1843 s->max_level_syslog = LOG_DEBUG;
1844 s->max_level_kmsg = LOG_NOTICE;
1845 s->max_level_console = LOG_INFO;
40b71e89 1846 s->max_level_wall = LOG_EMERG;
d025f1e4 1847
ec20fe5f
LP
1848 s->line_max = DEFAULT_LINE_MAX;
1849
266a4700
FB
1850 journal_reset_metrics(&s->system_storage.metrics);
1851 journal_reset_metrics(&s->runtime_storage.metrics);
d025f1e4
ZJS
1852
1853 server_parse_config_file(s);
1d84ad94
LP
1854
1855 r = proc_cmdline_parse(parse_proc_cmdline_item, s, PROC_CMDLINE_STRIP_RD_PREFIX);
1856 if (r < 0)
1857 log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
8580d1f7 1858
d288f79f 1859 if (!!s->rate_limit_interval ^ !!s->rate_limit_burst) {
b1389b0d
ZJS
1860 log_debug("Setting both rate limit interval and burst from "USEC_FMT",%u to 0,0",
1861 s->rate_limit_interval, s->rate_limit_burst);
d288f79f
ZJS
1862 s->rate_limit_interval = s->rate_limit_burst = 0;
1863 }
d025f1e4 1864
8580d1f7 1865 (void) mkdir_p("/run/systemd/journal", 0755);
d025f1e4 1866
43cf8388 1867 s->user_journals = ordered_hashmap_new(NULL);
d025f1e4
ZJS
1868 if (!s->user_journals)
1869 return log_oom();
1870
1871 s->mmap = mmap_cache_new();
1872 if (!s->mmap)
1873 return log_oom();
1874
b58c888f
VC
1875 s->deferred_closes = set_new(NULL);
1876 if (!s->deferred_closes)
1877 return log_oom();
1878
f9a810be 1879 r = sd_event_default(&s->event);
23bbb0de
MS
1880 if (r < 0)
1881 return log_error_errno(r, "Failed to create event loop: %m");
d025f1e4
ZJS
1882
1883 n = sd_listen_fds(true);
23bbb0de
MS
1884 if (n < 0)
1885 return log_error_errno(n, "Failed to read listening file descriptors from environment: %m");
d025f1e4
ZJS
1886
1887 for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd++) {
1888
1889 if (sd_is_socket_unix(fd, SOCK_DGRAM, -1, "/run/systemd/journal/socket", 0) > 0) {
1890
baaa35ad
ZJS
1891 if (s->native_fd >= 0)
1892 return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
1893 "Too many native sockets passed.");
d025f1e4
ZJS
1894
1895 s->native_fd = fd;
1896
1897 } else if (sd_is_socket_unix(fd, SOCK_STREAM, 1, "/run/systemd/journal/stdout", 0) > 0) {
1898
baaa35ad
ZJS
1899 if (s->stdout_fd >= 0)
1900 return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
1901 "Too many stdout sockets passed.");
d025f1e4
ZJS
1902
1903 s->stdout_fd = fd;
1904
03ee5c38
LP
1905 } else if (sd_is_socket_unix(fd, SOCK_DGRAM, -1, "/dev/log", 0) > 0 ||
1906 sd_is_socket_unix(fd, SOCK_DGRAM, -1, "/run/systemd/journal/dev-log", 0) > 0) {
d025f1e4 1907
baaa35ad
ZJS
1908 if (s->syslog_fd >= 0)
1909 return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
1910 "Too many /dev/log sockets passed.");
d025f1e4
ZJS
1911
1912 s->syslog_fd = fd;
1913
875c2e22
LP
1914 } else if (sd_is_socket(fd, AF_NETLINK, SOCK_RAW, -1) > 0) {
1915
baaa35ad
ZJS
1916 if (s->audit_fd >= 0)
1917 return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
1918 "Too many audit sockets passed.");
875c2e22
LP
1919
1920 s->audit_fd = fd;
1921
4ec3cd73 1922 } else {
4ec3cd73 1923
13790add
LP
1924 if (!fds) {
1925 fds = fdset_new();
1926 if (!fds)
1927 return log_oom();
1928 }
4ec3cd73 1929
13790add
LP
1930 r = fdset_put(fds, fd);
1931 if (r < 0)
1932 return log_oom();
4ec3cd73 1933 }
d025f1e4
ZJS
1934 }
1935
15d91bff
ZJS
1936 /* Try to restore streams, but don't bother if this fails */
1937 (void) server_restore_streams(s, fds);
d025f1e4 1938
13790add
LP
1939 if (fdset_size(fds) > 0) {
1940 log_warning("%u unknown file descriptors passed, closing.", fdset_size(fds));
1941 fds = fdset_free(fds);
1942 }
1943
7d18d348
ZJS
1944 no_sockets = s->native_fd < 0 && s->stdout_fd < 0 && s->syslog_fd < 0 && s->audit_fd < 0;
1945
1946 /* always open stdout, syslog, native, and kmsg sockets */
37b7affe
ZJS
1947
1948 /* systemd-journald.socket: /run/systemd/journal/stdout */
15d91bff
ZJS
1949 r = server_open_stdout_socket(s);
1950 if (r < 0)
1951 return r;
1952
37b7affe 1953 /* systemd-journald-dev-log.socket: /run/systemd/journal/dev-log */
13790add 1954 r = server_open_syslog_socket(s);
d025f1e4
ZJS
1955 if (r < 0)
1956 return r;
1957
37b7affe 1958 /* systemd-journald.socket: /run/systemd/journal/socket */
13790add 1959 r = server_open_native_socket(s);
d025f1e4
ZJS
1960 if (r < 0)
1961 return r;
1962
b2392ff3 1963 /* /dev/kmsg */
d025f1e4
ZJS
1964 r = server_open_dev_kmsg(s);
1965 if (r < 0)
1966 return r;
1967
7d18d348
ZJS
1968 /* Unless we got *some* sockets and not audit, open audit socket */
1969 if (s->audit_fd >= 0 || no_sockets) {
1970 r = server_open_audit(s);
1971 if (r < 0)
1972 return r;
1973 }
875c2e22 1974
d025f1e4
ZJS
1975 r = server_open_kernel_seqnum(s);
1976 if (r < 0)
1977 return r;
1978
0c24bb23
LP
1979 r = server_open_hostname(s);
1980 if (r < 0)
1981 return r;
1982
f9a810be 1983 r = setup_signals(s);
d025f1e4
ZJS
1984 if (r < 0)
1985 return r;
1986
90fc172e 1987 s->rate_limit = journal_rate_limit_new();
d025f1e4
ZJS
1988 if (!s->rate_limit)
1989 return -ENOMEM;
1990
e9174f29
LP
1991 r = cg_get_root_path(&s->cgroup_root);
1992 if (r < 0)
1993 return r;
1994
0c24bb23
LP
1995 server_cache_hostname(s);
1996 server_cache_boot_id(s);
1997 server_cache_machine_id(s);
1998
266a4700
FB
1999 s->runtime_storage.name = "Runtime journal";
2000 s->system_storage.name = "System journal";
2001
605405c6
ZJS
2002 s->runtime_storage.path = strjoin("/run/log/journal/", SERVER_MACHINE_ID(s));
2003 s->system_storage.path = strjoin("/var/log/journal/", SERVER_MACHINE_ID(s));
266a4700
FB
2004 if (!s->runtime_storage.path || !s->system_storage.path)
2005 return -ENOMEM;
2006
e22aa3d3
LP
2007 (void) server_connect_notify(s);
2008
22e3a02b
LP
2009 (void) client_context_acquire_default(s);
2010
804ae586 2011 return system_journal_open(s, false);
d025f1e4
ZJS
2012}
2013
2014void server_maybe_append_tags(Server *s) {
349cc4a5 2015#if HAVE_GCRYPT
d025f1e4
ZJS
2016 JournalFile *f;
2017 Iterator i;
2018 usec_t n;
2019
2020 n = now(CLOCK_REALTIME);
2021
2022 if (s->system_journal)
2023 journal_file_maybe_append_tag(s->system_journal, n);
2024
43cf8388 2025 ORDERED_HASHMAP_FOREACH(f, s->user_journals, i)
d025f1e4
ZJS
2026 journal_file_maybe_append_tag(f, n);
2027#endif
2028}
2029
2030void server_done(Server *s) {
d025f1e4
ZJS
2031 assert(s);
2032
f9168190 2033 set_free_with_destructor(s->deferred_closes, journal_file_close);
b58c888f 2034
d025f1e4
ZJS
2035 while (s->stdout_streams)
2036 stdout_stream_free(s->stdout_streams);
2037
22e3a02b
LP
2038 client_context_flush_all(s);
2039
d025f1e4 2040 if (s->system_journal)
69a3a6fd 2041 (void) journal_file_close(s->system_journal);
d025f1e4
ZJS
2042
2043 if (s->runtime_journal)
69a3a6fd 2044 (void) journal_file_close(s->runtime_journal);
d025f1e4 2045
f9168190 2046 ordered_hashmap_free_with_destructor(s->user_journals, journal_file_close);
d025f1e4 2047
f9a810be
LP
2048 sd_event_source_unref(s->syslog_event_source);
2049 sd_event_source_unref(s->native_event_source);
2050 sd_event_source_unref(s->stdout_event_source);
2051 sd_event_source_unref(s->dev_kmsg_event_source);
875c2e22 2052 sd_event_source_unref(s->audit_event_source);
f9a810be
LP
2053 sd_event_source_unref(s->sync_event_source);
2054 sd_event_source_unref(s->sigusr1_event_source);
2055 sd_event_source_unref(s->sigusr2_event_source);
2056 sd_event_source_unref(s->sigterm_event_source);
2057 sd_event_source_unref(s->sigint_event_source);
94b65516 2058 sd_event_source_unref(s->sigrtmin1_event_source);
0c24bb23 2059 sd_event_source_unref(s->hostname_event_source);
e22aa3d3 2060 sd_event_source_unref(s->notify_event_source);
119e9655 2061 sd_event_source_unref(s->watchdog_event_source);
f9a810be 2062 sd_event_unref(s->event);
d025f1e4 2063
03e334a1
LP
2064 safe_close(s->syslog_fd);
2065 safe_close(s->native_fd);
2066 safe_close(s->stdout_fd);
2067 safe_close(s->dev_kmsg_fd);
875c2e22 2068 safe_close(s->audit_fd);
03e334a1 2069 safe_close(s->hostname_fd);
e22aa3d3 2070 safe_close(s->notify_fd);
0c24bb23 2071
d025f1e4
ZJS
2072 if (s->rate_limit)
2073 journal_rate_limit_free(s->rate_limit);
2074
2075 if (s->kernel_seqnum)
2076 munmap(s->kernel_seqnum, sizeof(uint64_t));
2077
2078 free(s->buffer);
2079 free(s->tty_path);
e9174f29 2080 free(s->cgroup_root);
99d0966e 2081 free(s->hostname_field);
c6e9e16f
ZJS
2082 free(s->runtime_storage.path);
2083 free(s->system_storage.path);
d025f1e4
ZJS
2084
2085 if (s->mmap)
2086 mmap_cache_unref(s->mmap);
d025f1e4 2087}
8580d1f7
LP
2088
2089static const char* const storage_table[_STORAGE_MAX] = {
2090 [STORAGE_AUTO] = "auto",
2091 [STORAGE_VOLATILE] = "volatile",
2092 [STORAGE_PERSISTENT] = "persistent",
2093 [STORAGE_NONE] = "none"
2094};
2095
2096DEFINE_STRING_TABLE_LOOKUP(storage, Storage);
2097DEFINE_CONFIG_PARSE_ENUM(config_parse_storage, storage, Storage, "Failed to parse storage setting");
2098
2099static const char* const split_mode_table[_SPLIT_MAX] = {
2100 [SPLIT_LOGIN] = "login",
2101 [SPLIT_UID] = "uid",
2102 [SPLIT_NONE] = "none",
2103};
2104
2105DEFINE_STRING_TABLE_LOOKUP(split_mode, SplitMode);
2106DEFINE_CONFIG_PARSE_ENUM(config_parse_split_mode, split_mode, SplitMode, "Failed to parse split mode setting");
ec20fe5f
LP
2107
2108int config_parse_line_max(
2109 const char* unit,
2110 const char *filename,
2111 unsigned line,
2112 const char *section,
2113 unsigned section_line,
2114 const char *lvalue,
2115 int ltype,
2116 const char *rvalue,
2117 void *data,
2118 void *userdata) {
2119
2120 size_t *sz = data;
2121 int r;
2122
2123 assert(filename);
2124 assert(lvalue);
2125 assert(rvalue);
2126 assert(data);
2127
2128 if (isempty(rvalue))
2129 /* Empty assignment means default */
2130 *sz = DEFAULT_LINE_MAX;
2131 else {
2132 uint64_t v;
2133
2134 r = parse_size(rvalue, 1024, &v);
2135 if (r < 0) {
2136 log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse LineMax= value, ignoring: %s", rvalue);
2137 return 0;
2138 }
2139
2140 if (v < 79) {
2141 /* Why specify 79 here as minimum line length? Simply, because the most common traditional
2142 * terminal size is 80ch, and it might make sense to break one character before the natural
2143 * line break would occur on that. */
2144 log_syntax(unit, LOG_WARNING, filename, line, 0, "LineMax= too small, clamping to 79: %s", rvalue);
2145 *sz = 79;
2146 } else if (v > (uint64_t) (SSIZE_MAX-1)) {
2147 /* So, why specify SSIZE_MAX-1 here? Because that's one below the largest size value read()
2148 * can return, and we need one extra byte for the trailing NUL byte. Of course IRL such large
2149 * memory allocations will fail anyway, hence this limit is mostly theoretical anyway, as we'll
2150 * fail much earlier anyway. */
2151 log_syntax(unit, LOG_WARNING, filename, line, 0, "LineMax= too large, clamping to %" PRIu64 ": %s", (uint64_t) (SSIZE_MAX-1), rvalue);
2152 *sz = SSIZE_MAX-1;
2153 } else
2154 *sz = (size_t) v;
2155 }
2156
2157 return 0;
2158}
1b7cf0e5
AG
2159
2160int config_parse_compress(const char* unit,
2161 const char *filename,
2162 unsigned line,
2163 const char *section,
2164 unsigned section_line,
2165 const char *lvalue,
2166 int ltype,
2167 const char *rvalue,
2168 void *data,
2169 void *userdata) {
2170 JournalCompressOptions* compress = data;
2171 int r;
2172
2173 if (streq(rvalue, "1")) {
2174 log_syntax(unit, LOG_WARNING, filename, line, 0,
2175 "Compress= ambiguously specified as 1, enabling compression with default threshold");
2176 compress->enabled = true;
2177 } else if (streq(rvalue, "0")) {
2178 log_syntax(unit, LOG_WARNING, filename, line, 0,
2179 "Compress= ambiguously specified as 0, disabling compression");
2180 compress->enabled = false;
2181 } else if ((r = parse_boolean(rvalue)) >= 0)
2182 compress->enabled = r;
2183 else if (parse_size(rvalue, 1024, &compress->threshold_bytes) == 0)
2184 compress->enabled = true;
2185 else if (isempty(rvalue)) {
2186 compress->enabled = true;
2187 compress->threshold_bytes = (uint64_t) -1;
2188 } else
2189 log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse Compress= value, ignoring: %s", rvalue);
2190
2191 return 0;
2192}