<!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 Tue, 2011-11-15 at 21:34 +0100, Matthieu Herrb wrote:
<BLOCKQUOTE TYPE=CITE>
<PRE>
This logically reverts 7e223d3ac6c0d549a7d6e4dcc86a053e19594028.
There are still cases where the shared greeter is not desired.
In particular OpenBSD/vax doesn't support shared libraries.

BTW, Ubuntu 11.10 and Fedora 15 both ship xdm 1.10 with the shared
greeter disabled too.

Signed-off-by: Matthieu Herrb &lt;<A HREF="mailto:matthieu.herrb@laas.fr">matthieu.herrb@laas.fr</A>&gt;
---
 configure.ac        |   28 ++++++++++++++++++++++++++--
 greeter/Makefile.am |    8 ++++++++
 greeter/greet.c     |    6 ++++--
 xdm/Makefile.am     |    5 ++++-
 xdm/session.c       |   12 +++++++++++-
 5 files changed, 53 insertions(+), 6 deletions(-)

diff --git a/configure.ac b/configure.ac
index 18848e8..a5a6a2f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -419,6 +419,30 @@ PKG_CHECK_MODULES(AUTH, xau)
 # Greeter
 #
 
+AC_MSG_CHECKING([if the greeter should be built as a dynamically loaded object])
+
+AC_ARG_ENABLE(dynamic-greeter,
+        AC_HELP_STRING([--enable-dynamic-greeter],
+         [Build greeter as dynamically loaded shared object]),
+        [DYNAMIC_GREETER=&quot;$enableval&quot;], [DYNAMIC_GREETER=&quot;auto&quot;])
+
+if test &quot;x$DYNAMIC_GREETER&quot; = &quot;xauto&quot; ; then
+        case $host_os in
+        openbsd*)
+                DYNAMIC_GREETER=&quot;no&quot;
+                ;
+            *)        DYNAMIC_GREETER=&quot;yes&quot; ;;
+
+        esac
+fi
+if test &quot;x$DYNAMIC_GREETER&quot; = &quot;xno&quot;; then
+        STATIC_GREETER_CFLAGS=&quot;-DGREET_USER_STATIC&quot;
+        STATIC_GREETER_LIBS='${top_builddir}/greeter/libXdmGreet.la'
+fi
+
+AC_MSG_RESULT([$DYNAMIC_GREETER])
+AM_CONDITIONAL(DYNAMIC_GREETER, test x$DYNAMIC_GREETER = xyes)
+
 PKG_CHECK_MODULES(XDMGREET, xt &gt;= 1.0 x11 xext)
 
 GREETERLIB=&quot;${XDMLIBDIR}/libXdmGreet.so&quot;
@@ -431,8 +455,8 @@ XDMGREET_LIBS=&quot;$XDMGREET_LIBS $XDM_TOOLKIT_LIBS $DMCP_LIBS $GREETER_LIBS&quot;
 #  XDM
 #
 
-XDM_CFLAGS=&quot;$XDM_CFLAGS $DMCP_CFLAGS $XLIB_CFLAGS $AUTH_CFLAGS&quot;
-XDM_LIBS=&quot;$XDM_LIBS $DMCP_LIBS&quot;
+XDM_CFLAGS=&quot;$XDM_CFLAGS $DMCP_CFLAGS $XLIB_CFLAGS $AUTH_CFLAGS $STATIC_GREETER_CFLAGS&quot;
+XDM_LIBS=&quot;$XDM_LIBS $DMCP_LIBS $STATIC_GREETER_LIBS&quot;
 
 AC_CHECK_LIB(Xdmcp, XdmcpWrap, [xdmauth=&quot;yes&quot;], [xdmauth=&quot;no&quot;], [$DMCP_LIBS])
 
diff --git a/greeter/Makefile.am b/greeter/Makefile.am
index f0a8491..4e0d0a1 100644
--- a/greeter/Makefile.am
+++ b/greeter/Makefile.am
@@ -1,6 +1,10 @@
 xdmlibdir = $(XDMLIBDIR)
 
+if DYNAMIC_GREETER
 xdmlib_LTLIBRARIES = libXdmGreet.la
+else
+noinst_LTLIBRARIES = libXdmGreet.la
+endif
 
 libXdmGreet_la_SOURCES = \
                   Login.c \
@@ -14,7 +18,11 @@ libXdmGreet_la_LIBADD = $(XDMGREET_LIBS)
 AM_CPPFLAGS = -I$(top_srcdir)/include
 AM_CFLAGS = $(CWARNFLAGS) $(XDMGREET_CFLAGS) -DGREET_LIB
 
+if DYNAMIC_GREETER
 libXdmGreet_la_LDFLAGS = -module -avoid-version
