<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
<HTML>
<HEAD>
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">
  <META NAME="GENERATOR" CONTENT="GtkHTML/3.32.2">
</HEAD>
<BODY>
On Wed, 2011-09-28 at 21:25 +0200, Micha&#322; G&#243;rny wrote:
<BLOCKQUOTE TYPE=CITE>
<PRE>
If libsystemd-daemon support is enabled, xdm uses it to announce its
startup as soon as the session is established. This gives the user
opportunity to delay I/O-intensive operations until the X server is
started so that they would not interfere with its loading while keeping
the machine busy when user types in his/her login.

Reviewed-by: Jamey Sharp &lt;<A HREF="mailto:jamey@minilop.net">jamey@minilop.net</A>&gt;
---
 Makefile.am     |    9 +++++++--
 configure.ac    |   16 ++++++++++++++++
 xdm.service.in  |    2 ++
 xdm/Makefile.am |    4 ++--
 xdm/session.c   |   10 ++++++++++
 5 files changed, 37 insertions(+), 4 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index e5f9f5c..bb6b51c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -43,8 +43,13 @@ endif LINT
 if HAVE_SYSTEMD
 systemdsystemunit_DATA = xdm.service
 
-xdm.service: xdm.service.in
-        $(AM_V_GEN)$(SED) -e 's|BINDIR|$(bindir)|g' &lt; $&lt; &gt; $@
+xdm.service: xdm.service.in Makefile
+if USE_SYSTEMD_DAEMON
+        $(AM_V_GEN)$(SED) -e 's|BINDIR|$(bindir)|g' &lt; xdm.service.in &gt; $@
+else !USE_SYSTEMD_DAEMON
+        $(AM_V_GEN)$(SED) -e 's|BINDIR|$(bindir)|g' -e '/[Nn]otify/d' &lt; xdm.service.in &gt; $@
+endif !USE_SYSTEMD_DAEMON
+
 endif HAVE_SYSTEMD
 CLEANFILES = xdm.service
 EXTRA_DIST = xdm.service.in
diff --git a/configure.ac b/configure.ac
index eded131..763e4c3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -146,6 +146,7 @@ if test &quot;x$USE_SELINUX&quot; != &quot;xno&quot; ; then
 fi
 
 # Check whether to install systemd unit files, as suggested in daemon(7).
+# When a full path is specified, this does not require systemd installed.
 AC_ARG_WITH([systemdsystemunitdir], AS_HELP_STRING([--with-systemdsystemunitdir=DIR],
         [Directory for systemd service files (default from the System and Service Manager)]),,
         [with_systemdsystemunitdir=auto])
@@ -166,6 +167,21 @@ AS_IF([test &quot;x$with_systemdsystemunitdir&quot; != &quot;xno&quot;], [
 ])
 AM_CONDITIONAL(HAVE_SYSTEMD, [test &quot;x$with_systemdsystemunitdir&quot; != &quot;xno&quot;])
 
+# Check whether to enable systemd startup notification.
+# This requires libsystemd-daemon.
+AC_ARG_WITH([systemd-daemon], AS_HELP_STRING([--with-systemd-daemon],
+        [Add support for systemd startup notification (default is autodetected)]),
+        [USE_SYSTEMD_DAEMON=$withval], [USE_SYSTEMD_DAEMON=auto])
+AS_IF([test &quot;x$USE_SYSTEMD_DAEMON&quot; != &quot;xno&quot;], [
+    PKG_CHECK_MODULES([SYSTEMD_DAEMON], [libsystemd-daemon],
+        [AC_DEFINE(USE_SYSTEMD_DAEMON,1,[Use systemd startup notification])],
+        [AS_IF([test &quot;x$USE_SYSTEMD_DAEMON&quot; = &quot;xyes&quot;],
+            [AC_MSG_ERROR([systemd startup notification support requested, but libsystemd-daemon not found.])]
+        )]
+    )
+])
+AM_CONDITIONAL(USE_SYSTEMD_DAEMON, [test &quot;x$USE_SYSTEMD_DAEMON&quot; != &quot;xno&quot;])
+
 # FIXME: Find better test for which OS'es use su -m  - for now, just try to
 # mirror the Imakefile setting of:
 # if  defined(OpenBSDArchitecture) || defined(NetBSDArchitecture) || defined(FreeBSDArchitecture) || defined(DarwinArchitecture)
diff --git a/xdm.service.in b/xdm.service.in
index d15e072..e782dd9 100644
--- a/xdm.service.in
+++ b/xdm.service.in
@@ -4,6 +4,8 @@ After=systemd-user-sessions.service
 
 [Service]
 ExecStart=BINDIR/xdm -nodaemon
+Type=notify
+NotifyAccess=all
 
 [Install]
 Alias=graphical.target.wants/xdm.service
diff --git a/xdm/Makefile.am b/xdm/Makefile.am
index aa9765c..797b5c5 100644
--- a/xdm/Makefile.am
+++ b/xdm/Makefile.am
@@ -22,11 +22,11 @@
 bin_PROGRAMS = xdm
 
 AM_CPPFLAGS = -I$(top_srcdir)/include
-AM_CFLAGS = $(CWARNFLAGS) $(XDM_CFLAGS)
+AM_CFLAGS = $(CWARNFLAGS) $(XDM_CFLAGS) $(SYSTEMD_DAEMON_CFLAGS)
 
 # The xdm binary needs to export symbols so that they can be used from
 # libXdmGreet.so loaded through a dlopen call from session.c
-AM_LDFLAGS = $(XDM_LIBS) -export-dynamic
+AM_LDFLAGS = $(XDM_LIBS) $(SYSTEMD_DAEMON_LIBS) -export-dynamic
 
 xdm_SOURCES =                \
         access.c        \
diff --git a/xdm/session.c b/xdm/session.c
index 5fd47f0..573747d 100644
--- a/xdm/session.c
+++ b/xdm/session.c
@@ -81,6 +81,10 @@ extern int key_setnet(struct key_netstarg *arg);
 #  define RTLD_NOW 1
 # endif
 
+#ifdef USE_SYSTEMD_DAEMON
+#include &lt;systemd/sd-daemon.h&gt;
+#endif
+
 #ifdef USE_SELINUX
 /* This should be run just before we exec the user session. */
 static int
@@ -349,6 +353,12 @@ ManageSession (struct display *d)
         exit(UNMANAGE_DISPLAY);
         }
 
+#ifdef USE_SYSTEMD_DAEMON
+        /* Subsequent notifications will be ignored by systemd
+         * and calling this function will clean up the env */
+        sd_notify(1, &quot;READY=1&quot;);
+#endif
+
     /* tell the possibly dynamically loaded greeter function
      * what data structure formats to expect.
      * These version numbers are registered with The Open Group. */
</PRE>
</BLOCKQUOTE>
Reviewed-by: Gaetan Nadon &lt;memsize@videotron.ca&gt;
</BODY>
</HTML>