chiark / gitweb /
Merge branch 'journal'
authorLennart Poettering <lennart@poettering.net>
Fri, 30 Dec 2011 23:59:37 +0000 (00:59 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 30 Dec 2011 23:59:37 +0000 (00:59 +0100)
1  2 
Makefile.am
TODO
man/sd_notify.xml
src/kmsg-syslogd.c
src/manager.c
src/pam-module.c
src/systemctl.c
src/util.c
units/syslog.socket

diff --combined Makefile.am
index 170465a6c2ebad571c07de3270e61d6c6383a987,fa0a217813d0f921640168b64ae7641ee6aa4014..6629d91b96bf3a553882936cc96b626e5f777980
@@@ -27,6 -27,14 +27,14 @@@ LIBSYSTEMD_DAEMON_CURRENT=
  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@
@@@ -141,7 -149,8 +149,8 @@@ rootbin_PROGRAMS = 
        systemd-ask-password \
        systemd-tty-ask-password-agent \
        systemd-tmpfiles \
-       systemd-machine-id-setup
+       systemd-machine-id-setup \
+         systemd-journalctl
  
  bin_PROGRAMS = \
        systemd-cgls \
@@@ -180,7 -189,8 +189,8 @@@ rootlibexec_PROGRAMS = 
        systemd-detect-virt \
        systemd-sysctl \
          systemd-logind \
-         systemd-uaccess
+         systemd-uaccess \
+         systemd-journald
  
  if ENABLE_BINFMT
  rootlibexec_PROGRAMS += \
@@@ -215,11 -225,15 +225,15 @@@ endi
  
  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 = \
@@@ -385,7 -401,8 +401,8 @@@ dist_systemunit_DATA = 
        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 += \
@@@ -406,6 -423,7 +423,7 @@@ nodist_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 \
@@@ -469,7 -487,8 +487,8 @@@ EXTRA_DIST = 
        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 += \
@@@ -529,8 -553,6 +553,8 @@@ dist_systemunit_DATA += 
        units/fedora/prefdm.service \
        units/fedora/rc-local.service \
        units/fedora/halt-local.service
 +systemgenerator_PROGRAMS += \
 +      systemd-rc-local-generator
  endif
  
  if TARGET_MANDRIVA
@@@ -538,8 -560,6 +562,8 @@@ dist_systemunit_DATA += 
        units/mandriva/prefdm.service \
        units/fedora/rc-local.service \
        units/fedora/halt-local.service
 +systemgenerator_PROGRAMS += \
 +      systemd-rc-local-generator
  endif
  
  if TARGET_FRUGALWARE
@@@ -551,8 -571,6 +575,8 @@@ if TARGET_SUS
  dist_systemunit_DATA += \
        units/suse/rc-local.service \
        units/suse/halt-local.service
 +systemgenerator_PROGRAMS += \
 +      systemd-rc-local-generator
  endif
  
  if TARGET_MAGEIA
@@@ -560,8 -578,6 +584,8 @@@ dist_systemunit_DATA += 
        units/mageia/prefdm.service \
        units/fedora/rc-local.service \
        units/fedora/halt-local.service
 +systemgenerator_PROGRAMS += \
 +      systemd-rc-local-generator
  endif
  
  if HAVE_PLYMOUTH
@@@ -597,7 -613,9 +621,9 @@@ pkgconfigdata_DATA = 
  
  pkgconfiglib_DATA = \
          libsystemd-daemon.pc \
-         libsystemd-login.pc
+         libsystemd-login.pc \
+         libsystemd-id128.pc \
+         libsystemd-journal.pc
  
  # Passed through intltool only
  polkitpolicy_in_files = \
@@@ -709,7 -727,8 +735,8 @@@ libsystemd_core_la_SOURCES = 
          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 \
@@@ -772,7 -791,14 +799,14 @@@ EXTRA_DIST += 
          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 += \
@@@ -833,16 -866,44 +874,44 @@@ MANPAGES_ALIAS = 
        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) \
@@@ -971,6 -1032,90 +1040,90 @@@ test_install_CFLAGS = 
  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
@@@ -1115,10 -1260,12 +1268,12 @@@ systemd_uaccess_SOURCES = 
  
  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 = \
@@@ -1166,7 -1313,8 +1321,8 @@@ systemd_tmpfiles_LDADD = 
  
  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)
