LIBSYSTEMD_DAEMON_REVISION=0
LIBSYSTEMD_DAEMON_AGE=0
+ LIBSYSTEMD_ID128_CURRENT=0
+ LIBSYSTEMD_ID128_REVISION=0
+ LIBSYSTEMD_ID128_AGE=0
+
+ LIBSYSTEMD_JOURNAL_CURRENT=0
+ LIBSYSTEMD_JOURNAL_REVISION=0
+ LIBSYSTEMD_JOURNAL_AGE=0
+
# Dirs of external packages
dbuspolicydir=@dbuspolicydir@
dbussessionservicedir=@dbussessionservicedir@
systemd-ask-password \
systemd-tty-ask-password-agent \
systemd-tmpfiles \
- systemd-machine-id-setup
+ systemd-machine-id-setup \
+ systemd-journalctl
bin_PROGRAMS = \
systemd-cgls \
systemd-detect-virt \
systemd-sysctl \
systemd-logind \
- systemd-uaccess
+ systemd-uaccess \
+ systemd-journald
if ENABLE_BINFMT
rootlibexec_PROGRAMS += \
lib_LTLIBRARIES = \
libsystemd-daemon.la \
- libsystemd-login.la
+ libsystemd-login.la \
+ libsystemd-id128.la \
+ libsystemd-journal.la
pkginclude_HEADERS = \
src/sd-daemon.h \
- src/sd-login.h
+ src/sd-login.h \
+ src/sd-id128.h \
+ src/journal/sd-journal.h
noinst_PROGRAMS = \
test-engine \
test-env-replace \
test-strv \
test-login \
- test-install
+ test-install \
+ test-id128 \
+ test-journal
if HAVE_PAM
pamlib_LTLIBRARIES = \
units/quotaon.service \
units/systemd-ask-password-wall.path \
units/systemd-ask-password-console.path \
- units/syslog.target
+ units/syslog.target \
+ units/systemd-journald.socket
if HAVE_SYSV_COMPAT
dist_systemunit_DATA += \
units/systemd-stdout-syslog-bridge.service \
units/systemd-shutdownd.service \
units/systemd-logind.service \
+ units/systemd-journald.service \
units/systemd-kmsg-syslogd.service \
units/systemd-modules-load.service \
units/systemd-vconsole-setup.service \
units/systemd-stdout-syslog-bridge.service.in \
units/systemd-shutdownd.service.in \
units/systemd-logind.service.in \
- units/systemd-kmsg-syslogd.service.in \
+ units/systemd-journald.service.in \
+ units/systemd-kmsg-syslogd.service.in \
units/systemd-modules-load.service.in \
units/systemd-vconsole-setup.service.in \
units/systemd-remount-api-vfs.service.in \
systemd.pc.in \
libsystemd-daemon.pc.in \
libsystemd-login.pc.in \
+ libsystemd-id128.pc.in \
+ libsystemd-journal.pc.in \
src/libsystemd-daemon.sym \
src/libsystemd-login.sym \
+ src/libsystemd-id128.sym \
+ src/libsystemd-journal.sym \
introspect.awk \
src/73-seat-late.rules.in \
- src/99-systemd.rules.in
+ src/99-systemd.rules.in \
+ man/custom-html.xsl
if ENABLE_BINFMT
EXTRA_DIST += \
units/fedora/prefdm.service \
units/fedora/rc-local.service \
units/fedora/halt-local.service
+systemgenerator_PROGRAMS += \
+ systemd-rc-local-generator
endif
if TARGET_MANDRIVA
units/mandriva/prefdm.service \
units/fedora/rc-local.service \
units/fedora/halt-local.service
+systemgenerator_PROGRAMS += \
+ systemd-rc-local-generator
endif
if TARGET_FRUGALWARE
dist_systemunit_DATA += \
units/suse/rc-local.service \
units/suse/halt-local.service
+systemgenerator_PROGRAMS += \
+ systemd-rc-local-generator
endif
if TARGET_MAGEIA
units/mageia/prefdm.service \
units/fedora/rc-local.service \
units/fedora/halt-local.service
+systemgenerator_PROGRAMS += \
+ systemd-rc-local-generator
endif
if HAVE_PLYMOUTH
pkgconfiglib_DATA = \
libsystemd-daemon.pc \
- libsystemd-login.pc
+ libsystemd-login.pc \
+ libsystemd-id128.pc \
+ libsystemd-journal.pc
# Passed through intltool only
polkitpolicy_in_files = \
src/dbus-common.c \
src/sd-daemon.c \
src/install.c \
- src/cgroup-attr.c
+ src/cgroup-attr.c \
+ src/sd-id128.c
nodist_libsystemd_core_la_SOURCES = \
src/load-fragment-gperf.c \
src/logind-user.h \
src/logind-acl.h \
src/dbus-loop.h \
- src/spawn-agent.h
+ src/spawn-agent.h \
+ src/journal/journal-def.h \
+ src/journal/journal-internal.h \
+ src/journal/journal-file.h \
+ src/journal/lookup3.h \
+ src/journal/compress.h \
+ src/journal/journal-rate-limit.h \
+ src/acl-util.h
MANPAGES = \
man/systemd.1 \
man/daemon.7 \
man/sd-daemon.7 \
man/sd-readahead.7 \
+ man/sd-login.7 \
man/runlevel.8 \
man/telinit.8 \
man/halt.8 \
man/modules-load.d.5 \
man/sysctl.d.5 \
man/systemd-ask-password.1 \
- man/systemd-loginctl.1
+ man/systemd-loginctl.1 \
+ man/sd_pid_get_session.3 \
+ man/sd_uid_get_state.3 \
+ man/sd_session_is_active.3 \
+ man/sd_seat_get_active.3 \
+ man/sd_get_seats.3 \
+ man/sd_login_monitor_new.3
if ENABLE_BINFMT
MANPAGES += \
man/sd_is_socket.3 \
man/sd_is_socket_unix.3 \
man/sd_is_socket_inet.3 \
+ man/sd_is_mq.3 \
man/sd_notifyf.3 \
- man/init.1
+ man/init.1 \
+ man/sd_session_get_uid.3 \
+ man/sd_session_get_seat.3 \
+ man/sd_pid_get_owner_uid.3 \
+ man/sd_uid_is_on_seat.3 \
+ man/sd_uid_get_sessions.3 \
+ man/sd_uid_get_seats.3 \
+ man/sd_seat_get_sessions.3 \
+ man/sd_seat_can_multi_session.3 \
+ man/sd_get_sessions.3 \
+ man/sd_get_uids.3 \
+ man/sd_login_monitor_unref.3 \
+ man/sd_login_monitor_flush.3 \
+ man/sd_login_monitor_get_fd.3
man/reboot.8: man/halt.8
man/poweroff.8: man/halt.8
man/sd_is_socket.3: man/sd_is_fifo.3
man/sd_is_socket_unix.3: man/sd_is_fifo.3
man/sd_is_socket_inet.3: man/sd_is_fifo.3
+ man/sd_is_mq.3: man/sd_is_fifo.3
man/sd_notifyf.3: man/sd_notify.3
man/init.1: man/systemd.1
+ man/sd_session_get_uid.3: man/sd_session_is_active.3
+ man/sd_session_get_seat.3: man/sd_session_is_active.3
+ man/sd_pid_get_owner_uid.3: man/sd_pid_get_session.3
+ man/sd_uid_is_on_seat.3: man/sd_uid_get_state.3
+ man/sd_uid_get_sessions.3: man/sd_uid_get_state.3
+ man/sd_uid_get_seats.3: man/sd_uid_get_state.3
+ man/sd_seat_get_sessions.3: man/sd_seat_get_active.3
+ man/sd_seat_can_multi_session.3: man/sd_seat_get_active.3
+ man/sd_get_sessions.3: man/sd_get_seats.3
+ man/sd_get_uids.3: man/sd_get_seats.3
+ man/sd_login_monitor_unref.3: man/sd_login_monitor_new.3
+ man/sd_login_monitor_flush.3: man/sd_login_monitor_new.3
+ man/sd_login_monitor_get_fd.3: man/sd_login_monitor_new.3
dist_man_MANS = \
$(MANPAGES) \
test_install_LDADD = \
libsystemd-basic.la
+ test_id128_SOURCES = \
+ src/test-id128.c \
+ src/sd-id128.c
+
+ test_id128_CFLAGS = \
+ $(AM_CFLAGS)
+
+ test_id128_LDADD = \
+ libsystemd-basic.la
+
+ test_journal_SOURCES = \
+ src/journal/test-journal.c \
+ src/journal/sd-journal.c \
+ src/journal/journal-file.c \
+ src/journal/lookup3.c \
+ src/journal/journal-send.c \
+ src/sd-id128.c
+
+ test_journal_CFLAGS = \
+ $(AM_CFLAGS)
+
+ test_journal_LDADD = \
+ libsystemd-basic.la
+
+ if HAVE_XZ
+ test_journal_SOURCES += \
+ src/journal/compress.c
+ test_journal_CFLAGS += \
+ $(XZ_CFLAGS)
+ test_journal_LDADD += \
+ $(XZ_LIBS)
+ endif
+
+ systemd_journald_SOURCES = \
+ src/journal/journald.c \
+ src/journal/sd-journal.c \
+ src/journal/journal-file.c \
+ src/journal/lookup3.c \
+ src/journal/journal-rate-limit.c \
+ src/sd-id128.c \
+ src/acl-util.c \
+ src/cgroup-util.c
+
+ systemd_journald_CFLAGS = \
+ $(AM_CFLAGS) \
+ $(ACL_CFLAGS)
+
+ systemd_journald_LDADD = \
+ libsystemd-basic.la \
+ libsystemd-daemon.la \
+ $(ACL_LIBS)
+
+ if HAVE_XZ
+ systemd_journald_SOURCES += \
+ src/journal/compress.c
+ systemd_journald_CFLAGS += \
+ $(XZ_CFLAGS)
+ systemd_journald_LDADD += \
+ $(XZ_LIBS)
+ endif
+
+ systemd_journalctl_SOURCES = \
+ src/journal/journalctl.c \
+ src/journal/sd-journal.c \
+ src/journal/journal-file.c \
+ src/journal/lookup3.c \
+ src/sd-id128.c \
+ src/pager.c
+
+ systemd_journalctl_CFLAGS = \
+ $(AM_CFLAGS)
+
+ systemd_journalctl_LDADD = \
+ libsystemd-basic.la
+
+ if HAVE_XZ
+ systemd_journalctl_SOURCES += \
+ src/journal/compress.c
+ systemd_journalctl_CFLAGS += \
+ $(XZ_CFLAGS)
+ systemd_journalctl_LDADD += \
+ $(XZ_LIBS)
+ endif
+
systemd_stdout_syslog_bridge_SOURCES = \
src/stdout-syslog-bridge.c \
src/tcpwrap.c
if HAVE_ACL
systemd_logind_SOURCES += \
- src/logind-acl.c
+ src/logind-acl.c \
+ src/acl-util.c
systemd_uaccess_SOURCES += \
- src/logind-acl.c
+ src/logind-acl.c \
+ src/acl-util.c
endif
systemd_uaccess_CFLAGS = \
systemd_machine_id_setup_SOURCES = \
src/machine-id-setup.c \
- src/machine-id-main.c
+ src/machine-id-main.c \
+ src/sd-id128.c
systemd_machine_id_setup_CFLAGS = \
$(AM_CFLAGS)
systemd_getty_generator_LDADD = \
libsystemd-basic.la
+systemd_rc_local_generator_SOURCES = \
+ src/rc-local-generator.c
+
+systemd_rc_local_generator_CFLAGS = \
+ $(AM_CFLAGS)
+
+systemd_rc_local_generator_LDADD = \
+ libsystemd-basic.la
+
systemd_user_sessions_SOURCES = \
src/user-sessions.c \
src/cgroup-util.c
libsystemd-login-uninstall-hook:
rm -f $(DESTDIR)$(rootlibdir)/libsystemd-login.so*
+ libsystemd_id128_la_SOURCES = \
+ src/sd-id128.c
+
+ libsystemd_id128_la_CFLAGS = \
+ $(AM_CFLAGS) \
+ -fvisibility=hidden
+
+ libsystemd_id128_la_LDFLAGS = \
+ -shared \
+ -version-info $(LIBSYSTEMD_ID128_CURRENT):$(LIBSYSTEMD_ID128_REVISION):$(LIBSYSTEMD_ID128_AGE) \
+ -Wl,--version-script=$(top_srcdir)/src/libsystemd-id128.sym
+
+ libsystemd_id128_la_LIBADD = \
+ libsystemd-basic.la
+
+ # move lib from $(libdir) to $(rootlibdir) and update devel link, if needed
+ libsystemd-id128-install-hook:
+ if test "$(libdir)" != "$(rootlibdir)"; then \
+ mkdir -p $(DESTDIR)$(rootlibdir) && \
+ so_img_name=$$(readlink $(DESTDIR)$(libdir)/libsystemd-id128.so) && \
+ so_img_rel_target_prefix=$$(echo $(libdir) | sed 's,\(^/\|\)[^/][^/]*,..,g') && \
+ ln -sf $$so_img_rel_target_prefix$(rootlibdir)/$$so_img_name $(DESTDIR)$(libdir)/libsystemd-id128.so && \
+ mv $(DESTDIR)$(libdir)/libsystemd-id128.so.* $(DESTDIR)$(rootlibdir); \
+ fi
+
+ libsystemd-id128-uninstall-hook:
+ rm -f $(DESTDIR)$(rootlibdir)/libsystemd-id128.so*
+
+ libsystemd_journal_la_SOURCES = \
+ src/journal/sd-journal.c \
+ src/journal/journal-file.c \
+ src/journal/compress.c \
+ src/journal/lookup3.c \
+ src/journal/journal-send.c
+
+ libsystemd_journal_la_CFLAGS = \
+ $(AM_CFLAGS) \
+ $(XZ_CFLAGS) \
+ -fvisibility=hidden
+
+ libsystemd_journal_la_LDFLAGS = \
+ -shared \
+ -version-info $(LIBSYSTEMD_JOURNAL_CURRENT):$(LIBSYSTEMD_JOURNAL_REVISION):$(LIBSYSTEMD_JOURNAL_AGE) \
+ -Wl,--version-script=$(top_srcdir)/src/libsystemd-journal.sym
+
+ libsystemd_journal_la_LIBADD = \
+ libsystemd-basic.la \
+ libsystemd-id128.la \
+ $(XZ_LIBS)
+
+ # move lib from $(libdir) to $(rootlibdir) and update devel link, if needed
+ libsystemd-journal-install-hook:
+ if test "$(libdir)" != "$(rootlibdir)"; then \
+ mkdir -p $(DESTDIR)$(rootlibdir) && \
+ so_img_name=$$(readlink $(DESTDIR)$(libdir)/libsystemd-journal.so) && \
+ so_img_rel_target_prefix=$$(echo $(libdir) | sed 's,\(^/\|\)[^/][^/]*,..,g') && \
+ ln -sf $$so_img_rel_target_prefix$(rootlibdir)/$$so_img_name $(DESTDIR)$(libdir)/libsystemd-journal.so && \
+ mv $(DESTDIR)$(libdir)/libsystemd-journal.so.* $(DESTDIR)$(rootlibdir); \
+ fi
+
+ libsystemd-journal-uninstall-hook:
+ rm -f $(DESTDIR)$(rootlibdir)/libsystemd-journal.so*
+
SED_PROCESS = \
$(AM_V_GEN)$(MKDIR_P) $(dir $@) && \
$(SED) -e 's,@rootlibexecdir\@,$(rootlibexecdir),g' \
if HAVE_XSLTPROC
XSLTPROC_FLAGS = \
--nonet \
- --param funcsynopsis.style "'ansi'"
+ --stringparam funcsynopsis.style ansi
XSLTPROC_PROCESS_MAN = \
$(AM_V_GEN)$(MKDIR_P) $(dir $@) && \
XSLTPROC_PROCESS_HTML = \
$(AM_V_GEN)$(MKDIR_P) $(dir $@) && \
- $(XSLTPROC) -o $@ $(XSLTPROC_FLAGS) http://docbook.sourceforge.net/release/xsl/current/xhtml-1_1/docbook.xsl $<
+ $(XSLTPROC) -o $@ $(XSLTPROC_FLAGS) man/custom-html.xsl $<
XSLTPROC_PROCESS_HTML_IN = \
$(AM_V_GEN)$(MKDIR_P) $(dir $@) && \
- $(XSLTPROC) -o ${@:.in=} $(XSLTPROC_FLAGS) http://docbook.sourceforge.net/release/xsl/current/xhtml-1_1/docbook.xsl $< && \
+ $(XSLTPROC) -o ${@:.in=} $(XSLTPROC_FLAGS) man/custom-html.xsl $< && \
mv ${@:.in=} $@
man/%.1: man/%.xml
rm -f user && \
$(LN_S) $(pkgsysconfdir)/user user )
( cd $(DESTDIR)$(systemunitdir)/sockets.target.wants && \
- rm -f systemd-initctl.socket systemd-stdout-syslog-bridge.socket systemd-shutdownd.socket syslog.socket && \
+ rm -f systemd-initctl.socket systemd-stdout-syslog-bridge.socket systemd-shutdownd.socket syslog.socket systemd-journald.socket && \
$(LN_S) ../systemd-stdout-syslog-bridge.socket systemd-stdout-syslog-bridge.socket && \
$(LN_S) ../systemd-initctl.socket systemd-initctl.socket && \
$(LN_S) ../systemd-shutdownd.socket systemd-shutdownd.socket && \
- $(LN_S) ../syslog.socket syslog.socket )
+ $(LN_S) ../syslog.socket syslog.socket && \
+ $(LN_S) ../systemd-journald.socket )
( cd $(DESTDIR)$(systemunitdir)/runlevel1.target.wants && \
rm -f systemd-update-utmp-runlevel.service && \
$(LN_S) ../systemd-update-utmp-runlevel.service systemd-update-utmp-runlevel.service )
if TARGET_FEDORA
$(MKDIR_P) -m 0755 $(DESTDIR)$(systemunitdir)/final.target.wants
- ( cd $(DESTDIR)$(systemunitdir)/multi-user.target.wants && \
- rm -f rc-local.service && \
- $(LN_S) $(systemunitdir)/rc-local.service rc-local.service )
( cd $(DESTDIR)$(systemunitdir)/final.target.wants && \
rm -f halt-local.service && \
$(LN_S) $(systemunitdir)/halt-local.service halt-local.service )
if TARGET_MANDRIVA
$(MKDIR_P) -m 0755 $(DESTDIR)$(systemunitdir)/final.target.wants
- ( cd $(DESTDIR)$(systemunitdir)/multi-user.target.wants && \
- rm -f rc-local.service && \
- $(LN_S) $(systemunitdir)/rc-local.service rc-local.service )
( cd $(DESTDIR)$(systemunitdir)/final.target.wants && \
rm -f halt-local.service && \
$(LN_S) $(systemunitdir)/halt-local.service halt-local.service )
if TARGET_SUSE
$(MKDIR_P) -m 0755 $(DESTDIR)$(systemunitdir)/final.target.wants
- ( cd $(DESTDIR)$(systemunitdir)/multi-user.target.wants && \
- rm -f rc-local.service && \
- $(LN_S) $(systemunitdir)/rc-local.service rc-local.service )
( cd $(DESTDIR)$(systemunitdir) && \
rm -f local.service && \
$(LN_S) rc-local.service local.service )
if TARGET_MAGEIA
$(MKDIR_P) -m 0755 $(DESTDIR)$(systemunitdir)/final.target.wants
- ( cd $(DESTDIR)$(systemunitdir)/multi-user.target.wants && \
- rm -f rc-local.service && \
- $(LN_S) $(systemunitdir)/rc-local.service rc-local.service )
( cd $(DESTDIR)$(systemunitdir)/final.target.wants && \
rm -f halt-local.service && \
$(LN_S) $(systemunitdir)/halt-local.service halt-local.service )
* make polkit checks async
+ * properly handle .mount unit state tracking when two mount points are stacked one on top of another on the exact same mount point.
+
Features:
+ * logind: selinux is borked...
+
+ * logind: sends SessionNew on Lock()?
+
+ * logind: allow showing logout dialog from system
+
+ * document that %% can be used to write % in a string that is specifier extended
+
+ * check utf8 everywhere
+
* when an instanced service exits, remove its parent cgroup too if possible.
+* Make libselinux, libattr, libcap, libdl dependencies only of the tools which actually need them.
+
* as Tom Gundersen pointed out there's a always a dep loop if people use crypto file systems with random keys
* unset container= in PID1?
* patch kernel for xattr support in /dev, /proc/, /sys and /sys/fs/cgroup?
+* NTP: the kernel's 11-minutes-mode syncs the system time to the RTC, but only
+ in an ~30 minutes window. It does not adjust larger differences. Find a way
+ to tell the kernel, to always do a full time sync when the RTC is in UTC and
+ we are in 11-minutes-mode. When we trust the system time to NTP we also want
+ the RTC to sync up.
+
* patch kernel for cpu feature modalias for autoloading aes/kvm/...
- http://git.kernel.org/?p=linux/kernel/git/ak/linux-misc-2.6.git;a=shortlog;h=refs/heads/cpuid-match
- (Rafael J. Wysocki's sysdev rework is on the way. After that CPUs can be exported a proper bus.)
+ (patches in linux-next, on the way to the next kernel)
* kernel: add /proc/sys file exposing CAP_LAST_CAP? sysconf?
+ merged: http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=commit;h=73efc0394e148d0e15583e13712637831f926720
* kernel: add device_type = "fb", "fbcon" to class "graphics"
<refsynopsisdiv>
<funcsynopsis>
- <funcsynopsisinfo>#include "sd-daemon.h"</funcsynopsisinfo>
+ <funcsynopsisinfo>#include <systemd/sd-daemon.h></funcsynopsisinfo>
<funcprototype>
<funcdef>int <function>sd_notify</function></funcdef>
for details.</para>
<para><function>sd_notifyf()</function> is similar to
- <function>sd_notifyf()</function> but takes a
+ <function>sd_notify()</function> but takes a
<function>printf()</function>-like format string plus
arguments.</para>
</refsect1>
fdset_free(s->syslog_fds);
}
- static int server_init(Server *s, unsigned n_sockets) {
- int r;
- unsigned i;
+ static int server_init(Server *s) {
+ int i, r, n;
struct epoll_event ev;
sigset_t mask;
assert(s);
- assert(n_sockets > 0);
zero(*s);
-
s->kmsg_fd = s->signal_fd = -1;
- if ((s->epoll_fd = epoll_create1(EPOLL_CLOEXEC)) < 0) {
- r = -errno;
- log_error("Failed to create epoll object: %s", strerror(errno));
- goto fail;
+ s->epoll_fd = epoll_create1(EPOLL_CLOEXEC);
+ if (s->epoll_fd < 0) {
+ log_error("Failed to create epoll object: %m");
+ return -errno;
+ }
+
+ s->syslog_fds = fdset_new();
+ if (!s->syslog_fds) {
+ log_error("Failed to allocate file descriptor set: %s", strerror(ENOMEM));
+ return -ENOMEM;
}
- if (!(s->syslog_fds = fdset_new())) {
- r = -ENOMEM;
- log_error("Failed to allocate file descriptor set: %s", strerror(errno));
- goto fail;
+ n = sd_listen_fds(true);
+ if (n < 0) {
+ log_error("Failed to read listening file descriptors from environment: %s", strerror(-n));
+ return n;
+ }
+
+ if (n <= 0 || n > SERVER_FD_MAX) {
+ log_error("No or too many file descriptors passed.");
+ return -EINVAL;
}
- for (i = 0; i < n_sockets; i++) {
- int fd;
+ for (i = 0; i < n; i++) {
+ int fd, one = 1;
fd = SD_LISTEN_FDS_START+i;
- if ((r = sd_is_socket(fd, AF_UNSPEC, SOCK_DGRAM, -1)) < 0) {
+ r = sd_is_socket(fd, AF_UNSPEC, SOCK_DGRAM, -1);
+ if (r < 0) {
log_error("Failed to determine file descriptor type: %s", strerror(-r));
- goto fail;
+ return r;
}
if (!r) {
log_error("Wrong file descriptor type.");
- r = -EINVAL;
- goto fail;
+ return -EINVAL;
}
- if (setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one)) < 0)
- log_error("SO_PASSCRED failed: %m");
-
zero(ev);
ev.events = EPOLLIN;
ev.data.fd = fd;
if (epoll_ctl(s->epoll_fd, EPOLL_CTL_ADD, fd, &ev) < 0) {
- r = -errno;
- log_error("Failed to add server fd to epoll object: %s", strerror(errno));
- goto fail;
+ log_error("Failed to add server fd to epoll object: %m");
+ return -errno;
}
- if ((r = fdset_put(s->syslog_fds, fd)) < 0) {
+ r = fdset_put(s->syslog_fds, fd);
+ if (r < 0) {
log_error("Failed to store file descriptor in set: %s", strerror(-r));
- goto fail;
+ return r;
}
}
- if ((s->kmsg_fd = open("/dev/kmsg", O_WRONLY|O_NOCTTY|O_CLOEXEC)) < 0) {
+ s->kmsg_fd = open("/dev/kmsg", O_WRONLY|O_NOCTTY|O_CLOEXEC);
+ if (s->kmsg_fd < 0) {
log_error("Failed to open /dev/kmsg for logging: %m");
return -errno;
}
sigset_add_many(&mask, SIGINT, SIGTERM, -1);
assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
- if ((s->signal_fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC)) < 0) {
+ s->signal_fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
+ if (s->signal_fd < 0) {
log_error("signalfd(): %m");
return -errno;
}
}
return 0;
-
- fail:
- server_done(s);
- return r;
- }
-
- static void skip_date(const char **buf) {
- enum {
- LETTER,
- SPACE,
- NUMBER,
- SPACE_OR_NUMBER,
- COLON
- } sequence[] = {
- LETTER, LETTER, LETTER,
- SPACE,
- SPACE_OR_NUMBER, NUMBER,
- SPACE,
- SPACE_OR_NUMBER, NUMBER,
- COLON,
- SPACE_OR_NUMBER, NUMBER,
- COLON,
- SPACE_OR_NUMBER, NUMBER,
- SPACE
- };
-
- const char *p;
- unsigned i;
-
- assert(buf);
- assert(*buf);
-
- p = *buf;
-
- for (i = 0; i < ELEMENTSOF(sequence); i++, p++) {
-
- if (!*p)
- return;
-
- switch (sequence[i]) {
-
- case SPACE:
- if (*p != ' ')
- return;
- break;
-
- case SPACE_OR_NUMBER:
- if (*p == ' ')
- break;
-
- /* fall through */
-
- case NUMBER:
- if (*p < '0' || *p > '9')
- return;
-
- break;
-
- case LETTER:
- if (!(*p >= 'A' && *p <= 'Z') &&
- !(*p >= 'a' && *p <= 'z'))
- return;
-
- break;
-
- case COLON:
- if (*p != ':')
- return;
- break;
-
- }
- }
-
- *buf = p;
}
static int read_process(const char **buf, struct iovec *iovec) {
return 1;
}
- static void skip_pid(const char **buf) {
- const char *p;
-
- assert(buf);
- assert(*buf);
-
- p = *buf;
-
- if (*p != '[')
- return;
-
- p++;
- p += strspn(p, "0123456789");
-
- if (*p != ']')
- return;
-
- p++;
-
- *buf = p;
- }
-
static int write_message(Server *s, const char *buf, struct ucred *ucred) {
ssize_t k;
char priority[6], pid[16];
IOVEC_SET_STRING(iovec[i++], priority);
/* Second, skip date */
- skip_date(&buf);
+ skip_syslog_date((char**) &buf);
/* Then, add process if set */
if (read_process(&buf, &iovec[i]) > 0)
i++;
else if (ucred &&
ucred->pid > 0 &&
- get_process_name(ucred->pid, &process) >= 0)
+ get_process_comm(ucred->pid, &process) >= 0)
IOVEC_SET_STRING(iovec[i++], process);
/* Skip the stored PID if we have a better one */
char_array_0(pid);
IOVEC_SET_STRING(iovec[i++], pid);
- skip_pid(&buf);
+ skip_syslog_pid((char**) &buf);
if (*buf == ':')
buf++;
struct signalfd_siginfo sfsi;
ssize_t n;
- if ((n = read(s->signal_fd, &sfsi, sizeof(sfsi))) != sizeof(sfsi)) {
+ n = read(s->signal_fd, &sfsi, sizeof(sfsi));
+ if (n != sizeof(sfsi)) {
if (n >= 0)
return -EIO;
msghdr.msg_control = &control;
msghdr.msg_controllen = sizeof(control);
- if ((n = recvmsg(ev->data.fd, &msghdr, MSG_DONTWAIT)) < 0) {
+ n = recvmsg(ev->data.fd, &msghdr, MSG_DONTWAIT);
+ if (n < 0) {
if (errno == EINTR || errno == EAGAIN)
return 1;
else
ucred = NULL;
- if ((e = memchr(buf, '\n', n)))
+ e = memchr(buf, '\n', n);
+ if (e)
*e = 0;
else
buf[n] = 0;
- if ((k = write_message(s, strstrip(buf), ucred)) < 0)
+ k = write_message(s, strstrip(buf), ucred);
+ if (k < 0)
return k;
}
}
int main(int argc, char *argv[]) {
Server server;
- int r = EXIT_FAILURE, n;
+ int r;
if (getppid() != 1) {
log_error("This program should be invoked by init only.");
umask(0022);
- if ((n = sd_listen_fds(true)) < 0) {
- log_error("Failed to read listening file descriptors from environment: %s", strerror(-r));
- return EXIT_FAILURE;
- }
-
- if (n <= 0 || n > SERVER_FD_MAX) {
- log_error("No or too many file descriptors passed.");
- return EXIT_FAILURE;
- }
-
- if (server_init(&server, (unsigned) n) < 0)
- return EXIT_FAILURE;
+ r = server_init(&server);
+ if (r < 0)
+ goto finish;
log_debug("systemd-kmsg-syslogd running as pid %lu", (unsigned long) getpid());
for (;;) {
struct epoll_event event;
- int k;
- if ((k = epoll_wait(server.epoll_fd, &event, 1, -1)) < 0) {
+ r = epoll_wait(server.epoll_fd, &event, 1, -1);
+ if (r < 0) {
if (errno == EINTR)
continue;
log_error("epoll_wait() failed: %m");
- goto fail;
- }
-
- if (k <= 0)
+ r = -errno;
+ goto finish;
+ } else if (r == 0)
break;
- if ((k = process_event(&server, &event)) < 0)
- goto fail;
-
- if (k == 0)
+ r = process_event(&server, &event);
+ if (r < 0)
+ goto finish;
+ else if (r == 0)
break;
}
- r = EXIT_SUCCESS;
-
log_debug("systemd-kmsg-syslogd stopped as pid %lu", (unsigned long) getpid());
- fail:
+ finish:
sd_notify(false,
"STATUS=Shutting down...");
server_done(&server);
- return r;
+ return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}
dual_timestamp_get(&m->startup_timestamp);
m->running_as = running_as;
- m->name_data_slot = m->subscribed_data_slot = -1;
+ m->name_data_slot = m->conn_data_slot = m->subscribed_data_slot = -1;
m->exit_code = _MANAGER_EXIT_CODE_INVALID;
m->pin_cgroupfs_fd = -1;
if (si.si_code == CLD_EXITED || si.si_code == CLD_KILLED || si.si_code == CLD_DUMPED) {
char *name = NULL;
- get_process_name(si.si_pid, &name);
+ get_process_comm(si.si_pid, &name);
log_debug("Got SIGCHLD for process %lu (%s)", (unsigned long) si.si_pid, strna(name));
free(name);
}
if (sfsi.ssi_pid > 0) {
char *p = NULL;
- get_process_name(sfsi.ssi_pid, &p);
+ get_process_comm(sfsi.ssi_pid, &p);
log_debug("Received SIG%s from PID %lu (%s).",
signal_to_string(sfsi.ssi_signo),
const char *username = NULL;
struct passwd *pw = NULL;
+ uid_t uid;
int r;
- bool have_loginuid = false;
- char *s;
assert(handle);
assert(ret_username);
assert(ret_pw);
- if (have_effective_cap(CAP_AUDIT_CONTROL) > 0) {
- /* Only use audit login uid if we are executed with
- * sufficient capabilities so that pam_loginuid could
- * do its job. If we are lacking the CAP_AUDIT_CONTROL
- * capabality we most likely are being run in a
- * container and /proc/self/loginuid is useless since
- * it probably contains a uid of the host system. */
-
- if (read_one_line_file("/proc/self/loginuid", &s) >= 0) {
- uid_t uid;
-
- r = parse_uid(s, &uid);
- free(s);
-
- if (r >= 0 && uid != (uint32_t) -1) {
- have_loginuid = true;
- pw = pam_modutil_getpwuid(handle, uid);
- }
- }
- }
-
- if (!have_loginuid) {
- if ((r = pam_get_user(handle, &username, NULL)) != PAM_SUCCESS) {
+ r = audit_loginuid_from_pid(0, &uid);
+ if (r >= 0)
+ pw = pam_modutil_getpwuid(handle, uid);
+ else {
+ r = pam_get_user(handle, &username, NULL);
+ if (r != PAM_SUCCESS) {
pam_syslog(handle, LOG_ERR, "Failed to get user name.");
return r;
}
- if (!username || !*username) {
+ if (isempty(username)) {
pam_syslog(handle, LOG_ERR, "User name not valid.");
return PAM_AUTH_ERR;
}
if (isempty(display))
display = tty;
tty = "";
+ } else if (streq(tty, "cron")) {
+ /* cron has been setting PAM_TTY to "cron" for a very long time
+ * and it cannot stop doing that for compatibility reasons. */
+ tty = "";
}
if (!isempty(cvtnr))
get_seat_from_display(display, &seat, &vtnr);
type = !isempty(display) ? "x11" :
- !isempty(tty) ? "tty" : "other";
+ !isempty(tty) ? "tty" : "unspecified";
remote = !isempty(remote_host) && !streq(remote_host, "localhost") && !streq(remote_host, "localhost.localdomain");
goto finish;
}
+ if (debug)
+ pam_syslog(handle, LOG_DEBUG, "Asking logind to create session: "
+ "uid=%u pid=%u service=%s type=%s seat=%s vtnr=%u tty=%s display=%s remote=%s remote_user=%s remote_host=%s",
+ uid, pid, service, type, seat, vtnr, tty, display, yes_no(remote), remote_user, remote_host);
+
reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error);
if (!reply) {
pam_syslog(handle, LOG_ERR, "Failed to create session: %s", bus_error_message(&error));
goto finish;
}
+ if (debug)
+ pam_syslog(handle, LOG_DEBUG, "Reply from logind: "
+ "id=%s object_path=%s runtime_path=%s session_fd=%d seat=%s vtnr=%u",
+ id, object_path, runtime_path, session_fd, seat, vtnr);
+
r = pam_misc_setenv(handle, "XDG_SESSION_ID", id, 0);
if (r != PAM_SUCCESS) {
pam_syslog(handle, LOG_ERR, "Failed to set session id.");
n_shown++;
- if (!streq(u->load_state, "loaded") &&
- !streq(u->load_state, "banned")) {
+ if (streq(u->load_state, "error")) {
on_loaded = ansi_highlight(true);
off_loaded = ansi_highlight(false);
} else
dbus_error_init(&error);
- assert(bus);
-
pager_open_if_enabled();
if (avoid_bus()) {
hashmap_free(h);
} else {
+ assert(bus);
+
m = dbus_message_new_method_call(
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
if (i->following)
printf("\t Follow: unit currently follows state of %s\n", i->following);
- if (streq_ptr(i->load_state, "failed") ||
- streq_ptr(i->load_state, "banned")) {
+ if (streq_ptr(i->load_state, "error")) {
on = ansi_highlight(true);
off = ansi_highlight(false);
} else
if (i->running) {
char *t = NULL;
- get_process_name(i->main_pid, &t);
+ get_process_comm(i->main_pid, &t);
if (t) {
printf(" (%s)", t);
free(t);
printf(" Control: %u", (unsigned) i->control_pid);
- get_process_name(i->control_pid, &t);
+ get_process_comm(i->control_pid, &t);
if (t) {
printf(" (%s)", t);
free(t);
* enable/disable */
if (!streq(verbs[i].verb, "enable") &&
!streq(verbs[i].verb, "disable") &&
- !streq(verbs[i].verb, "is-enable") &&
+ !streq(verbs[i].verb, "is-enabled") &&
+ !streq(verbs[i].verb, "list-unit-files") &&
!streq(verbs[i].verb, "reenable") &&
!streq(verbs[i].verb, "preset") &&
!streq(verbs[i].verb, "mask") &&
if (!arg_no_wtmp) {
if (sd_booted() > 0)
log_debug("Not writing utmp record, assuming that systemd-update-utmp is used.");
- else if ((r = utmp_put_shutdown(0)) < 0)
+ else if ((r = utmp_put_shutdown()) < 0)
log_warning("Failed to write utmp record: %s", strerror(-r));
}
#include <linux/rtc.h>
#include <glob.h>
#include <grp.h>
+ #include <sys/mman.h>
#include "macro.h"
#include "util.h"
static __thread size_t pgsz = 0;
long r;
- if (_likely_(pgsz))
+ if (_likely_(pgsz > 0))
return pgsz;
assert_se((r = sysconf(_SC_PAGESIZE)) > 0);
return -errno;
if (!(fgets(line, sizeof(line), f))) {
- r = -errno;
+ r = feof(f) ? -EIO : -errno;
fclose(f);
return r;
}
return -errno;
if (!(fgets(line, sizeof(line), f))) {
- r = -errno;
+ r = feof(f) ? -EIO : -errno;
fclose(f);
return r;
}
return -errno;
if (!(fgets(t, sizeof(t), f))) {
- r = -errno;
+ r = feof(f) ? -EIO : -errno;
goto finish;
}
return s;
}
- int get_process_name(pid_t pid, char **name) {
- char *p;
+ int get_process_comm(pid_t pid, char **name) {
int r;
- assert(pid >= 1);
assert(name);
- if (asprintf(&p, "/proc/%lu/comm", (unsigned long) pid) < 0)
- return -ENOMEM;
-
- r = read_one_line_file(p, name);
- free(p);
+ if (pid == 0)
+ r = read_one_line_file("/proc/self/comm", name);
+ else {
+ char *p;
+ if (asprintf(&p, "/proc/%lu/comm", (unsigned long) pid) < 0)
+ return -ENOMEM;
- if (r < 0)
- return r;
+ r = read_one_line_file(p, name);
+ free(p);
+ }
- return 0;
+ return r;
}
- int get_process_cmdline(pid_t pid, size_t max_length, char **line) {
- char *p, *r, *k;
+ int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char **line) {
+ char *r, *k;
int c;
bool space = false;
size_t left;
FILE *f;
- assert(pid >= 1);
assert(max_length > 0);
assert(line);
- if (asprintf(&p, "/proc/%lu/cmdline", (unsigned long) pid) < 0)
- return -ENOMEM;
+ if (pid == 0)
+ f = fopen("/proc/self/cmdline", "re");
+ else {
+ char *p;
+ if (asprintf(&p, "/proc/%lu/cmdline", (unsigned long) pid) < 0)
+ return -ENOMEM;
- f = fopen(p, "re");
- free(p);
+ f = fopen(p, "re");
+ free(p);
+ }
if (!f)
return -errno;
- if (!(r = new(char, max_length))) {
+ r = new(char, max_length);
+ if (!r) {
fclose(f);
return -ENOMEM;
}
free(r);
- if ((h = get_process_name(pid, &t)) < 0)
+ if (!comm_fallback)
+ return -ENOENT;
+
+ h = get_process_comm(pid, &t);
+ if (h < 0)
return h;
- h = asprintf(&r, "[%s]", t);
+ r = join("[", t, "]", NULL);
free(t);
- if (h < 0)
+ if (!r)
return -ENOMEM;
}
return 0;
}
+ int get_process_exe(pid_t pid, char **name) {
+ int r;
+
+ assert(name);
+
+ if (pid == 0)
+ r = readlink_malloc("/proc/self/exe", name);
+ else {
+ char *p;
+ if (asprintf(&p, "/proc/%lu/exe", (unsigned long) pid) < 0)
+ return -ENOMEM;
+
+ r = readlink_malloc(p, name);
+ free(p);
+ }
+
+ return r;
+ }
+
char *strnappend(const char *s, const char *suffix, size_t b) {
size_t a;
char *r;
ssize_t l;
struct inotify_event *e;
- if ((l = read(notify, &inotify_buffer, sizeof(inotify_buffer))) < 0) {
+ if ((l = read(notify, inotify_buffer, sizeof(inotify_buffer))) < 0) {
if (errno == EINTR)
continue;
while (nbytes > 0) {
ssize_t k;
- if ((k = write(fd, p, nbytes)) <= 0) {
+ k = write(fd, p, nbytes);
+ if (k <= 0) {
if (k < 0 && errno == EINTR)
continue;
return -errno;
if (!fgets(line, sizeof(line), f)) {
- k = -errno;
+ k = feof(f) ? -EIO : -errno;
fclose(f);
return k;
}
return 0;
}
+ int fchmod_and_fchown(int fd, mode_t mode, uid_t uid, gid_t gid) {
+ assert(fd >= 0);
+
+ /* Under the assumption that we are running privileged we
+ * first change the access mode and only then hand out
+ * ownership to avoid a window where access is too open. */
+
+ if (fchmod(fd, mode) < 0)
+ return -errno;
+
+ if (fchown(fd, uid, gid) < 0)
+ return -errno;
+
+ return 0;
+ }
+
cpu_set_t* cpu_set_malloc(unsigned *ncpus) {
cpu_set_t *r;
unsigned n = 1024;
return r;
}
- int columns(void) {
+ unsigned columns(void) {
static __thread int parsed_columns = 0;
const char *e;
a.st_ino != b.st_ino;
}
- char *ellipsize(const char *s, unsigned length, unsigned percent) {
- size_t l, x;
+ char *ellipsize_mem(const char *s, size_t old_length, size_t new_length, unsigned percent) {
+ size_t x;
char *r;
assert(s);
assert(percent <= 100);
- assert(length >= 3);
+ assert(new_length >= 3);
- l = strlen(s);
+ if (old_length <= 3 || old_length <= new_length)
+ return strndup(s, old_length);
- if (l <= 3 || l <= length)
- return strdup(s);
-
- if (!(r = new0(char, length+1)))
+ r = new0(char, new_length+1);
+ if (!r)
return r;
- x = (length * percent) / 100;
+ x = (new_length * percent) / 100;
- if (x > length - 3)
- x = length - 3;
+ if (x > new_length - 3)
+ x = new_length - 3;
memcpy(r, s, x);
r[x] = '.';
r[x+1] = '.';
r[x+2] = '.';
memcpy(r + x + 3,
- s + l - (length - x - 3),
- length - x - 3);
+ s + old_length - (new_length - x - 3),
+ new_length - x - 3);
return r;
}
+ char *ellipsize(const char *s, size_t length, unsigned percent) {
+ return ellipsize_mem(s, strlen(s), length, percent);
+ }
+
int touch(const char *path) {
int fd;
return term;
}
- bool dirent_is_file(struct dirent *de) {
+ bool dirent_is_file(const struct dirent *de) {
assert(de);
if (ignore_file(de->d_name))
return true;
}
+ bool dirent_is_file_with_suffix(const struct dirent *de, const char *suffix) {
+ assert(de);
+
+ if (!dirent_is_file(de))
+ return false;
+
+ return endswith(de->d_name, suffix);
+ }
+
void execute_directory(const char *directory, DIR *d, char *argv[]) {
DIR *_d = NULL;
struct dirent *de;
*p += k;
}
+ void skip_syslog_pid(char **buf) {
+ char *p;
+
+ assert(buf);
+ assert(*buf);
+
+ p = *buf;
+
+ if (*p != '[')
+ return;
+
+ p++;
+ p += strspn(p, "0123456789");
+
+ if (*p != ']')
+ return;
+
+ p++;
+
+ *buf = p;
+ }
+
+ void skip_syslog_date(char **buf) {
+ enum {
+ LETTER,
+ SPACE,
+ NUMBER,
+ SPACE_OR_NUMBER,
+ COLON
+ } sequence[] = {
+ LETTER, LETTER, LETTER,
+ SPACE,
+ SPACE_OR_NUMBER, NUMBER,
+ SPACE,
+ SPACE_OR_NUMBER, NUMBER,
+ COLON,
+ SPACE_OR_NUMBER, NUMBER,
+ COLON,
+ SPACE_OR_NUMBER, NUMBER,
+ SPACE
+ };
+
+ char *p;
+ unsigned i;
+
+ assert(buf);
+ assert(*buf);
+
+ p = *buf;
+
+ for (i = 0; i < ELEMENTSOF(sequence); i++, p++) {
+
+ if (!*p)
+ return;
+
+ switch (sequence[i]) {
+
+ case SPACE:
+ if (*p != ' ')
+ return;
+ break;
+
+ case SPACE_OR_NUMBER:
+ if (*p == ' ')
+ break;
+
+ /* fall through */
+
+ case NUMBER:
+ if (*p < '0' || *p > '9')
+ return;
+
+ break;
+
+ case LETTER:
+ if (!(*p >= 'A' && *p <= 'Z') &&
+ !(*p >= 'a' && *p <= 'z'))
+ return;
+
+ break;
+
+ case COLON:
+ if (*p != ':')
+ return;
+ break;
+
+ }
+ }
+
+ *buf = p;
+ }
+
int have_effective_cap(int value) {
cap_t cap;
cap_flag_value_t fv;
return 0;
}
-
- static int file_is_conf(const struct dirent *d, const char *suffix) {
- assert(d);
-
- if (ignore_file(d->d_name))
- return 0;
-
- if (d->d_type != DT_REG &&
- d->d_type != DT_LNK &&
- d->d_type != DT_UNKNOWN)
- return 0;
-
- return endswith(d->d_name, suffix);
- }
-
static int files_add(Hashmap *h, const char *path, const char *suffix) {
DIR *dir;
struct dirent buffer, *de;
if (!de)
break;
- if (!file_is_conf(de, suffix))
+ if (!dirent_is_file_with_suffix(de, suffix))
continue;
if (asprintf(&p, "%s/%s", path, de->d_name) < 0) {
}
int audit_session_from_pid(pid_t pid, uint32_t *id) {
- char *p, *s;
+ char *s;
uint32_t u;
int r;
- assert(pid >= 1);
assert(id);
if (have_effective_cap(CAP_AUDIT_CONTROL) <= 0)
return -ENOENT;
- if (asprintf(&p, "/proc/%lu/sessionid", (unsigned long) pid) < 0)
- return -ENOMEM;
+ if (pid == 0)
+ r = read_one_line_file("/proc/self/sessionid", &s);
+ else {
+ char *p;
+
+ if (asprintf(&p, "/proc/%lu/sessionid", (unsigned long) pid) < 0)
+ return -ENOMEM;
+
+ r = read_one_line_file(p, &s);
+ free(p);
+ }
- r = read_one_line_file(p, &s);
- free(p);
if (r < 0)
return r;
return 0;
}
+ int audit_loginuid_from_pid(pid_t pid, uid_t *uid) {
+ char *s;
+ uid_t u;
+ int r;
+
+ assert(uid);
+
+ /* Only use audit login uid if we are executed with sufficient
+ * capabilities so that pam_loginuid could do its job. If we
+ * are lacking the CAP_AUDIT_CONTROL capabality we most likely
+ * are being run in a container and /proc/self/loginuid is
+ * useless since it probably contains a uid of the host
+ * system. */
+
+ if (have_effective_cap(CAP_AUDIT_CONTROL) <= 0)
+ return -ENOENT;
+
+ if (pid == 0)
+ r = read_one_line_file("/proc/self/loginuid", &s);
+ else {
+ char *p;
+
+ if (asprintf(&p, "/proc/%lu/loginuid", (unsigned long) pid) < 0)
+ return -ENOMEM;
+
+ r = read_one_line_file(p, &s);
+ free(p);
+ }
+
+ if (r < 0)
+ return r;
+
+ r = parse_uid(s, &u);
+ free(s);
+
+ if (r < 0)
+ return r;
+
+ if (u == (uid_t) -1)
+ return -ENOENT;
+
+ *uid = (uid_t) u;
+ return 0;
+ }
+
bool display_is_local(const char *display) {
assert(display);
return 0;
}
+ int prot_from_flags(int flags) {
+
+ switch (flags & O_ACCMODE) {
+
+ case O_RDONLY:
+ return PROT_READ;
+
+ case O_WRONLY:
+ return PROT_WRITE;
+
+ case O_RDWR:
+ return PROT_READ|PROT_WRITE;
+
+ default:
+ return -EINVAL;
+ }
+ }
+
unsigned long cap_last_cap(void) {
static __thread unsigned long saved;
static __thread bool valid = false;
Wants=syslog.target
[Socket]
- ListenDatagram=/dev/log
+ ListenDatagram=/run/systemd/syslog
SocketMode=0666
+PassCred=yes
# The service we activate on incoming traffic is
# systemd-kmsg-syslogd.service. That doesn't mean however, that this