+else
+libXdmGreet_la_LDFLAGS = -static
+endif
 
 if LINT
 ALL_LINT_FLAGS=$(LINT_FLAGS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
diff --git a/greeter/greet.c b/greeter/greet.c
index 82e2c21..9fb6b82 100644
--- a/greeter/greet.c
+++ b/greeter/greet.c
@@ -96,7 +96,7 @@ extern int getdomainname(char *name, size_t len);
 /*
  * Function pointers filled in by the initial call ito the library
  */
-
+#ifdef GREET_LIB
 int     (*__xdm_PingServer)(struct display *d, Display *alternateDpy) = NULL;
 void    (*__xdm_SessionPingFailed)(struct display *d) = NULL;
 void    (*__xdm_Debug)(const char * fmt, ...) = NULL;
@@ -133,6 +133,7 @@ char     *(*__xdm_crypt)(CRYPT_ARGS) = NULL;
 # ifdef USE_PAM
 pam_handle_t **(*__xdm_thepamhp)(void) = NULL;
 # endif
+#endif
 
 #ifdef SECURE_RPC
 # include &lt;rpc/rpc.h&gt;
@@ -426,6 +427,7 @@ greet_user_rtn GreetUser(
     int i;
     Arg                arglist[2];
 
+#ifdef GREET_LIB
 /*
  * These must be set before they are used.
  */
@@ -465,7 +467,7 @@ greet_user_rtn GreetUser(
 # ifdef USE_PAM
     __xdm_thepamhp = dlfuncs-&gt;_thepamhp;
 # endif
-
+#endif
     *dpy = InitGreet (d);
     /*
      * Run the setup script - note this usually will not work when
diff --git a/xdm/Makefile.am b/xdm/Makefile.am
index 797b5c5..6748ef1 100644
--- a/xdm/Makefile.am
+++ b/xdm/Makefile.am
@@ -24,9 +24,12 @@ bin_PROGRAMS = xdm
 AM_CPPFLAGS = -I$(top_srcdir)/include
 AM_CFLAGS = $(CWARNFLAGS) $(XDM_CFLAGS) $(SYSTEMD_DAEMON_CFLAGS)
 
+AM_LDFLAGS = $(XDM_LIBS) $(SYSTEMD_DAEMON_LIBS)
 # 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) $(SYSTEMD_DAEMON_LIBS) -export-dynamic
+if DYNAMIC_GREETER
+AM_LDFLAGS = $(AM_LDFLAGS) -export-dynamic
+endif
 
 xdm_SOURCES =                \
         access.c        \
diff --git a/xdm/session.c b/xdm/session.c
index 573747d..fe9024d 100644
--- a/xdm/session.c
+++ b/xdm/session.c
@@ -76,10 +76,12 @@ extern int key_setnet(struct key_netstarg *arg);
 #include &lt;selinux/get_context_list.h&gt;
 #endif /* USE_SELINUX */
 
+#ifndef GREET_USER_STATIC
 # include &lt;dlfcn.h&gt;
 # ifndef RTLD_NOW
 #  define RTLD_NOW 1
 # endif
+#endif
 
 #ifdef USE_SYSTEMD_DAEMON
 #include &lt;systemd/sd-daemon.h&gt;
@@ -329,7 +331,9 @@ ManageSession (struct display *d)
     Display                *dpy;
     greet_user_rtn        greet_stat;
     static GreetUserProc greet_user_proc = NULL;
+#ifndef GREET_USER_STATIC
     void                *greet_lib_handle;
+#endif
 
     Debug (&quot;ManageSession %s\n&quot;, d-&gt;name);
     (void)XSetIOErrorHandler(IOErrorHandler);
@@ -344,6 +348,9 @@ ManageSession (struct display *d)
      */
     LoadXloginResources (d);
 
+#ifdef GREET_USER_STATIC
+    greet_user_proc = GreetUser;
+#else
     Debug (&quot;ManageSession: loading greeter library %s\n&quot;, greeterLib);
     greet_lib_handle = dlopen(greeterLib, RTLD_NOW);
&nbsp;&nbsp;&nbsp;&nbsp; if (greet_lib_handle != NULL)
@@ -352,6 +359,8 @@ ManageSession (struct display *d)
         LogError (&quot;%s while loading %s\n&quot;, dlerror(), greeterLib);
         exit(UNMANAGE_DISPLAY);
         }
+#endif
+    
 
 #ifdef USE_SYSTEMD_DAEMON
         /* Subsequent notifications will be ignored by systemd
@@ -376,9 +385,10 @@ ManageSession (struct display *d)
              */
             if (StartClient (&amp;verify, d, &amp;clientPid, greet.name, greet.password)) {
                 Debug (&quot;Client Started\n&quot;);
-
+#ifndef GREET_USER_STATIC
                 /* Save memory; close library */
                 dlclose(greet_lib_handle);
+#endif
 
                 /*
                  * Wait for session to end,
</PRE>
</BLOCKQUOTE>
Reviewed-by: Gaetan Nadon &lt;memsize@videotron.ca&gt;
</BODY>
</HTML>