@@@ -1278,15 -1426,6 +1434,15 @@@ systemd_getty_generator_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
@@@ -1592,6 -1731,69 +1748,69 @@@ libsystemd-login-install-hook
  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' \
@@@ -1677,7 -1879,7 +1896,7 @@@ endi
  if HAVE_XSLTPROC
  XSLTPROC_FLAGS = \
        --nonet \
-       --param funcsynopsis.style "'ansi'"
+       --stringparam funcsynopsis.style ansi
  
  XSLTPROC_PROCESS_MAN = \
        $(AM_V_GEN)$(MKDIR_P) $(dir $@) && \
@@@ -1690,11 -1892,11 +1909,11 @@@ XSLTPROC_PROCESS_MAN_IN = 
  
  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
@@@ -1808,11 -2010,12 +2027,12 @@@ endi
                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 )
@@@ -1980,6 -2183,9 +2200,6 @@@ endi
  
  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 )
@@@ -1994,6 -2200,9 +2214,6 @@@ endi
  
  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 )
@@@ -2015,6 -2224,9 +2235,6 @@@ endi
  
  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 )
@@@ -2025,6 -2237,9 +2245,6 @@@ endi
  
  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 )
diff --combined TODO
index 359ae09e83682b0883cec4a0e02df908e5fd021c,02688ad9a80b527621235ee8e1f92f8b700d3214..e9ab9de6e7936a35b2407b639ffb9f0b7fe0b92a
--- 1/TODO
--- 2/TODO
+++ b/TODO
@@@ -17,12 -17,22 +17,24 @@@ Bugfixes
  
  * 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?
@@@ -222,17 -232,11 +234,17 @@@ External
  
  * 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"
  
diff --combined man/sd_notify.xml
index 62347f8ab067692b5257d5583699ffd97dfb92d3,1b556807489b82f15671212347c92d83f90a4e74..c3791ce39ff43a3492ab3dcf9ca5a0f5297c4195
@@@ -50,7 -50,7 +50,7 @@@
  
          <refsynopsisdiv>
                  <funcsynopsis>
-                         <funcsynopsisinfo>#include "sd-daemon.h"</funcsynopsisinfo>
+                         <funcsynopsisinfo>#include &lt;systemd/sd-daemon.h&gt;</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>
diff --combined src/kmsg-syslogd.c
index 7fd69f858428f79380f047aa448d5bfb463b3014,70cc0730eeed7c608502595518ca35d44d1d36a4..8cc423a299a517dadd2bba7fe3622123430b6f49
@@@ -65,63 -65,75 +65,72 @@@ static void server_done(Server *s) 
                  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++;
@@@ -365,7 -282,8 +279,8 @@@ static int process_event(Server *s, str
                  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;
  }
diff --combined src/manager.c
index 6acc821e9c9d5d650850584a82eba32d0b210ae6,f8cbcfcc98ff8fa7faf1f25dadf1ec7fa908e5f5..9957bbf12ac56d26b1a64315f4a739c1600e041e
@@@ -231,7 -231,7 +231,7 @@@ int manager_new(ManagerRunningAs runnin
          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;
  
@@@ -2032,7 -2032,7 +2032,7 @@@ static int manager_dispatch_sigchld(Man
                  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);
                  }
@@@ -2117,7 -2117,7 +2117,7 @@@ static int manager_process_signal_fd(Ma
                  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),
diff --combined src/pam-module.c
index 9002f4e06dea1da6ceaf9974d686202ae1b90faa,78f9b30d5bffa8db425508cf5360570571d72374..14e706b37430a52c2f03953f48fc36a159d2793e
@@@ -163,42 -163,24 +163,24 @@@ static int get_user_data
  
          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;
                  }
@@@ -463,10 -445,6 +445,10 @@@ _public_ PAM_EXTERN int pam_sm_open_ses
                  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.");
diff --combined src/systemctl.c
index 2f11d6bc1d09bd2bffeb914d3c9c6d8d8eaa3e38,18074402e57a11af47433943bbc132a72e22af7a..1142200e426b73884a967936e72bbd785c75e683
@@@ -377,7 -377,8 +377,7 @@@ static void output_units_list(const str
  
                  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
@@@ -621,6 -622,8 +621,6 @@@ static int list_unit_files(DBusConnecti
  
          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",
@@@ -2062,7 -2063,8 +2062,7 @@@ static void print_status_info(UnitStatu
          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);
@@@ -4998,8 -5000,7 +4998,8 @@@ static int systemctl_main(DBusConnectio
           * 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") &&
@@@ -5155,7 -5156,7 +5155,7 @@@ static int halt_main(DBusConnection *bu
          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));
          }
  
diff --combined src/util.c
index da71e4d08b270a8da6c9d7a347f8cbb33ef451b0,c07c569c2662a8315c5348893e73fa1fbc0b5469..7191750c52d1681fb6ee1f3ffa5786c9b62f5580
@@@ -55,6 -55,7 +55,7 @@@
  #include <linux/rtc.h>
  #include <glob.h>
  #include <grp.h>
+ #include <sys/mman.h>
  
  #include "macro.h"
  #include "util.h"
@@@ -73,7 -74,7 +74,7 @@@ size_t page_size(void) 
          static __thread size_t pgsz = 0;
          long r;
  
-         if (_likely_(pgsz))
+         if (_likely_(pgsz > 0))
                  return pgsz;
  
          assert_se((r = sysconf(_SC_PAGESIZE)) > 0);
@@@ -516,7 -517,7 +517,7 @@@ int get_parent_of_pid(pid_t pid, pid_t 
                  return -errno;
  
          if (!(fgets(line, sizeof(line), f))) {
 -                r = -errno;
 +                r = feof(f) ? -EIO : -errno;
                  fclose(f);
                  return r;
          }
@@@ -561,7 -562,7 +562,7 @@@ int get_starttime_of_pid(pid_t pid, uns
                  return -errno;
  
          if (!(fgets(line, sizeof(line), f))) {
 -                r = -errno;
 +                r = feof(f) ? -EIO : -errno;
                  fclose(f);
                  return r;
          }
@@@ -708,7 -709,7 +709,7 @@@ int read_one_line_file(const char *fn, 
                  return -errno;
  
          if (!(fgets(t, sizeof(t), f))) {
 -                r = -errno;
 +                r = feof(f) ? -EIO : -errno;
                  goto finish;
          }
  
@@@ -993,46 -994,51 +994,51 @@@ char *truncate_nl(char *s) 
          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;
@@@ -2645,7 -2674,7 +2674,7 @@@ int acquire_terminal(const char *name, 
                          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;
@@@ -2856,7 -2885,8 +2885,8 @@@ ssize_t loop_write(int fd, const void *
          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;
@@@ -3266,7 -3296,7 +3296,7 @@@ int get_ctty_devnr(pid_t pid, dev_t *d
                  return -errno;
  
          if (!fgets(line, sizeof(line), f)) {
 -                k = -errno;
 +                k = feof(f) ? -EIO : -errno;
                  fclose(f);
                  return k;
          }
@@@ -3503,6 -3533,22 +3533,22 @@@ int chmod_and_chown(const char *path, m
          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;
@@@ -3860,7 -3906,7 +3906,7 @@@ char **replace_env_argv(char **argv, ch
          return r;
  }
  
int columns(void) {
unsigned columns(void) {
          static __thread int parsed_columns = 0;
          const char *e;
  
@@@ -3903,38 -3949,41 +3949,41 @@@ int running_in_chroot(void) 
                  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;
  
@@@ -4270,7 -4319,7 +4319,7 @@@ const char *default_term_for_tty(const 
          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;
@@@ -4456,6 -4514,98 +4514,98 @@@ void parse_syslog_priority(char **p, in
          *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;
@@@ -4675,21 -4825,6 +4825,6 @@@ int vt_disallocate(const char *name) 
          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) {
@@@ -5066,21 -5201,27 +5201,27 @@@ int symlink_or_copy_atomic(const char *
  }
  
  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);
  
@@@ -5704,6 -5890,24 +5890,24 @@@ int strdup_or_null(const char *a, char 
          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;
diff --combined units/syslog.socket
index e74b55948e8d4baa47282ea4fdf1edec19ea79de,ca3d95ea35758258f23125c88a20e72b766aac2e..f9e3171522628b15e5dd62239cd120edc8d2e3f8
@@@ -16,9 -16,8 +16,9 @@@ Before=sockets.target syslog.targe
  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