]> andersk Git - openssh.git/blob - configure.ac
- (dtucker) [configure.ac] Try AIX blibpath test in different order when
[openssh.git] / configure.ac
1 # $Id$
2 #
3 # Copyright (c) 1999-2004 Damien Miller
4 #
5 # Permission to use, copy, modify, and distribute this software for any
6 # purpose with or without fee is hereby granted, provided that the above
7 # copyright notice and this permission notice appear in all copies.
8 #
9 # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16
17 AC_INIT(OpenSSH, Portable, openssh-unix-dev@mindrot.org)
18 AC_REVISION($Revision$)
19 AC_CONFIG_SRCDIR([ssh.c])
20
21 AC_CONFIG_HEADER(config.h)
22 AC_PROG_CC
23 AC_CANONICAL_HOST
24 AC_C_BIGENDIAN
25
26 # Checks for programs.
27 AC_PROG_AWK
28 AC_PROG_CPP
29 AC_PROG_RANLIB
30 AC_PROG_INSTALL
31 AC_PROG_EGREP
32 AC_PATH_PROG(AR, ar)
33 AC_PATH_PROG(CAT, cat)
34 AC_PATH_PROG(KILL, kill)
35 AC_PATH_PROGS(PERL, perl5 perl)
36 AC_PATH_PROG(SED, sed)
37 AC_SUBST(PERL)
38 AC_PATH_PROG(ENT, ent)
39 AC_SUBST(ENT)
40 AC_PATH_PROG(TEST_MINUS_S_SH, bash)
41 AC_PATH_PROG(TEST_MINUS_S_SH, ksh)
42 AC_PATH_PROG(TEST_MINUS_S_SH, sh)
43 AC_PATH_PROG(SH, sh)
44 AC_SUBST(TEST_SHELL,sh)
45
46 dnl for buildpkg.sh
47 AC_PATH_PROG(PATH_GROUPADD_PROG, groupadd, groupadd,
48         [/usr/sbin${PATH_SEPARATOR}/etc])
49 AC_PATH_PROG(PATH_USERADD_PROG, useradd, useradd,
50         [/usr/sbin${PATH_SEPARATOR}/etc])
51 AC_CHECK_PROG(MAKE_PACKAGE_SUPPORTED, pkgmk, yes, no)
52 if test -x /sbin/sh; then
53         AC_SUBST(STARTUP_SCRIPT_SHELL,/sbin/sh)
54 else
55         AC_SUBST(STARTUP_SCRIPT_SHELL,/bin/sh)
56 fi
57
58 # System features
59 AC_SYS_LARGEFILE
60
61 if test -z "$AR" ; then
62         AC_MSG_ERROR([*** 'ar' missing, please install or fix your \$PATH ***])
63 fi
64
65 # Use LOGIN_PROGRAM from environment if possible
66 if test ! -z "$LOGIN_PROGRAM" ; then
67         AC_DEFINE_UNQUOTED(LOGIN_PROGRAM_FALLBACK, "$LOGIN_PROGRAM",
68                 [If your header files don't define LOGIN_PROGRAM,
69                 then use this (detected) from environment and PATH])
70 else
71         # Search for login
72         AC_PATH_PROG(LOGIN_PROGRAM_FALLBACK, login)
73         if test ! -z "$LOGIN_PROGRAM_FALLBACK" ; then
74                 AC_DEFINE_UNQUOTED(LOGIN_PROGRAM_FALLBACK, "$LOGIN_PROGRAM_FALLBACK")
75         fi
76 fi
77
78 AC_PATH_PROG(PATH_PASSWD_PROG, passwd)
79 if test ! -z "$PATH_PASSWD_PROG" ; then
80         AC_DEFINE_UNQUOTED(_PATH_PASSWD_PROG, "$PATH_PASSWD_PROG",
81                 [Full path of your "passwd" program])
82 fi
83
84 if test -z "$LD" ; then
85         LD=$CC
86 fi
87 AC_SUBST(LD)
88
89 AC_C_INLINE
90
91 AC_CHECK_DECL(LLONG_MAX, have_llong_max=1, , [#include <limits.h>])
92
93 if test "$GCC" = "yes" || test "$GCC" = "egcs"; then
94         CFLAGS="$CFLAGS -Wall -Wpointer-arith -Wuninitialized"
95         GCC_VER=`$CC -v 2>&1 | $AWK '/gcc version /{print $3}'`
96         case $GCC_VER in
97                 1.*) ;;
98                 2.8* | 2.9*) CFLAGS="$CFLAGS -Wsign-compare" ;;
99                 2.*) ;;
100                 3.*) CFLAGS="$CFLAGS -Wsign-compare" ;;
101                 4.*) CFLAGS="$CFLAGS -Wsign-compare -Wno-pointer-sign" ;;
102                 *) ;;
103         esac
104
105         if test -z "$have_llong_max"; then
106                 # retry LLONG_MAX with -std=gnu99, needed on some Linuxes
107                 unset ac_cv_have_decl_LLONG_MAX
108                 saved_CFLAGS="$CFLAGS"
109                 CFLAGS="$CFLAGS -std=gnu99"
110                 AC_CHECK_DECL(LLONG_MAX,
111                     [have_llong_max=1],
112                     [CFLAGS="$saved_CFLAGS"],
113                     [#include <limits.h>]
114                 )
115         fi
116 fi
117
118 AC_ARG_WITH(rpath,
119         [  --without-rpath         Disable auto-added -R linker paths],
120         [
121                 if test "x$withval" = "xno" ; then
122                         need_dash_r=""
123                 fi
124                 if test "x$withval" = "xyes" ; then
125                         need_dash_r=1
126                 fi
127         ]
128 )
129
130 # Check for some target-specific stuff
131 case "$host" in
132 *-*-aix*)
133         AC_MSG_CHECKING([how to specify blibpath for linker ($LD)])
134         if (test -z "$blibpath"); then
135                 blibpath="/usr/lib:/lib"
136         fi
137         saved_LDFLAGS="$LDFLAGS"
138         if test "$GCC" = "yes"; then
139                 flags="-Wl,-blibpath: -Wl,-rpath, -blibpath:"
140         else
141                 flags="-blibpath: -Wl,-blibpath: -Wl,-rpath,"
142         fi
143         for tryflags in $flags ;do
144                 if (test -z "$blibflags"); then
145                         LDFLAGS="$saved_LDFLAGS $tryflags$blibpath"
146                         AC_TRY_LINK([], [], [blibflags=$tryflags])
147                 fi
148         done
149         if (test -z "$blibflags"); then
150                 AC_MSG_RESULT(not found)
151                 AC_MSG_ERROR([*** must be able to specify blibpath on AIX - check config.log])
152         else
153                 AC_MSG_RESULT($blibflags)
154         fi
155         LDFLAGS="$saved_LDFLAGS"
156         dnl Check for authenticate.  Might be in libs.a on older AIXes
157         AC_CHECK_FUNC(authenticate, [AC_DEFINE(WITH_AIXAUTHENTICATE, 1,
158                 [Define if you want to enable AIX4's authenticate function])],
159                 [AC_CHECK_LIB(s,authenticate,
160                         [ AC_DEFINE(WITH_AIXAUTHENTICATE)
161                                 LIBS="$LIBS -ls"
162                         ])
163                 ])
164         dnl Check for various auth function declarations in headers.
165         AC_CHECK_DECLS([authenticate, loginrestrictions, loginsuccess,
166             passwdexpired, setauthdb], , , [#include <usersec.h>])
167         dnl Check if loginfailed is declared and takes 4 arguments (AIX >= 5.2)
168         AC_CHECK_DECLS(loginfailed,
169                  [AC_MSG_CHECKING(if loginfailed takes 4 arguments)
170                   AC_TRY_COMPILE(
171                         [#include <usersec.h>],
172                         [(void)loginfailed("user","host","tty",0);],
173                         [AC_MSG_RESULT(yes)
174                          AC_DEFINE(AIX_LOGINFAILED_4ARG, 1,
175                                 [Define if your AIX loginfailed() function
176                                 takes 4 arguments (AIX >= 5.2)])],
177                         [AC_MSG_RESULT(no)]
178                 )],
179                 [],
180                 [#include <usersec.h>]
181         )
182         AC_CHECK_FUNCS(setauthdb)
183         check_for_aix_broken_getaddrinfo=1
184         AC_DEFINE(BROKEN_REALPATH, 1, [Define if you have a broken realpath.])
185         AC_DEFINE(SETEUID_BREAKS_SETUID, 1,
186             [Define if your platform breaks doing a seteuid before a setuid])
187         AC_DEFINE(BROKEN_SETREUID, 1, [Define if your setreuid() is broken])
188         AC_DEFINE(BROKEN_SETREGID, 1, [Define if your setregid() is broken])
189         dnl AIX handles lastlog as part of its login message
190         AC_DEFINE(DISABLE_LASTLOG, 1, [Define if you don't want to use lastlog])
191         AC_DEFINE(LOGIN_NEEDS_UTMPX, 1,
192                 [Some systems need a utmpx entry for /bin/login to work])
193         AC_DEFINE(SPT_TYPE,SPT_REUSEARGV,
194                 [Define to a Set Process Title type if your system is
195                 supported by bsd-setproctitle.c])
196         AC_DEFINE(SSHPAM_CHAUTHTOK_NEEDS_RUID, 1,
197             [AIX 5.2 and 5.3 (and presumably newer) require this])
198         AC_DEFINE(PTY_ZEROREAD, 1, [read(1) can return 0 for a non-closed fd])
199         ;;
200 *-*-cygwin*)
201         check_for_libcrypt_later=1
202         LIBS="$LIBS /usr/lib/textmode.o"
203         AC_DEFINE(HAVE_CYGWIN, 1, [Define if you are on Cygwin])
204         AC_DEFINE(USE_PIPES, 1, [Use PIPES instead of a socketpair()])
205         AC_DEFINE(DISABLE_SHADOW, 1,
206                 [Define if you want to disable shadow passwords])
207         AC_DEFINE(IP_TOS_IS_BROKEN, 1,
208                 [Define if your system choked on IP TOS setting])
209         AC_DEFINE(NO_X11_UNIX_SOCKETS, 1,
210                 [Define if X11 doesn't support AF_UNIX sockets on that system])
211         AC_DEFINE(NO_IPPORT_RESERVED_CONCEPT, 1,
212                 [Define if the concept of ports only accessible to
213                 superusers isn't known])
214         AC_DEFINE(DISABLE_FD_PASSING, 1,
215                 [Define if your platform needs to skip post auth
216                 file descriptor passing])
217         ;;
218 *-*-dgux*)
219         AC_DEFINE(IP_TOS_IS_BROKEN)
220         AC_DEFINE(SETEUID_BREAKS_SETUID)
221         AC_DEFINE(BROKEN_SETREUID)
222         AC_DEFINE(BROKEN_SETREGID)
223         ;;
224 *-*-darwin*)
225         AC_MSG_CHECKING(if we have working getaddrinfo)
226         AC_TRY_RUN([#include <mach-o/dyld.h>
227 main() { if (NSVersionOfRunTimeLibrary("System") >= (60 << 16))
228                 exit(0);
229         else
230                 exit(1);
231 }], [AC_MSG_RESULT(working)],
232         [AC_MSG_RESULT(buggy)
233         AC_DEFINE(BROKEN_GETADDRINFO, 1, [getaddrinfo is broken (if present)])],
234         [AC_MSG_RESULT(assume it is working)])
235         AC_DEFINE(SETEUID_BREAKS_SETUID)
236         AC_DEFINE(BROKEN_SETREUID)
237         AC_DEFINE(BROKEN_SETREGID)
238         AC_DEFINE_UNQUOTED(BIND_8_COMPAT, 1,
239                 [Define if your resolver libs need this for getrrsetbyname])
240         AC_DEFINE(SSH_TUN_FREEBSD, 1, [Open tunnel devices the FreeBSD way])
241         AC_DEFINE(SSH_TUN_COMPAT_AF, 1,
242             [Use tunnel device compatibility to OpenBSD])
243         AC_DEFINE(SSH_TUN_PREPEND_AF, 1,
244             [Prepend the address family to IP tunnel traffic])
245         ;;
246 *-*-hpux*)
247         # first we define all of the options common to all HP-UX releases
248         CPPFLAGS="$CPPFLAGS -D_HPUX_SOURCE -D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED=1"
249         IPADDR_IN_DISPLAY=yes
250         AC_DEFINE(USE_PIPES)
251         AC_DEFINE(LOGIN_NO_ENDOPT, 1,
252             [Define if your login program cannot handle end of options ("--")])
253         AC_DEFINE(LOGIN_NEEDS_UTMPX)
254         AC_DEFINE(LOCKED_PASSWD_STRING, "*",
255                 [String used in /etc/passwd to denote locked account])
256         AC_DEFINE(SPT_TYPE,SPT_PSTAT)
257         MAIL="/var/mail/username"
258         LIBS="$LIBS -lsec"
259         AC_CHECK_LIB(xnet, t_error, ,
260             AC_MSG_ERROR([*** -lxnet needed on HP-UX - check config.log ***]))
261
262         # next, we define all of the options specific to major releases
263         case "$host" in
264         *-*-hpux10*)
265                 if test -z "$GCC"; then
266                         CFLAGS="$CFLAGS -Ae"
267                 fi
268                 ;;
269         *-*-hpux11*)
270                 AC_DEFINE(PAM_SUN_CODEBASE, 1,
271                         [Define if you are using Solaris-derived PAM which
272                         passes pam_messages to the conversation function
273                         with an extra level of indirection])
274                 AC_DEFINE(DISABLE_UTMP, 1,
275                         [Define if you don't want to use utmp])
276                 AC_DEFINE(USE_BTMP, 1, [Use btmp to log bad logins])
277                 check_for_hpux_broken_getaddrinfo=1
278                 check_for_conflicting_getspnam=1
279                 ;;
280         esac
281
282         # lastly, we define options specific to minor releases
283         case "$host" in
284         *-*-hpux10.26)
285                 AC_DEFINE(HAVE_SECUREWARE, 1,
286                         [Define if you have SecureWare-based
287                         protected password database])
288                 disable_ptmx_check=yes
289                 LIBS="$LIBS -lsecpw"
290                 ;;
291         esac
292         ;;
293 *-*-irix5*)
294         PATH="$PATH:/usr/etc"
295         AC_DEFINE(BROKEN_INET_NTOA, 1,
296                 [Define if you system's inet_ntoa is busted
297                 (e.g. Irix gcc issue)])
298         AC_DEFINE(SETEUID_BREAKS_SETUID)
299         AC_DEFINE(BROKEN_SETREUID)
300         AC_DEFINE(BROKEN_SETREGID)
301         AC_DEFINE(WITH_ABBREV_NO_TTY, 1,
302                 [Define if you shouldn't strip 'tty' from your
303                 ttyname in [uw]tmp])
304         AC_DEFINE(LOCKED_PASSWD_STRING, "*LK*")
305         ;;
306 *-*-irix6*)
307         PATH="$PATH:/usr/etc"
308         AC_DEFINE(WITH_IRIX_ARRAY, 1,
309                 [Define if you have/want arrays
310                 (cluster-wide session managment, not C arrays)])
311         AC_DEFINE(WITH_IRIX_PROJECT, 1,
312                 [Define if you want IRIX project management])
313         AC_DEFINE(WITH_IRIX_AUDIT, 1,
314                 [Define if you want IRIX audit trails])
315         AC_CHECK_FUNC(jlimit_startjob, [AC_DEFINE(WITH_IRIX_JOBS, 1,
316                 [Define if you want IRIX kernel jobs])])
317         AC_DEFINE(BROKEN_INET_NTOA)
318         AC_DEFINE(SETEUID_BREAKS_SETUID)
319         AC_DEFINE(BROKEN_SETREUID)
320         AC_DEFINE(BROKEN_SETREGID)
321         AC_DEFINE(BROKEN_UPDWTMPX, 1, [updwtmpx is broken (if present)])
322         AC_DEFINE(WITH_ABBREV_NO_TTY)
323         AC_DEFINE(LOCKED_PASSWD_STRING, "*LK*")
324         ;;
325 *-*-linux*)
326         no_dev_ptmx=1
327         check_for_libcrypt_later=1
328         check_for_openpty_ctty_bug=1
329         AC_DEFINE(DONT_TRY_OTHER_AF, 1, [Workaround more Linux IPv6 quirks])
330         AC_DEFINE(PAM_TTY_KLUDGE, 1,
331                 [Work around problematic Linux PAM modules handling of PAM_TTY])
332         AC_DEFINE(LOCKED_PASSWD_PREFIX, "!",
333                 [String used in /etc/passwd to denote locked account])
334         AC_DEFINE(SPT_TYPE,SPT_REUSEARGV)
335         AC_DEFINE(LINK_OPNOTSUPP_ERRNO, EPERM,
336                 [Define to whatever link() returns for "not supported"
337                 if it doesn't return EOPNOTSUPP.])
338         AC_DEFINE(_PATH_BTMP, "/var/log/btmp", [log for bad login attempts])
339         AC_DEFINE(USE_BTMP)
340         inet6_default_4in6=yes
341         case `uname -r` in
342         1.*|2.0.*)
343                 AC_DEFINE(BROKEN_CMSG_TYPE, 1,
344                         [Define if cmsg_type is not passed correctly])
345                 ;;
346         esac
347         # tun(4) forwarding compat code
348         AC_CHECK_HEADERS(linux/if_tun.h)
349         if test "x$ac_cv_header_linux_if_tun_h" = "xyes" ; then
350                 AC_DEFINE(SSH_TUN_LINUX, 1,
351                     [Open tunnel devices the Linux tun/tap way])
352                 AC_DEFINE(SSH_TUN_COMPAT_AF, 1,
353                     [Use tunnel device compatibility to OpenBSD])
354                 AC_DEFINE(SSH_TUN_PREPEND_AF, 1,
355                     [Prepend the address family to IP tunnel traffic])
356         fi
357         ;;
358 mips-sony-bsd|mips-sony-newsos4)
359         AC_DEFINE(NEED_SETPGRP, 1, [Need setpgrp to acquire controlling tty])
360         SONY=1
361         ;;
362 *-*-netbsd*)
363         check_for_libcrypt_before=1
364         if test "x$withval" != "xno" ; then
365                 need_dash_r=1
366         fi
367         AC_DEFINE(SSH_TUN_FREEBSD, 1, [Open tunnel devices the FreeBSD way])
368         AC_CHECK_HEADER([net/if_tap.h], ,
369             AC_DEFINE(SSH_TUN_NO_L2, 1, [No layer 2 tunnel support]))
370         AC_DEFINE(SSH_TUN_PREPEND_AF, 1,
371             [Prepend the address family to IP tunnel traffic])
372         ;;
373 *-*-freebsd*)
374         check_for_libcrypt_later=1
375         AC_DEFINE(LOCKED_PASSWD_PREFIX, "*LOCKED*", [Account locked with pw(1)])
376         AC_DEFINE(SSH_TUN_FREEBSD, 1, [Open tunnel devices the FreeBSD way])
377         AC_CHECK_HEADER([net/if_tap.h], ,
378             AC_DEFINE(SSH_TUN_NO_L2, 1, [No layer 2 tunnel support]))
379         ;;
380 *-*-bsdi*)
381         AC_DEFINE(SETEUID_BREAKS_SETUID)
382         AC_DEFINE(BROKEN_SETREUID)
383         AC_DEFINE(BROKEN_SETREGID)
384         ;;
385 *-next-*)
386         conf_lastlog_location="/usr/adm/lastlog"
387         conf_utmp_location=/etc/utmp
388         conf_wtmp_location=/usr/adm/wtmp
389         MAIL=/usr/spool/mail
390         AC_DEFINE(HAVE_NEXT, 1, [Define if you are on NeXT])
391         AC_DEFINE(BROKEN_REALPATH)
392         AC_DEFINE(USE_PIPES)
393         AC_DEFINE(BROKEN_SAVED_UIDS, 1, [Needed for NeXT])
394         ;;
395 *-*-openbsd*)
396         AC_DEFINE(HAVE_ATTRIBUTE__SENTINEL__, 1, [OpenBSD's gcc has sentinel])
397         AC_DEFINE(HAVE_ATTRIBUTE__BOUNDED__, 1, [OpenBSD's gcc has bounded])
398         AC_DEFINE(SSH_TUN_OPENBSD, 1, [Open tunnel devices the OpenBSD way])
399         ;;
400 *-*-solaris*)
401         if test "x$withval" != "xno" ; then
402                 need_dash_r=1
403         fi
404         AC_DEFINE(PAM_SUN_CODEBASE)
405         AC_DEFINE(LOGIN_NEEDS_UTMPX)
406         AC_DEFINE(LOGIN_NEEDS_TERM, 1,
407                 [Some versions of /bin/login need the TERM supplied
408                 on the commandline])
409         AC_DEFINE(PAM_TTY_KLUDGE)
410         AC_DEFINE(SSHPAM_CHAUTHTOK_NEEDS_RUID, 1,
411                 [Define if pam_chauthtok wants real uid set
412                 to the unpriv'ed user])
413         AC_DEFINE(LOCKED_PASSWD_STRING, "*LK*")
414         # Pushing STREAMS modules will cause sshd to acquire a controlling tty.
415         AC_DEFINE(SSHD_ACQUIRES_CTTY, 1,
416                 [Define if sshd somehow reacquires a controlling TTY
417                 after setsid()])
418         AC_DEFINE(PASSWD_NEEDS_USERNAME, 1, [must supply username to passwd
419                 in case the name is longer than 8 chars])
420         external_path_file=/etc/default/login
421         # hardwire lastlog location (can't detect it on some versions)
422         conf_lastlog_location="/var/adm/lastlog"
423         AC_MSG_CHECKING(for obsolete utmp and wtmp in solaris2.x)
424         sol2ver=`echo "$host"| sed -e 's/.*[[0-9]]\.//'`
425         if test "$sol2ver" -ge 8; then
426                 AC_MSG_RESULT(yes)
427                 AC_DEFINE(DISABLE_UTMP)
428                 AC_DEFINE(DISABLE_WTMP, 1,
429                         [Define if you don't want to use wtmp])
430         else
431                 AC_MSG_RESULT(no)
432         fi
433         ;;
434 *-*-sunos4*)
435         CPPFLAGS="$CPPFLAGS -DSUNOS4"
436         AC_CHECK_FUNCS(getpwanam)
437         AC_DEFINE(PAM_SUN_CODEBASE)
438         conf_utmp_location=/etc/utmp
439         conf_wtmp_location=/var/adm/wtmp
440         conf_lastlog_location=/var/adm/lastlog
441         AC_DEFINE(USE_PIPES)
442         ;;
443 *-ncr-sysv*)
444         LIBS="$LIBS -lc89"
445         AC_DEFINE(USE_PIPES)
446         AC_DEFINE(SSHD_ACQUIRES_CTTY)
447         AC_DEFINE(SETEUID_BREAKS_SETUID)
448         AC_DEFINE(BROKEN_SETREUID)
449         AC_DEFINE(BROKEN_SETREGID)
450         ;;
451 *-sni-sysv*)
452         # /usr/ucblib MUST NOT be searched on ReliantUNIX
453         AC_CHECK_LIB(dl, dlsym, ,)
454         # -lresolv needs to be at the end of LIBS or DNS lookups break
455         AC_CHECK_LIB(resolv, res_query, [ LIBS="$LIBS -lresolv" ])
456         IPADDR_IN_DISPLAY=yes
457         AC_DEFINE(USE_PIPES)
458         AC_DEFINE(IP_TOS_IS_BROKEN)
459         AC_DEFINE(SETEUID_BREAKS_SETUID)
460         AC_DEFINE(BROKEN_SETREUID)
461         AC_DEFINE(BROKEN_SETREGID)
462         AC_DEFINE(SSHD_ACQUIRES_CTTY)
463         external_path_file=/etc/default/login
464         # /usr/ucblib/libucb.a no longer needed on ReliantUNIX
465         # Attention: always take care to bind libsocket and libnsl before libc,
466         # otherwise you will find lots of "SIOCGPGRP errno 22" on syslog
467         ;;
468 # UnixWare 1.x, UnixWare 2.x, and others based on code from Univel.
469 *-*-sysv4.2*)
470         CFLAGS="$CFLAGS -Dva_list=_VA_LIST"
471         AC_DEFINE(USE_PIPES)
472         AC_DEFINE(SETEUID_BREAKS_SETUID)
473         AC_DEFINE(BROKEN_SETREUID)
474         AC_DEFINE(BROKEN_SETREGID)
475         AC_DEFINE(PASSWD_NEEDS_USERNAME, 1, [must supply username to passwd])
476         AC_DEFINE(LOCKED_PASSWD_STRING, "*LK*")
477         ;;
478 # UnixWare 7.x, OpenUNIX 8
479 *-*-sysv5*)
480         check_for_libcrypt_later=1
481         AC_DEFINE(UNIXWARE_LONG_PASSWORDS, 1, [Support passwords > 8 chars])
482         AC_DEFINE(USE_PIPES)
483         AC_DEFINE(SETEUID_BREAKS_SETUID)
484         AC_DEFINE(BROKEN_SETREUID)
485         AC_DEFINE(BROKEN_SETREGID)
486         AC_DEFINE(PASSWD_NEEDS_USERNAME)
487         case "$host" in
488         *-*-sysv5SCO_SV*)       # SCO OpenServer 6.x
489                 TEST_SHELL=/u95/bin/sh
490                 AC_DEFINE(BROKEN_LIBIAF, 1,
491                         [ia_uinfo routines not supported by OS yet])
492                 ;;
493         *)      AC_DEFINE(LOCKED_PASSWD_STRING, "*LK*")
494                 ;;
495         esac
496         ;;
497 *-*-sysv*)
498         ;;
499 # SCO UNIX and OEM versions of SCO UNIX
500 *-*-sco3.2v4*)
501         AC_MSG_ERROR("This Platform is no longer supported.")
502         ;;
503 # SCO OpenServer 5.x
504 *-*-sco3.2v5*)
505         if test -z "$GCC"; then
506                 CFLAGS="$CFLAGS -belf"
507         fi
508         LIBS="$LIBS -lprot -lx -ltinfo -lm"
509         no_dev_ptmx=1
510         AC_DEFINE(USE_PIPES)
511         AC_DEFINE(HAVE_SECUREWARE)
512         AC_DEFINE(DISABLE_SHADOW)
513         AC_DEFINE(DISABLE_FD_PASSING)
514         AC_DEFINE(SETEUID_BREAKS_SETUID)
515         AC_DEFINE(BROKEN_SETREUID)
516         AC_DEFINE(BROKEN_SETREGID)
517         AC_DEFINE(WITH_ABBREV_NO_TTY)
518         AC_DEFINE(BROKEN_UPDWTMPX)
519         AC_DEFINE(PASSWD_NEEDS_USERNAME)
520         AC_CHECK_FUNCS(getluid setluid)
521         MANTYPE=man
522         TEST_SHELL=ksh
523         ;;
524 *-*-unicosmk*)
525         AC_DEFINE(NO_SSH_LASTLOG, 1,
526                 [Define if you don't want to use lastlog in session.c])
527         AC_DEFINE(SETEUID_BREAKS_SETUID)
528         AC_DEFINE(BROKEN_SETREUID)
529         AC_DEFINE(BROKEN_SETREGID)
530         AC_DEFINE(USE_PIPES)
531         AC_DEFINE(DISABLE_FD_PASSING)
532         LDFLAGS="$LDFLAGS"
533         LIBS="$LIBS -lgen -lrsc -lshare -luex -lacm"
534         MANTYPE=cat
535         ;;
536 *-*-unicosmp*)
537         AC_DEFINE(SETEUID_BREAKS_SETUID)
538         AC_DEFINE(BROKEN_SETREUID)
539         AC_DEFINE(BROKEN_SETREGID)
540         AC_DEFINE(WITH_ABBREV_NO_TTY)
541         AC_DEFINE(USE_PIPES)
542         AC_DEFINE(DISABLE_FD_PASSING)
543         LDFLAGS="$LDFLAGS"
544         LIBS="$LIBS -lgen -lacid -ldb"
545         MANTYPE=cat
546         ;;
547 *-*-unicos*)
548         AC_DEFINE(SETEUID_BREAKS_SETUID)
549         AC_DEFINE(BROKEN_SETREUID)
550         AC_DEFINE(BROKEN_SETREGID)
551         AC_DEFINE(USE_PIPES)
552         AC_DEFINE(DISABLE_FD_PASSING)
553         AC_DEFINE(NO_SSH_LASTLOG)
554         LDFLAGS="$LDFLAGS -Wl,-Dmsglevel=334:fatal"
555         LIBS="$LIBS -lgen -lrsc -lshare -luex -lacm"
556         MANTYPE=cat
557         ;;
558 *-dec-osf*)
559         AC_MSG_CHECKING(for Digital Unix SIA)
560         no_osfsia=""
561         AC_ARG_WITH(osfsia,
562                 [  --with-osfsia           Enable Digital Unix SIA],
563                 [
564                         if test "x$withval" = "xno" ; then
565                                 AC_MSG_RESULT(disabled)
566                                 no_osfsia=1
567                         fi
568                 ],
569         )
570         if test -z "$no_osfsia" ; then
571                 if test -f /etc/sia/matrix.conf; then
572                         AC_MSG_RESULT(yes)
573                         AC_DEFINE(HAVE_OSF_SIA, 1,
574                                 [Define if you have Digital Unix Security
575                                 Integration Architecture])
576                         AC_DEFINE(DISABLE_LOGIN, 1,
577                                 [Define if you don't want to use your
578                                 system's login() call])
579                         AC_DEFINE(DISABLE_FD_PASSING)
580                         LIBS="$LIBS -lsecurity -ldb -lm -laud"
581                 else
582                         AC_MSG_RESULT(no)
583                         AC_DEFINE(LOCKED_PASSWD_SUBSTR, "Nologin",
584                           [String used in /etc/passwd to denote locked account])
585                 fi
586         fi
587         AC_DEFINE(BROKEN_GETADDRINFO)
588         AC_DEFINE(SETEUID_BREAKS_SETUID)
589         AC_DEFINE(BROKEN_SETREUID)
590         AC_DEFINE(BROKEN_SETREGID)
591         ;;
592
593 *-*-nto-qnx*)
594         AC_DEFINE(USE_PIPES)
595         AC_DEFINE(NO_X11_UNIX_SOCKETS)
596         AC_DEFINE(MISSING_NFDBITS, 1, [Define on *nto-qnx systems])
597         AC_DEFINE(MISSING_HOWMANY, 1, [Define on *nto-qnx systems])
598         AC_DEFINE(MISSING_FD_MASK, 1, [Define on *nto-qnx systems])
599         AC_DEFINE(DISABLE_LASTLOG)
600         AC_DEFINE(SSHD_ACQUIRES_CTTY)
601         enable_etc_default_login=no     # has incompatible /etc/default/login
602         ;;
603
604 *-*-ultrix*)
605         AC_DEFINE(BROKEN_GETGROUPS, 1, [getgroups(0,NULL) will return -1])
606         AC_DEFINE(BROKEN_MMAP, 1, [Ultrix mmap can't map files])
607         AC_DEFINE(NEED_SETPGRP)
608         AC_DEFINE(HAVE_SYS_SYSLOG_H, 1, [Force use of sys/syslog.h on Ultrix])
609         ;;
610
611 *-*-lynxos)
612         CFLAGS="$CFLAGS -D__NO_INCLUDE_WARN__"
613         AC_DEFINE(MISSING_HOWMANY)
614         AC_DEFINE(BROKEN_SETVBUF, 1, [LynxOS has broken setvbuf() implementation])
615         ;;
616 esac
617
618 # Allow user to specify flags
619 AC_ARG_WITH(cflags,
620         [  --with-cflags           Specify additional flags to pass to compiler],
621         [
622                 if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
623                     test "x${withval}" != "xyes"; then
624                         CFLAGS="$CFLAGS $withval"
625                 fi
626         ]
627 )
628 AC_ARG_WITH(cppflags,
629         [  --with-cppflags         Specify additional flags to pass to preprocessor] ,
630         [
631                 if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
632                     test "x${withval}" != "xyes"; then
633                         CPPFLAGS="$CPPFLAGS $withval"
634                 fi
635         ]
636 )
637 AC_ARG_WITH(ldflags,
638         [  --with-ldflags          Specify additional flags to pass to linker],
639         [
640                 if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
641                     test "x${withval}" != "xyes"; then
642                         LDFLAGS="$LDFLAGS $withval"
643                 fi
644         ]
645 )
646 AC_ARG_WITH(libs,
647         [  --with-libs             Specify additional libraries to link with],
648         [
649                 if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
650                     test "x${withval}" != "xyes"; then
651                         LIBS="$LIBS $withval"
652                 fi
653         ]
654 )
655 AC_ARG_WITH(Werror,
656         [  --with-Werror           Build main code with -Werror],
657         [
658                 if test -n "$withval"  &&  test "x$withval" != "xno"; then
659                         werror_flags="-Werror"
660                         if test "x${withval}" != "xyes"; then
661                                 werror_flags="$withval"
662                         fi
663                 fi
664         ]
665 )
666
667 AC_MSG_CHECKING(compiler and flags for sanity)
668 AC_RUN_IFELSE(
669         [AC_LANG_SOURCE([
670 #include <stdio.h>
671 int main(){exit(0);}
672         ])],
673         [       AC_MSG_RESULT(yes) ],
674         [
675                 AC_MSG_RESULT(no)
676                 AC_MSG_ERROR([*** compiler cannot create working executables, check config.log ***])
677         ],
678         [       AC_MSG_WARN([cross compiling: not checking compiler sanity]) ]
679 )
680
681 dnl Checks for header files.
682 AC_CHECK_HEADERS( \
683         bstring.h \
684         crypt.h \
685         crypto/sha2.h \
686         dirent.h \
687         endian.h \
688         features.h \
689         floatingpoint.h \
690         getopt.h \
691         glob.h \
692         ia.h \
693         iaf.h \
694         limits.h \
695         login.h \
696         maillock.h \
697         ndir.h \
698         net/if_tun.h \
699         netdb.h \
700         netgroup.h \
701         pam/pam_appl.h \
702         paths.h \
703         pty.h \
704         readpassphrase.h \
705         rpc/types.h \
706         security/pam_appl.h \
707         sha2.h \
708         shadow.h \
709         stddef.h \
710         stdint.h \
711         string.h \
712         strings.h \
713         sys/audit.h \
714         sys/bitypes.h \
715         sys/bsdtty.h \
716         sys/cdefs.h \
717         sys/dir.h \
718         sys/mman.h \
719         sys/ndir.h \
720         sys/prctl.h \
721         sys/pstat.h \
722         sys/select.h \
723         sys/stat.h \
724         sys/stream.h \
725         sys/stropts.h \
726         sys/strtio.h \
727         sys/sysmacros.h \
728         sys/time.h \
729         sys/timers.h \
730         sys/un.h \
731         time.h \
732         tmpdir.h \
733         ttyent.h \
734         unistd.h \
735         usersec.h \
736         util.h \
737         utime.h \
738         utmp.h \
739         utmpx.h \
740         vis.h \
741 )
742
743 # lastlog.h requires sys/time.h to be included first on Solaris
744 AC_CHECK_HEADERS(lastlog.h, [], [], [
745 #ifdef HAVE_SYS_TIME_H
746 # include <sys/time.h>
747 #endif
748 ])
749
750 # sys/ptms.h requires sys/stream.h to be included first on Solaris
751 AC_CHECK_HEADERS(sys/ptms.h, [], [], [
752 #ifdef HAVE_SYS_STREAM_H
753 # include <sys/stream.h>
754 #endif
755 ])
756
757 # login_cap.h requires sys/types.h on NetBSD
758 AC_CHECK_HEADERS(login_cap.h, [], [], [
759 #include <sys/types.h>
760 ])
761
762 # Checks for libraries.
763 AC_CHECK_FUNC(yp_match, , AC_CHECK_LIB(nsl, yp_match))
764 AC_CHECK_FUNC(setsockopt, , AC_CHECK_LIB(socket, setsockopt))
765
766 dnl IRIX and Solaris 2.5.1 have dirname() in libgen
767 AC_CHECK_FUNCS(dirname, [AC_CHECK_HEADERS(libgen.h)] ,[
768         AC_CHECK_LIB(gen, dirname,[
769                 AC_CACHE_CHECK([for broken dirname],
770                         ac_cv_have_broken_dirname, [
771                         save_LIBS="$LIBS"
772                         LIBS="$LIBS -lgen"
773                         AC_RUN_IFELSE(
774                                 [AC_LANG_SOURCE([[
775 #include <libgen.h>
776 #include <string.h>
777
778 int main(int argc, char **argv) {
779     char *s, buf[32];
780
781     strncpy(buf,"/etc", 32);
782     s = dirname(buf);
783     if (!s || strncmp(s, "/", 32) != 0) {
784         exit(1);
785     } else {
786         exit(0);
787     }
788 }
789                                 ]])],
790                                 [ ac_cv_have_broken_dirname="no" ],
791                                 [ ac_cv_have_broken_dirname="yes" ],
792                                 [ ac_cv_have_broken_dirname="no" ],
793                         )
794                         LIBS="$save_LIBS"
795                 ])
796                 if test "x$ac_cv_have_broken_dirname" = "xno" ; then
797                         LIBS="$LIBS -lgen"
798                         AC_DEFINE(HAVE_DIRNAME)
799                         AC_CHECK_HEADERS(libgen.h)
800                 fi
801         ])
802 ])
803
804 AC_CHECK_FUNC(getspnam, ,
805         AC_CHECK_LIB(gen, getspnam, LIBS="$LIBS -lgen"))
806 AC_SEARCH_LIBS(basename, gen, AC_DEFINE(HAVE_BASENAME, 1,
807         [Define if you have the basename function.]))
808
809 dnl zlib is required
810 AC_ARG_WITH(zlib,
811         [  --with-zlib=PATH        Use zlib in PATH],
812         [ if test "x$withval" = "xno" ; then
813                 AC_MSG_ERROR([*** zlib is required ***])
814           elif test "x$withval" != "xyes"; then
815                 if test -d "$withval/lib"; then
816                         if test -n "${need_dash_r}"; then
817                                 LDFLAGS="-L${withval}/lib -R${withval}/lib ${LDFLAGS}"
818                         else
819                                 LDFLAGS="-L${withval}/lib ${LDFLAGS}"
820                         fi
821                 else
822                         if test -n "${need_dash_r}"; then
823                                 LDFLAGS="-L${withval} -R${withval} ${LDFLAGS}"
824                         else
825                                 LDFLAGS="-L${withval} ${LDFLAGS}"
826                         fi
827                 fi
828                 if test -d "$withval/include"; then
829                         CPPFLAGS="-I${withval}/include ${CPPFLAGS}"
830                 else
831                         CPPFLAGS="-I${withval} ${CPPFLAGS}"
832                 fi
833         fi ]
834 )
835
836 AC_CHECK_LIB(z, deflate, ,
837         [
838                 saved_CPPFLAGS="$CPPFLAGS"
839                 saved_LDFLAGS="$LDFLAGS"
840                 save_LIBS="$LIBS"
841                 dnl Check default zlib install dir
842                 if test -n "${need_dash_r}"; then
843                         LDFLAGS="-L/usr/local/lib -R/usr/local/lib ${saved_LDFLAGS}"
844                 else
845                         LDFLAGS="-L/usr/local/lib ${saved_LDFLAGS}"
846                 fi
847                 CPPFLAGS="-I/usr/local/include ${saved_CPPFLAGS}"
848                 LIBS="$LIBS -lz"
849                 AC_TRY_LINK_FUNC(deflate, AC_DEFINE(HAVE_LIBZ),
850                         [
851                                 AC_MSG_ERROR([*** zlib missing - please install first or check config.log ***])
852                         ]
853                 )
854         ]
855 )
856 AC_CHECK_HEADER([zlib.h], ,AC_MSG_ERROR([*** zlib.h missing - please install first or check config.log ***]))
857
858 AC_ARG_WITH(zlib-version-check,
859         [  --without-zlib-version-check Disable zlib version check],
860         [  if test "x$withval" = "xno" ; then
861                 zlib_check_nonfatal=1
862            fi
863         ]
864 )
865
866 AC_MSG_CHECKING(for possibly buggy zlib)
867 AC_RUN_IFELSE([AC_LANG_SOURCE([[
868 #include <stdio.h>
869 #include <zlib.h>
870 int main()
871 {
872         int a=0, b=0, c=0, d=0, n, v;
873         n = sscanf(ZLIB_VERSION, "%d.%d.%d.%d", &a, &b, &c, &d);
874         if (n != 3 && n != 4)
875                 exit(1);
876         v = a*1000000 + b*10000 + c*100 + d;
877         fprintf(stderr, "found zlib version %s (%d)\n", ZLIB_VERSION, v);
878
879         /* 1.1.4 is OK */
880         if (a == 1 && b == 1 && c >= 4)
881                 exit(0);
882
883         /* 1.2.3 and up are OK */
884         if (v >= 1020300)
885                 exit(0);
886
887         exit(2);
888 }
889         ]])],
890         AC_MSG_RESULT(no),
891         [ AC_MSG_RESULT(yes)
892           if test -z "$zlib_check_nonfatal" ; then
893                 AC_MSG_ERROR([*** zlib too old - check config.log ***
894 Your reported zlib version has known security problems.  It's possible your
895 vendor has fixed these problems without changing the version number.  If you
896 are sure this is the case, you can disable the check by running
897 "./configure --without-zlib-version-check".
898 If you are in doubt, upgrade zlib to version 1.2.3 or greater.
899 See http://www.gzip.org/zlib/ for details.])
900           else
901                 AC_MSG_WARN([zlib version may have security problems])
902           fi
903         ],
904         [       AC_MSG_WARN([cross compiling: not checking zlib version]) ]
905 )
906
907 dnl UnixWare 2.x
908 AC_CHECK_FUNC(strcasecmp,
909         [], [ AC_CHECK_LIB(resolv, strcasecmp, LIBS="$LIBS -lresolv") ]
910 )
911 AC_CHECK_FUNCS(utimes,
912         [], [ AC_CHECK_LIB(c89, utimes, [AC_DEFINE(HAVE_UTIMES)
913                                         LIBS="$LIBS -lc89"]) ]
914 )
915
916 dnl    Checks for libutil functions
917 AC_CHECK_HEADERS(libutil.h)
918 AC_SEARCH_LIBS(login, util bsd, [AC_DEFINE(HAVE_LOGIN, 1,
919         [Define if your libraries define login()])])
920 AC_CHECK_FUNCS(logout updwtmp logwtmp)
921
922 AC_FUNC_STRFTIME
923
924 # Check for ALTDIRFUNC glob() extension
925 AC_MSG_CHECKING(for GLOB_ALTDIRFUNC support)
926 AC_EGREP_CPP(FOUNDIT,
927         [
928                 #include <glob.h>
929                 #ifdef GLOB_ALTDIRFUNC
930                 FOUNDIT
931                 #endif
932         ],
933         [
934                 AC_DEFINE(GLOB_HAS_ALTDIRFUNC, 1,
935                         [Define if your system glob() function has
936                         the GLOB_ALTDIRFUNC extension])
937                 AC_MSG_RESULT(yes)
938         ],
939         [
940                 AC_MSG_RESULT(no)
941         ]
942 )
943
944 # Check for g.gl_matchc glob() extension
945 AC_MSG_CHECKING(for gl_matchc field in glob_t)
946 AC_TRY_COMPILE(
947         [ #include <glob.h> ],
948         [glob_t g; g.gl_matchc = 1;],
949         [
950                 AC_DEFINE(GLOB_HAS_GL_MATCHC, 1,
951                         [Define if your system glob() function has
952                         gl_matchc options in glob_t])
953                 AC_MSG_RESULT(yes)
954         ],
955         [
956                 AC_MSG_RESULT(no)
957         ]
958 )
959
960 AC_MSG_CHECKING([whether struct dirent allocates space for d_name])
961 AC_RUN_IFELSE(
962         [AC_LANG_SOURCE([[
963 #include <sys/types.h>
964 #include <dirent.h>
965 int main(void){struct dirent d;exit(sizeof(d.d_name)<=sizeof(char));}
966         ]])],
967         [AC_MSG_RESULT(yes)],
968         [
969                 AC_MSG_RESULT(no)
970                 AC_DEFINE(BROKEN_ONE_BYTE_DIRENT_D_NAME, 1,
971                         [Define if your struct dirent expects you to
972                         allocate extra space for d_name])
973         ],
974         [
975                 AC_MSG_WARN([cross compiling: assuming BROKEN_ONE_BYTE_DIRENT_D_NAME])
976                 AC_DEFINE(BROKEN_ONE_BYTE_DIRENT_D_NAME)
977         ]
978 )
979
980 AC_MSG_CHECKING([for /proc/pid/fd directory])
981 if test -d "/proc/$$/fd" ; then
982         AC_DEFINE(HAVE_PROC_PID, 1, [Define if you have /proc/$pid/fd])
983         AC_MSG_RESULT(yes)
984 else
985         AC_MSG_RESULT(no)
986 fi
987
988 # Check whether user wants S/Key support
989 SKEY_MSG="no"
990 AC_ARG_WITH(skey,
991         [  --with-skey[[=PATH]]      Enable S/Key support (optionally in PATH)],
992         [
993                 if test "x$withval" != "xno" ; then
994
995                         if test "x$withval" != "xyes" ; then
996                                 CPPFLAGS="$CPPFLAGS -I${withval}/include"
997                                 LDFLAGS="$LDFLAGS -L${withval}/lib"
998                         fi
999
1000                         AC_DEFINE(SKEY, 1, [Define if you want S/Key support])
1001                         LIBS="-lskey $LIBS"
1002                         SKEY_MSG="yes"
1003
1004                         AC_MSG_CHECKING([for s/key support])
1005                         AC_LINK_IFELSE(
1006                                 [AC_LANG_SOURCE([[
1007 #include <stdio.h>
1008 #include <skey.h>
1009 int main() { char *ff = skey_keyinfo(""); ff=""; exit(0); }
1010                                 ]])],
1011                                 [AC_MSG_RESULT(yes)],
1012                                 [
1013                                         AC_MSG_RESULT(no)
1014                                         AC_MSG_ERROR([** Incomplete or missing s/key libraries.])
1015                                 ])
1016                         AC_MSG_CHECKING(if skeychallenge takes 4 arguments)
1017                         AC_TRY_COMPILE(
1018                                 [#include <stdio.h>
1019                                  #include <skey.h>],
1020                                 [(void)skeychallenge(NULL,"name","",0);],
1021                                 [AC_MSG_RESULT(yes)
1022                                  AC_DEFINE(SKEYCHALLENGE_4ARG, 1,
1023                                         [Define if your skeychallenge()
1024                                         function takes 4 arguments (NetBSD)])],
1025                                 [AC_MSG_RESULT(no)]
1026                         )
1027                 fi
1028         ]
1029 )
1030
1031 # Check whether user wants TCP wrappers support
1032 TCPW_MSG="no"
1033 AC_ARG_WITH(tcp-wrappers,
1034         [  --with-tcp-wrappers[[=PATH]] Enable tcpwrappers support (optionally in PATH)],
1035         [
1036                 if test "x$withval" != "xno" ; then
1037                         saved_LIBS="$LIBS"
1038                         saved_LDFLAGS="$LDFLAGS"
1039                         saved_CPPFLAGS="$CPPFLAGS"
1040                         if test -n "${withval}" && \
1041                             test "x${withval}" != "xyes"; then
1042                                 if test -d "${withval}/lib"; then
1043                                         if test -n "${need_dash_r}"; then
1044                                                 LDFLAGS="-L${withval}/lib -R${withval}/lib ${LDFLAGS}"
1045                                         else
1046                                                 LDFLAGS="-L${withval}/lib ${LDFLAGS}"
1047                                         fi
1048                                 else
1049                                         if test -n "${need_dash_r}"; then
1050                                                 LDFLAGS="-L${withval} -R${withval} ${LDFLAGS}"
1051                                         else
1052                                                 LDFLAGS="-L${withval} ${LDFLAGS}"
1053                                         fi
1054                                 fi
1055                                 if test -d "${withval}/include"; then
1056                                         CPPFLAGS="-I${withval}/include ${CPPFLAGS}"
1057                                 else
1058                                         CPPFLAGS="-I${withval} ${CPPFLAGS}"
1059                                 fi
1060                         fi
1061                         LIBWRAP="-lwrap"
1062                         LIBS="$LIBWRAP $LIBS"
1063                         AC_MSG_CHECKING(for libwrap)
1064                         AC_TRY_LINK(
1065                                 [
1066 #include <sys/types.h>
1067 #include <sys/socket.h>
1068 #include <netinet/in.h>
1069 #include <tcpd.h>
1070                                         int deny_severity = 0, allow_severity = 0;
1071                                 ],
1072                                 [hosts_access(0);],
1073                                 [
1074                                         AC_MSG_RESULT(yes)
1075                                         AC_DEFINE(LIBWRAP, 1,
1076                                                 [Define if you want
1077                                                 TCP Wrappers support])
1078                                         AC_SUBST(LIBWRAP)
1079                                         TCPW_MSG="yes"
1080                                 ],
1081                                 [
1082                                         AC_MSG_ERROR([*** libwrap missing])
1083                                 ]
1084                         )
1085                         LIBS="$saved_LIBS"
1086                 fi
1087         ]
1088 )
1089
1090 # Check whether user wants libedit support
1091 LIBEDIT_MSG="no"
1092 AC_ARG_WITH(libedit,
1093         [  --with-libedit[[=PATH]]   Enable libedit support for sftp],
1094         [ if test "x$withval" != "xno" ; then
1095                 if test "x$withval" != "xyes"; then
1096                         CPPFLAGS="$CPPFLAGS -I${withval}/include"
1097                         if test -n "${need_dash_r}"; then
1098                                 LDFLAGS="-L${withval}/lib -R${withval}/lib ${LDFLAGS}"
1099                         else
1100                                 LDFLAGS="-L${withval}/lib ${LDFLAGS}"
1101                         fi
1102                 fi
1103                 AC_CHECK_LIB(edit, el_init,
1104                         [ AC_DEFINE(USE_LIBEDIT, 1, [Use libedit for sftp])
1105                           LIBEDIT="-ledit -lcurses"
1106                           LIBEDIT_MSG="yes"
1107                           AC_SUBST(LIBEDIT)
1108                         ],
1109                         [ AC_MSG_ERROR(libedit not found) ],
1110                         [ -lcurses ]
1111                 )
1112                 AC_MSG_CHECKING(if libedit version is compatible)
1113                 AC_COMPILE_IFELSE(
1114                     [AC_LANG_SOURCE([[
1115 #include <histedit.h>
1116 int main(void)
1117 {
1118         int i = H_SETSIZE;
1119         el_init("", NULL, NULL, NULL);
1120         exit(0);
1121 }
1122                     ]])],
1123                     [ AC_MSG_RESULT(yes) ],
1124                     [ AC_MSG_RESULT(no)
1125                       AC_MSG_ERROR(libedit version is not compatible) ]
1126                 )
1127         fi ]
1128 )
1129
1130 AUDIT_MODULE=none
1131 AC_ARG_WITH(audit,
1132         [  --with-audit=module     Enable EXPERIMENTAL audit support (modules=debug,bsm)],
1133         [
1134           AC_MSG_CHECKING(for supported audit module)
1135           case "$withval" in
1136           bsm)
1137                 AC_MSG_RESULT(bsm)
1138                 AUDIT_MODULE=bsm
1139                 dnl    Checks for headers, libs and functions
1140                 AC_CHECK_HEADERS(bsm/audit.h, [],
1141                     [AC_MSG_ERROR(BSM enabled and bsm/audit.h not found)])
1142                 AC_CHECK_LIB(bsm, getaudit, [],
1143                     [AC_MSG_ERROR(BSM enabled and required library not found)])
1144                 AC_CHECK_FUNCS(getaudit, [],
1145                     [AC_MSG_ERROR(BSM enabled and required function not found)])
1146                 # These are optional
1147                 AC_CHECK_FUNCS(getaudit_addr)
1148                 AC_DEFINE(USE_BSM_AUDIT, 1, [Use BSM audit module])
1149                 ;;
1150           debug)
1151                 AUDIT_MODULE=debug
1152                 AC_MSG_RESULT(debug)
1153                 AC_DEFINE(SSH_AUDIT_EVENTS, 1, Use audit debugging module)
1154                 ;;
1155           no)
1156                 AC_MSG_RESULT(no)
1157                 ;;
1158           *)
1159                 AC_MSG_ERROR([Unknown audit module $withval])
1160                 ;;
1161         esac ]
1162 )
1163
1164 dnl    Checks for library functions. Please keep in alphabetical order
1165 AC_CHECK_FUNCS( \
1166         arc4random \
1167         asprintf \
1168         b64_ntop \
1169         __b64_ntop \
1170         b64_pton \
1171         __b64_pton \
1172         bcopy \
1173         bindresvport_sa \
1174         clock \
1175         closefrom \
1176         dirfd \
1177         fchmod \
1178         fchown \
1179         freeaddrinfo \
1180         futimes \
1181         getaddrinfo \
1182         getcwd \
1183         getgrouplist \
1184         getnameinfo \
1185         getopt \
1186         getpeereid \
1187         _getpty \
1188         getrlimit \
1189         getttyent \
1190         glob \
1191         inet_aton \
1192         inet_ntoa \
1193         inet_ntop \
1194         innetgr \
1195         login_getcapbool \
1196         md5_crypt \
1197         memmove \
1198         mkdtemp \
1199         mmap \
1200         ngetaddrinfo \
1201         nsleep \
1202         ogetaddrinfo \
1203         openlog_r \
1204         openpty \
1205         prctl \
1206         pstat \
1207         readpassphrase \
1208         realpath \
1209         recvmsg \
1210         rresvport_af \
1211         sendmsg \
1212         setdtablesize \
1213         setegid \
1214         setenv \
1215         seteuid \
1216         setgroups \
1217         setlogin \
1218         setpcred \
1219         setproctitle \
1220         setregid \
1221         setreuid \
1222         setrlimit \
1223         setsid \
1224         setvbuf \
1225         sigaction \
1226         sigvec \
1227         snprintf \
1228         socketpair \
1229         strdup \
1230         strerror \
1231         strlcat \
1232         strlcpy \
1233         strmode \
1234         strnvis \
1235         strtonum \
1236         strtoll \
1237         strtoul \
1238         sysconf \
1239         tcgetpgrp \
1240         truncate \
1241         unsetenv \
1242         updwtmpx \
1243         vasprintf \
1244         vhangup \
1245         vsnprintf \
1246         waitpid \
1247 )
1248
1249 # IRIX has a const char return value for gai_strerror()
1250 AC_CHECK_FUNCS(gai_strerror,[
1251         AC_DEFINE(HAVE_GAI_STRERROR)
1252         AC_TRY_COMPILE([
1253 #include <sys/types.h>
1254 #include <sys/socket.h>
1255 #include <netdb.h>
1256
1257 const char *gai_strerror(int);],[
1258 char *str;
1259
1260 str = gai_strerror(0);],[
1261                 AC_DEFINE(HAVE_CONST_GAI_STRERROR_PROTO, 1,
1262                 [Define if gai_strerror() returns const char *])])])
1263
1264 AC_SEARCH_LIBS(nanosleep, rt posix4, AC_DEFINE(HAVE_NANOSLEEP, 1,
1265         [Some systems put nanosleep outside of libc]))
1266
1267 dnl Make sure prototypes are defined for these before using them.
1268 AC_CHECK_DECL(getrusage, [AC_CHECK_FUNCS(getrusage)])
1269 AC_CHECK_DECL(strsep,
1270         [AC_CHECK_FUNCS(strsep)],
1271         [],
1272         [
1273 #ifdef HAVE_STRING_H
1274 # include <string.h>
1275 #endif
1276         ])
1277
1278 dnl tcsendbreak might be a macro
1279 AC_CHECK_DECL(tcsendbreak,
1280         [AC_DEFINE(HAVE_TCSENDBREAK)],
1281         [AC_CHECK_FUNCS(tcsendbreak)],
1282         [#include <termios.h>]
1283 )
1284
1285 AC_CHECK_DECLS(h_errno, , ,[#include <netdb.h>])
1286
1287 AC_CHECK_FUNCS(setresuid, [
1288         dnl Some platorms have setresuid that isn't implemented, test for this
1289         AC_MSG_CHECKING(if setresuid seems to work)
1290         AC_RUN_IFELSE(
1291                 [AC_LANG_SOURCE([[
1292 #include <stdlib.h>
1293 #include <errno.h>
1294 int main(){errno=0; setresuid(0,0,0); if (errno==ENOSYS) exit(1); else exit(0);}
1295                 ]])],
1296                 [AC_MSG_RESULT(yes)],
1297                 [AC_DEFINE(BROKEN_SETRESUID, 1,
1298                         [Define if your setresuid() is broken])
1299                  AC_MSG_RESULT(not implemented)],
1300                 [AC_MSG_WARN([cross compiling: not checking setresuid])]
1301         )
1302 ])
1303
1304 AC_CHECK_FUNCS(setresgid, [
1305         dnl Some platorms have setresgid that isn't implemented, test for this
1306         AC_MSG_CHECKING(if setresgid seems to work)
1307         AC_RUN_IFELSE(
1308                 [AC_LANG_SOURCE([[
1309 #include <stdlib.h>
1310 #include <errno.h>
1311 int main(){errno=0; setresgid(0,0,0); if (errno==ENOSYS) exit(1); else exit(0);}
1312                 ]])],
1313                 [AC_MSG_RESULT(yes)],
1314                 [AC_DEFINE(BROKEN_SETRESGID, 1,
1315                         [Define if your setresgid() is broken])
1316                  AC_MSG_RESULT(not implemented)],
1317                 [AC_MSG_WARN([cross compiling: not checking setresuid])]
1318         )
1319 ])
1320
1321 dnl    Checks for time functions
1322 AC_CHECK_FUNCS(gettimeofday time)
1323 dnl    Checks for utmp functions
1324 AC_CHECK_FUNCS(endutent getutent getutid getutline pututline setutent)
1325 AC_CHECK_FUNCS(utmpname)
1326 dnl    Checks for utmpx functions
1327 AC_CHECK_FUNCS(endutxent getutxent getutxid getutxline pututxline )
1328 AC_CHECK_FUNCS(setutxent utmpxname)
1329
1330 AC_CHECK_FUNC(daemon,
1331         [AC_DEFINE(HAVE_DAEMON, 1, [Define if your libraries define daemon()])],
1332         [AC_CHECK_LIB(bsd, daemon,
1333                 [LIBS="$LIBS -lbsd"; AC_DEFINE(HAVE_DAEMON)])]
1334 )
1335
1336 AC_CHECK_FUNC(getpagesize,
1337         [AC_DEFINE(HAVE_GETPAGESIZE, 1,
1338                 [Define if your libraries define getpagesize()])],
1339         [AC_CHECK_LIB(ucb, getpagesize,
1340                 [LIBS="$LIBS -lucb"; AC_DEFINE(HAVE_GETPAGESIZE)])]
1341 )
1342
1343 # Check for broken snprintf
1344 if test "x$ac_cv_func_snprintf" = "xyes" ; then
1345         AC_MSG_CHECKING([whether snprintf correctly terminates long strings])
1346         AC_RUN_IFELSE(
1347                 [AC_LANG_SOURCE([[
1348 #include <stdio.h>
1349 int main(void){char b[5];snprintf(b,5,"123456789");exit(b[4]!='\0');}
1350                 ]])],
1351                 [AC_MSG_RESULT(yes)],
1352                 [
1353                         AC_MSG_RESULT(no)
1354                         AC_DEFINE(BROKEN_SNPRINTF, 1,
1355                                 [Define if your snprintf is busted])
1356                         AC_MSG_WARN([****** Your snprintf() function is broken, complain to your vendor])
1357                 ],
1358                 [ AC_MSG_WARN([cross compiling: Assuming working snprintf()]) ]
1359         )
1360 fi
1361
1362 # If we don't have a working asprintf, then we strongly depend on vsnprintf
1363 # returning the right thing on overflow: the number of characters it tried to
1364 # create (as per SUSv3)
1365 if test "x$ac_cv_func_asprintf" != "xyes" && \
1366    test "x$ac_cv_func_vsnprintf" = "xyes" ; then
1367         AC_MSG_CHECKING([whether vsnprintf returns correct values on overflow])
1368         AC_RUN_IFELSE(
1369                 [AC_LANG_SOURCE([[
1370 #include <sys/types.h>
1371 #include <stdio.h>
1372 #include <stdarg.h>
1373
1374 int x_snprintf(char *str,size_t count,const char *fmt,...)
1375 {
1376         size_t ret; va_list ap;
1377         va_start(ap, fmt); ret = vsnprintf(str, count, fmt, ap); va_end(ap);
1378         return ret;
1379 }
1380 int main(void)
1381 {
1382         char x[1];
1383         exit(x_snprintf(x, 1, "%s %d", "hello", 12345) == 11 ? 0 : 1);
1384 } ]])],
1385                 [AC_MSG_RESULT(yes)],
1386                 [
1387                         AC_MSG_RESULT(no)
1388                         AC_DEFINE(BROKEN_SNPRINTF, 1,
1389                                 [Define if your snprintf is busted])
1390                         AC_MSG_WARN([****** Your vsnprintf() function is broken, complain to your vendor])
1391                 ],
1392                 [ AC_MSG_WARN([cross compiling: Assuming working vsnprintf()]) ]
1393         )
1394 fi
1395
1396 # On systems where [v]snprintf is broken, but is declared in stdio,
1397 # check that the fmt argument is const char * or just char *.
1398 # This is only useful for when BROKEN_SNPRINTF
1399 AC_MSG_CHECKING([whether snprintf can declare const char *fmt])
1400 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include <stdio.h>
1401            int snprintf(char *a, size_t b, const char *c, ...) { return 0; }
1402            int main(void) { snprintf(0, 0, 0); } 
1403     ]])],
1404    [AC_MSG_RESULT(yes)
1405     AC_DEFINE(SNPRINTF_CONST, [const],
1406               [Define as const if snprintf() can declare const char *fmt])],
1407    [AC_MSG_RESULT(no)
1408     AC_DEFINE(SNPRINTF_CONST, [/* not const */])])
1409
1410 # Check for missing getpeereid (or equiv) support
1411 NO_PEERCHECK=""
1412 if test "x$ac_cv_func_getpeereid" != "xyes" ; then
1413         AC_MSG_CHECKING([whether system supports SO_PEERCRED getsockopt])
1414         AC_TRY_COMPILE(
1415                 [#include <sys/types.h>
1416                  #include <sys/socket.h>],
1417                 [int i = SO_PEERCRED;],
1418                 [ AC_MSG_RESULT(yes)
1419                   AC_DEFINE(HAVE_SO_PEERCRED, 1, [Have PEERCRED socket option])
1420                 ],
1421                 [AC_MSG_RESULT(no)
1422                 NO_PEERCHECK=1]
1423         )
1424 fi
1425
1426 dnl see whether mkstemp() requires XXXXXX
1427 if test "x$ac_cv_func_mkdtemp" = "xyes" ; then
1428 AC_MSG_CHECKING([for (overly) strict mkstemp])
1429 AC_RUN_IFELSE(
1430         [AC_LANG_SOURCE([[
1431 #include <stdlib.h>
1432 main() { char template[]="conftest.mkstemp-test";
1433 if (mkstemp(template) == -1)
1434         exit(1);
1435 unlink(template); exit(0);
1436 }
1437         ]])],
1438         [
1439                 AC_MSG_RESULT(no)
1440         ],
1441         [
1442                 AC_MSG_RESULT(yes)
1443                 AC_DEFINE(HAVE_STRICT_MKSTEMP, 1, [Silly mkstemp()])
1444         ],
1445         [
1446                 AC_MSG_RESULT(yes)
1447                 AC_DEFINE(HAVE_STRICT_MKSTEMP)
1448         ]
1449 )
1450 fi
1451
1452 dnl make sure that openpty does not reacquire controlling terminal
1453 if test ! -z "$check_for_openpty_ctty_bug"; then
1454         AC_MSG_CHECKING(if openpty correctly handles controlling tty)
1455         AC_RUN_IFELSE(
1456                 [AC_LANG_SOURCE([[
1457 #include <stdio.h>
1458 #include <sys/fcntl.h>
1459 #include <sys/types.h>
1460 #include <sys/wait.h>
1461
1462 int
1463 main()
1464 {
1465         pid_t pid;
1466         int fd, ptyfd, ttyfd, status;
1467
1468         pid = fork();
1469         if (pid < 0) {          /* failed */
1470                 exit(1);
1471         } else if (pid > 0) {   /* parent */
1472                 waitpid(pid, &status, 0);
1473                 if (WIFEXITED(status))
1474                         exit(WEXITSTATUS(status));
1475                 else
1476                         exit(2);
1477         } else {                /* child */
1478                 close(0); close(1); close(2);
1479                 setsid();
1480                 openpty(&ptyfd, &ttyfd, NULL, NULL, NULL);
1481                 fd = open("/dev/tty", O_RDWR | O_NOCTTY);
1482                 if (fd >= 0)
1483                         exit(3);        /* Acquired ctty: broken */
1484                 else
1485                         exit(0);        /* Did not acquire ctty: OK */
1486         }
1487 }
1488                 ]])],
1489                 [
1490                         AC_MSG_RESULT(yes)
1491                 ],
1492                 [
1493                         AC_MSG_RESULT(no)
1494                         AC_DEFINE(SSHD_ACQUIRES_CTTY)
1495                 ],
1496                 [
1497                         AC_MSG_RESULT(cross-compiling, assuming yes)
1498                 ]
1499         )
1500 fi
1501
1502 if test "x$ac_cv_func_getaddrinfo" = "xyes" && \
1503     test "x$check_for_hpux_broken_getaddrinfo" = "x1"; then
1504         AC_MSG_CHECKING(if getaddrinfo seems to work)
1505         AC_RUN_IFELSE(
1506                 [AC_LANG_SOURCE([[
1507 #include <stdio.h>
1508 #include <sys/socket.h>
1509 #include <netdb.h>
1510 #include <errno.h>
1511 #include <netinet/in.h>
1512
1513 #define TEST_PORT "2222"
1514
1515 int
1516 main(void)
1517 {
1518         int err, sock;
1519         struct addrinfo *gai_ai, *ai, hints;
1520         char ntop[NI_MAXHOST], strport[NI_MAXSERV], *name = NULL;
1521
1522         memset(&hints, 0, sizeof(hints));
1523         hints.ai_family = PF_UNSPEC;
1524         hints.ai_socktype = SOCK_STREAM;
1525         hints.ai_flags = AI_PASSIVE;
1526
1527         err = getaddrinfo(name, TEST_PORT, &hints, &gai_ai);
1528         if (err != 0) {
1529                 fprintf(stderr, "getaddrinfo failed (%s)", gai_strerror(err));
1530                 exit(1);
1531         }
1532
1533         for (ai = gai_ai; ai != NULL; ai = ai->ai_next) {
1534                 if (ai->ai_family != AF_INET6)
1535                         continue;
1536
1537                 err = getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop,
1538                     sizeof(ntop), strport, sizeof(strport),
1539                     NI_NUMERICHOST|NI_NUMERICSERV);
1540
1541                 if (err != 0) {
1542                         if (err == EAI_SYSTEM)
1543                                 perror("getnameinfo EAI_SYSTEM");
1544                         else
1545                                 fprintf(stderr, "getnameinfo failed: %s\n",
1546                                     gai_strerror(err));
1547                         exit(2);
1548                 }
1549
1550                 sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
1551                 if (sock < 0)
1552                         perror("socket");
1553                 if (bind(sock, ai->ai_addr, ai->ai_addrlen) < 0) {
1554                         if (errno == EBADF)
1555                                 exit(3);
1556                 }
1557         }
1558         exit(0);
1559 }
1560                 ]])],
1561                 [
1562                         AC_MSG_RESULT(yes)
1563                 ],
1564                 [
1565                         AC_MSG_RESULT(no)
1566                         AC_DEFINE(BROKEN_GETADDRINFO)
1567                 ],
1568                 [
1569                         AC_MSG_RESULT(cross-compiling, assuming yes)
1570                 ]
1571         )
1572 fi
1573
1574 if test "x$ac_cv_func_getaddrinfo" = "xyes" && \
1575     test "x$check_for_aix_broken_getaddrinfo" = "x1"; then
1576         AC_MSG_CHECKING(if getaddrinfo seems to work)
1577         AC_RUN_IFELSE(
1578                 [AC_LANG_SOURCE([[
1579 #include <stdio.h>
1580 #include <sys/socket.h>
1581 #include <netdb.h>
1582 #include <errno.h>
1583 #include <netinet/in.h>
1584
1585 #define TEST_PORT "2222"
1586
1587 int
1588 main(void)
1589 {
1590         int err, sock;
1591         struct addrinfo *gai_ai, *ai, hints;
1592         char ntop[NI_MAXHOST], strport[NI_MAXSERV], *name = NULL;
1593
1594         memset(&hints, 0, sizeof(hints));
1595         hints.ai_family = PF_UNSPEC;
1596         hints.ai_socktype = SOCK_STREAM;
1597         hints.ai_flags = AI_PASSIVE;
1598
1599         err = getaddrinfo(name, TEST_PORT, &hints, &gai_ai);
1600         if (err != 0) {
1601                 fprintf(stderr, "getaddrinfo failed (%s)", gai_strerror(err));
1602                 exit(1);
1603         }
1604
1605         for (ai = gai_ai; ai != NULL; ai = ai->ai_next) {
1606                 if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6)
1607                         continue;
1608
1609                 err = getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop,
1610                     sizeof(ntop), strport, sizeof(strport),
1611                     NI_NUMERICHOST|NI_NUMERICSERV);
1612
1613                 if (ai->ai_family == AF_INET && err != 0) {
1614                         perror("getnameinfo");
1615                         exit(2);
1616                 }
1617         }
1618         exit(0);
1619 }
1620                 ]])],
1621                 [
1622                         AC_MSG_RESULT(yes)
1623                         AC_DEFINE(AIX_GETNAMEINFO_HACK, 1,
1624                                 [Define if you have a getaddrinfo that fails
1625                                 for the all-zeros IPv6 address])
1626                 ],
1627                 [
1628                         AC_MSG_RESULT(no)
1629                         AC_DEFINE(BROKEN_GETADDRINFO)
1630                 ],
1631                 [
1632                         AC_MSG_RESULT(cross-compiling, assuming no)
1633                 ]
1634         )
1635 fi
1636
1637 if test "x$check_for_conflicting_getspnam" = "x1"; then
1638         AC_MSG_CHECKING(for conflicting getspnam in shadow.h)
1639         AC_COMPILE_IFELSE(
1640                 [
1641 #include <shadow.h>
1642 int main(void) {exit(0);}
1643                 ],
1644                 [
1645                         AC_MSG_RESULT(no)
1646                 ],
1647                 [
1648                         AC_MSG_RESULT(yes)
1649                         AC_DEFINE(GETSPNAM_CONFLICTING_DEFS, 1,
1650                             [Conflicting defs for getspnam])
1651                 ]
1652         )
1653 fi
1654
1655 AC_FUNC_GETPGRP
1656
1657 # Check for PAM libs
1658 PAM_MSG="no"
1659 AC_ARG_WITH(pam,
1660         [  --with-pam              Enable PAM support ],
1661         [
1662                 if test "x$withval" != "xno" ; then
1663                         if test "x$ac_cv_header_security_pam_appl_h" != "xyes" && \
1664                            test "x$ac_cv_header_pam_pam_appl_h" != "xyes" ; then
1665                                 AC_MSG_ERROR([PAM headers not found])
1666                         fi
1667
1668                         AC_CHECK_LIB(dl, dlopen, , )
1669                         AC_CHECK_LIB(pam, pam_set_item, , AC_MSG_ERROR([*** libpam missing]))
1670                         AC_CHECK_FUNCS(pam_getenvlist)
1671                         AC_CHECK_FUNCS(pam_putenv)
1672
1673                         PAM_MSG="yes"
1674
1675                         AC_DEFINE(USE_PAM, 1,
1676                                 [Define if you want to enable PAM support])
1677                         if test $ac_cv_lib_dl_dlopen = yes; then
1678                                 LIBPAM="-lpam -ldl"
1679                         else
1680                                 LIBPAM="-lpam"
1681                         fi
1682                         AC_SUBST(LIBPAM)
1683                 fi
1684         ]
1685 )
1686
1687 # Check for older PAM
1688 if test "x$PAM_MSG" = "xyes" ; then
1689         # Check PAM strerror arguments (old PAM)
1690         AC_MSG_CHECKING([whether pam_strerror takes only one argument])
1691         AC_TRY_COMPILE(
1692                 [
1693 #include <stdlib.h>
1694 #if defined(HAVE_SECURITY_PAM_APPL_H)
1695 #include <security/pam_appl.h>
1696 #elif defined (HAVE_PAM_PAM_APPL_H)
1697 #include <pam/pam_appl.h>
1698 #endif
1699                 ],
1700                 [(void)pam_strerror((pam_handle_t *)NULL, -1);],
1701                 [AC_MSG_RESULT(no)],
1702                 [
1703                         AC_DEFINE(HAVE_OLD_PAM, 1,
1704                                 [Define if you have an old version of PAM
1705                                 which takes only one argument to pam_strerror])
1706                         AC_MSG_RESULT(yes)
1707                         PAM_MSG="yes (old library)"
1708                 ]
1709         )
1710 fi
1711
1712 # Search for OpenSSL
1713 saved_CPPFLAGS="$CPPFLAGS"
1714 saved_LDFLAGS="$LDFLAGS"
1715 AC_ARG_WITH(ssl-dir,
1716         [  --with-ssl-dir=PATH     Specify path to OpenSSL installation ],
1717         [
1718                 if test "x$withval" != "xno" ; then
1719                         case "$withval" in
1720                                 # Relative paths
1721                                 ./*|../*)       withval="`pwd`/$withval"
1722                         esac
1723                         if test -d "$withval/lib"; then
1724                                 if test -n "${need_dash_r}"; then
1725                                         LDFLAGS="-L${withval}/lib -R${withval}/lib ${LDFLAGS}"
1726                                 else
1727                                         LDFLAGS="-L${withval}/lib ${LDFLAGS}"
1728                                 fi
1729                         else
1730                                 if test -n "${need_dash_r}"; then
1731                                         LDFLAGS="-L${withval} -R${withval} ${LDFLAGS}"
1732                                 else
1733                                         LDFLAGS="-L${withval} ${LDFLAGS}"
1734                                 fi
1735                         fi
1736                         if test -d "$withval/include"; then
1737                                 CPPFLAGS="-I${withval}/include ${CPPFLAGS}"
1738                         else
1739                                 CPPFLAGS="-I${withval} ${CPPFLAGS}"
1740                         fi
1741                 fi
1742         ]
1743 )
1744 LIBS="-lcrypto $LIBS"
1745 AC_TRY_LINK_FUNC(RAND_add, AC_DEFINE(HAVE_OPENSSL, 1,
1746         [Define if your ssl headers are included
1747         with #include <openssl/header.h>]),
1748         [
1749                 dnl Check default openssl install dir
1750                 if test -n "${need_dash_r}"; then
1751                         LDFLAGS="-L/usr/local/ssl/lib -R/usr/local/ssl/lib ${saved_LDFLAGS}"
1752                 else
1753                         LDFLAGS="-L/usr/local/ssl/lib ${saved_LDFLAGS}"
1754                 fi
1755                 CPPFLAGS="-I/usr/local/ssl/include ${saved_CPPFLAGS}"
1756                 AC_TRY_LINK_FUNC(RAND_add, AC_DEFINE(HAVE_OPENSSL),
1757                         [
1758                                 AC_MSG_ERROR([*** Can't find recent OpenSSL libcrypto (see config.log for details) ***])
1759                         ]
1760                 )
1761         ]
1762 )
1763
1764 # Determine OpenSSL header version
1765 AC_MSG_CHECKING([OpenSSL header version])
1766 AC_RUN_IFELSE(
1767         [AC_LANG_SOURCE([[
1768 #include <stdio.h>
1769 #include <string.h>
1770 #include <openssl/opensslv.h>
1771 #define DATA "conftest.sslincver"
1772 int main(void) {
1773         FILE *fd;
1774         int rc;
1775
1776         fd = fopen(DATA,"w");
1777         if(fd == NULL)
1778                 exit(1);
1779
1780         if ((rc = fprintf(fd ,"%x (%s)\n", OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_TEXT)) <0)
1781                 exit(1);
1782
1783         exit(0);
1784 }
1785         ]])],
1786         [
1787                 ssl_header_ver=`cat conftest.sslincver`
1788                 AC_MSG_RESULT($ssl_header_ver)
1789         ],
1790         [
1791                 AC_MSG_RESULT(not found)
1792                 AC_MSG_ERROR(OpenSSL version header not found.)
1793         ],
1794         [
1795                 AC_MSG_WARN([cross compiling: not checking])
1796         ]
1797 )
1798
1799 # Determine OpenSSL library version
1800 AC_MSG_CHECKING([OpenSSL library version])
1801 AC_RUN_IFELSE(
1802         [AC_LANG_SOURCE([[
1803 #include <stdio.h>
1804 #include <string.h>
1805 #include <openssl/opensslv.h>
1806 #include <openssl/crypto.h>
1807 #define DATA "conftest.ssllibver"
1808 int main(void) {
1809         FILE *fd;
1810         int rc;
1811
1812         fd = fopen(DATA,"w");
1813         if(fd == NULL)
1814                 exit(1);
1815
1816         if ((rc = fprintf(fd ,"%x (%s)\n", SSLeay(), SSLeay_version(SSLEAY_VERSION))) <0)
1817                 exit(1);
1818
1819         exit(0);
1820 }
1821         ]])],
1822         [
1823                 ssl_library_ver=`cat conftest.ssllibver`
1824                 AC_MSG_RESULT($ssl_library_ver)
1825         ],
1826         [
1827                 AC_MSG_RESULT(not found)
1828                 AC_MSG_ERROR(OpenSSL library not found.)
1829         ],
1830         [
1831                 AC_MSG_WARN([cross compiling: not checking])
1832         ]
1833 )
1834
1835 # Sanity check OpenSSL headers
1836 AC_MSG_CHECKING([whether OpenSSL's headers match the library])
1837 AC_RUN_IFELSE(
1838         [AC_LANG_SOURCE([[
1839 #include <string.h>
1840 #include <openssl/opensslv.h>
1841 int main(void) { exit(SSLeay() == OPENSSL_VERSION_NUMBER ? 0 : 1); }
1842         ]])],
1843         [
1844                 AC_MSG_RESULT(yes)
1845         ],
1846         [
1847                 AC_MSG_RESULT(no)
1848                 AC_MSG_ERROR([Your OpenSSL headers do not match your library.
1849 Check config.log for details.
1850 Also see contrib/findssl.sh for help identifying header/library mismatches.])
1851         ],
1852         [
1853                 AC_MSG_WARN([cross compiling: not checking])
1854         ]
1855 )
1856
1857 AC_ARG_WITH(ssl-engine,
1858         [  --with-ssl-engine       Enable OpenSSL (hardware) ENGINE support ],
1859         [ if test "x$withval" != "xno" ; then
1860                 AC_MSG_CHECKING(for OpenSSL ENGINE support)
1861                 AC_TRY_COMPILE(
1862                         [ #include <openssl/engine.h>],
1863                         [
1864 int main(void){ENGINE_load_builtin_engines();ENGINE_register_all_complete();}
1865                         ],
1866                         [ AC_MSG_RESULT(yes)
1867                           AC_DEFINE(USE_OPENSSL_ENGINE, 1,
1868                              [Enable OpenSSL engine support])
1869                         ],
1870                         [ AC_MSG_ERROR(OpenSSL ENGINE support not found)]
1871                 )
1872           fi ]
1873 )
1874
1875 # Check for OpenSSL without EVP_aes_{192,256}_cbc
1876 AC_MSG_CHECKING([whether OpenSSL has crippled AES support])
1877 AC_COMPILE_IFELSE(
1878         [AC_LANG_SOURCE([[
1879 #include <string.h>
1880 #include <openssl/evp.h>
1881 int main(void) { exit(EVP_aes_192_cbc() == NULL || EVP_aes_256_cbc() == NULL);}
1882         ]])],
1883         [
1884                 AC_MSG_RESULT(no)
1885         ],
1886         [
1887                 AC_MSG_RESULT(yes)
1888                 AC_DEFINE(OPENSSL_LOBOTOMISED_AES, 1,
1889                     [libcrypto is missing AES 192 and 256 bit functions])
1890         ]
1891 )
1892
1893 # Some systems want crypt() from libcrypt, *not* the version in OpenSSL,
1894 # because the system crypt() is more featureful.
1895 if test "x$check_for_libcrypt_before" = "x1"; then
1896         AC_CHECK_LIB(crypt, crypt)
1897 fi
1898
1899 # Some Linux systems (Slackware) need crypt() from libcrypt, *not* the
1900 # version in OpenSSL.
1901 if test "x$check_for_libcrypt_later" = "x1"; then
1902         AC_CHECK_LIB(crypt, crypt, LIBS="$LIBS -lcrypt")
1903 fi
1904
1905 # Search for SHA256 support in libc and/or OpenSSL
1906 AC_CHECK_FUNCS(SHA256_Update EVP_sha256)
1907
1908 AC_CHECK_LIB(iaf, ia_openinfo)
1909
1910 ### Configure cryptographic random number support
1911
1912 # Check wheter OpenSSL seeds itself
1913 AC_MSG_CHECKING([whether OpenSSL's PRNG is internally seeded])
1914 AC_RUN_IFELSE(
1915         [AC_LANG_SOURCE([[
1916 #include <string.h>
1917 #include <openssl/rand.h>
1918 int main(void) { exit(RAND_status() == 1 ? 0 : 1); }
1919         ]])],
1920         [
1921                 OPENSSL_SEEDS_ITSELF=yes
1922                 AC_MSG_RESULT(yes)
1923         ],
1924         [
1925                 AC_MSG_RESULT(no)
1926                 # Default to use of the rand helper if OpenSSL doesn't
1927                 # seed itself
1928                 USE_RAND_HELPER=yes
1929         ],
1930         [
1931                 AC_MSG_WARN([cross compiling: assuming yes])
1932                 # This is safe, since all recent OpenSSL versions will
1933                 # complain at runtime if not seeded correctly.
1934                 OPENSSL_SEEDS_ITSELF=yes
1935         ]
1936 )
1937
1938
1939 # Do we want to force the use of the rand helper?
1940 AC_ARG_WITH(rand-helper,
1941         [  --with-rand-helper      Use subprocess to gather strong randomness ],
1942         [
1943                 if test "x$withval" = "xno" ; then
1944                         # Force use of OpenSSL's internal RNG, even if
1945                         # the previous test showed it to be unseeded.
1946                         if test -z "$OPENSSL_SEEDS_ITSELF" ; then
1947                                 AC_MSG_WARN([*** Forcing use of OpenSSL's non-self-seeding PRNG])
1948                                 OPENSSL_SEEDS_ITSELF=yes
1949                                 USE_RAND_HELPER=""
1950                         fi
1951                 else
1952                         USE_RAND_HELPER=yes
1953                 fi
1954         ],
1955 )
1956
1957 # Which randomness source do we use?
1958 if test ! -z "$OPENSSL_SEEDS_ITSELF" && test -z "$USE_RAND_HELPER" ; then
1959         # OpenSSL only
1960         AC_DEFINE(OPENSSL_PRNG_ONLY, 1,
1961                 [Define if you want OpenSSL's internally seeded PRNG only])
1962         RAND_MSG="OpenSSL internal ONLY"
1963         INSTALL_SSH_RAND_HELPER=""
1964 elif test ! -z "$USE_RAND_HELPER" ; then
1965         # install rand helper
1966         RAND_MSG="ssh-rand-helper"
1967         INSTALL_SSH_RAND_HELPER="yes"
1968 fi
1969 AC_SUBST(INSTALL_SSH_RAND_HELPER)
1970
1971 ### Configuration of ssh-rand-helper
1972
1973 # PRNGD TCP socket
1974 AC_ARG_WITH(prngd-port,
1975         [  --with-prngd-port=PORT  read entropy from PRNGD/EGD TCP localhost:PORT],
1976         [
1977                 case "$withval" in
1978                 no)
1979                         withval=""
1980                         ;;
1981                 [[0-9]]*)
1982                         ;;
1983                 *)
1984                         AC_MSG_ERROR(You must specify a numeric port number for --with-prngd-port)
1985                         ;;
1986                 esac
1987                 if test ! -z "$withval" ; then
1988                         PRNGD_PORT="$withval"
1989                         AC_DEFINE_UNQUOTED(PRNGD_PORT, $PRNGD_PORT,
1990                                 [Port number of PRNGD/EGD random number socket])
1991                 fi
1992         ]
1993 )
1994
1995 # PRNGD Unix domain socket
1996 AC_ARG_WITH(prngd-socket,
1997         [  --with-prngd-socket=FILE read entropy from PRNGD/EGD socket FILE (default=/var/run/egd-pool)],
1998         [
1999                 case "$withval" in
2000                 yes)
2001                         withval="/var/run/egd-pool"
2002                         ;;
2003                 no)
2004                         withval=""
2005                         ;;
2006                 /*)
2007                         ;;
2008                 *)
2009                         AC_MSG_ERROR(You must specify an absolute path to the entropy socket)
2010                         ;;
2011                 esac
2012
2013                 if test ! -z "$withval" ; then
2014                         if test ! -z "$PRNGD_PORT" ; then
2015                                 AC_MSG_ERROR(You may not specify both a PRNGD/EGD port and socket)
2016                         fi
2017                         if test ! -r "$withval" ; then
2018                                 AC_MSG_WARN(Entropy socket is not readable)
2019                         fi
2020                         PRNGD_SOCKET="$withval"
2021                         AC_DEFINE_UNQUOTED(PRNGD_SOCKET, "$PRNGD_SOCKET",
2022                                 [Location of PRNGD/EGD random number socket])
2023                 fi
2024         ],
2025         [
2026                 # Check for existing socket only if we don't have a random device already
2027                 if test "$USE_RAND_HELPER" = yes ; then
2028                         AC_MSG_CHECKING(for PRNGD/EGD socket)
2029                         # Insert other locations here
2030                         for sock in /var/run/egd-pool /dev/egd-pool /etc/entropy; do
2031                                 if test -r $sock && $TEST_MINUS_S_SH -c "test -S $sock -o -p $sock" ; then
2032                                         PRNGD_SOCKET="$sock"
2033                                         AC_DEFINE_UNQUOTED(PRNGD_SOCKET, "$PRNGD_SOCKET")
2034                                         break;
2035                                 fi
2036                         done
2037                         if test ! -z "$PRNGD_SOCKET" ; then
2038                                 AC_MSG_RESULT($PRNGD_SOCKET)
2039                         else
2040                                 AC_MSG_RESULT(not found)
2041                         fi
2042                 fi
2043         ]
2044 )
2045
2046 # Change default command timeout for hashing entropy source
2047 entropy_timeout=200
2048 AC_ARG_WITH(entropy-timeout,
2049         [  --with-entropy-timeout  Specify entropy gathering command timeout (msec)],
2050         [
2051                 if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
2052                     test "x${withval}" != "xyes"; then
2053                         entropy_timeout=$withval
2054                 fi
2055         ]
2056 )
2057 AC_DEFINE_UNQUOTED(ENTROPY_TIMEOUT_MSEC, $entropy_timeout,
2058         [Builtin PRNG command timeout])
2059
2060 SSH_PRIVSEP_USER=sshd
2061 AC_ARG_WITH(privsep-user,
2062         [  --with-privsep-user=user Specify non-privileged user for privilege separation],
2063         [
2064                 if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
2065                     test "x${withval}" != "xyes"; then
2066                         SSH_PRIVSEP_USER=$withval
2067                 fi
2068         ]
2069 )
2070 AC_DEFINE_UNQUOTED(SSH_PRIVSEP_USER, "$SSH_PRIVSEP_USER",
2071         [non-privileged user for privilege separation])
2072 AC_SUBST(SSH_PRIVSEP_USER)
2073
2074 # We do this little dance with the search path to insure
2075 # that programs that we select for use by installed programs
2076 # (which may be run by the super-user) come from trusted
2077 # locations before they come from the user's private area.
2078 # This should help avoid accidentally configuring some
2079 # random version of a program in someone's personal bin.
2080
2081 OPATH=$PATH
2082 PATH=/bin:/usr/bin
2083 test -h /bin 2> /dev/null && PATH=/usr/bin
2084 test -d /sbin && PATH=$PATH:/sbin
2085 test -d /usr/sbin && PATH=$PATH:/usr/sbin
2086 PATH=$PATH:/etc:$OPATH
2087
2088 # These programs are used by the command hashing source to gather entropy
2089 OSSH_PATH_ENTROPY_PROG(PROG_LS, ls)
2090 OSSH_PATH_ENTROPY_PROG(PROG_NETSTAT, netstat)
2091 OSSH_PATH_ENTROPY_PROG(PROG_ARP, arp)
2092 OSSH_PATH_ENTROPY_PROG(PROG_IFCONFIG, ifconfig)
2093 OSSH_PATH_ENTROPY_PROG(PROG_JSTAT, jstat)
2094 OSSH_PATH_ENTROPY_PROG(PROG_PS, ps)
2095 OSSH_PATH_ENTROPY_PROG(PROG_SAR, sar)
2096 OSSH_PATH_ENTROPY_PROG(PROG_W, w)
2097 OSSH_PATH_ENTROPY_PROG(PROG_WHO, who)
2098 OSSH_PATH_ENTROPY_PROG(PROG_LAST, last)
2099 OSSH_PATH_ENTROPY_PROG(PROG_LASTLOG, lastlog)
2100 OSSH_PATH_ENTROPY_PROG(PROG_DF, df)
2101 OSSH_PATH_ENTROPY_PROG(PROG_VMSTAT, vmstat)
2102 OSSH_PATH_ENTROPY_PROG(PROG_UPTIME, uptime)
2103 OSSH_PATH_ENTROPY_PROG(PROG_IPCS, ipcs)
2104 OSSH_PATH_ENTROPY_PROG(PROG_TAIL, tail)
2105 # restore PATH
2106 PATH=$OPATH
2107
2108 # Where does ssh-rand-helper get its randomness from?
2109 INSTALL_SSH_PRNG_CMDS=""
2110 if test ! -z "$INSTALL_SSH_RAND_HELPER" ; then
2111         if test ! -z "$PRNGD_PORT" ; then
2112                 RAND_HELPER_MSG="TCP localhost:$PRNGD_PORT"
2113         elif test ! -z "$PRNGD_SOCKET" ; then
2114                 RAND_HELPER_MSG="Unix domain socket \"$PRNGD_SOCKET\""
2115         else
2116                 RAND_HELPER_MSG="Command hashing (timeout $entropy_timeout)"
2117                 RAND_HELPER_CMDHASH=yes
2118                 INSTALL_SSH_PRNG_CMDS="yes"
2119         fi
2120 fi
2121 AC_SUBST(INSTALL_SSH_PRNG_CMDS)
2122
2123
2124 # Cheap hack to ensure NEWS-OS libraries are arranged right.
2125 if test ! -z "$SONY" ; then
2126   LIBS="$LIBS -liberty";
2127 fi
2128
2129 # Check for  long long datatypes
2130 AC_CHECK_TYPES([long long, unsigned long long, long double])
2131
2132 # Check datatype sizes
2133 AC_CHECK_SIZEOF(char, 1)
2134 AC_CHECK_SIZEOF(short int, 2)
2135 AC_CHECK_SIZEOF(int, 4)
2136 AC_CHECK_SIZEOF(long int, 4)
2137 AC_CHECK_SIZEOF(long long int, 8)
2138
2139 # Sanity check long long for some platforms (AIX)
2140 if test "x$ac_cv_sizeof_long_long_int" = "x4" ; then
2141         ac_cv_sizeof_long_long_int=0
2142 fi
2143
2144 # compute LLONG_MIN and LLONG_MAX if we don't know them.
2145 if test -z "$have_llong_max"; then
2146         AC_MSG_CHECKING([for max value of long long])
2147         AC_RUN_IFELSE(
2148                 [AC_LANG_SOURCE([[
2149 #include <stdio.h>
2150 /* Why is this so damn hard? */
2151 #ifdef __GNUC__
2152 # undef __GNUC__
2153 #endif
2154 #define __USE_ISOC99
2155 #include <limits.h>
2156 #define DATA "conftest.llminmax"
2157 #define my_abs(a) ((a) < 0 ? ((a) * -1) : (a))
2158
2159 /*
2160  * printf in libc on some platforms (eg old Tru64) does not understand %lld so
2161  * we do this the hard way.
2162  */
2163 static int
2164 fprint_ll(FILE *f, long long n)
2165 {
2166         unsigned int i;
2167         int l[sizeof(long long) * 8];
2168
2169         if (n < 0)
2170                 if (fprintf(f, "-") < 0)
2171                         return -1;
2172         for (i = 0; n != 0; i++) {
2173                 l[i] = my_abs(n % 10);
2174                 n /= 10;
2175         }
2176         do {
2177                 if (fprintf(f, "%d", l[--i]) < 0)
2178                         return -1;
2179         } while (i != 0);
2180         if (fprintf(f, " ") < 0)
2181                 return -1;
2182         return 0;
2183 }
2184
2185 int main(void) {
2186         FILE *f;
2187         long long i, llmin, llmax = 0;
2188
2189         if((f = fopen(DATA,"w")) == NULL)
2190                 exit(1);
2191
2192 #if defined(LLONG_MIN) && defined(LLONG_MAX)
2193         fprintf(stderr, "Using system header for LLONG_MIN and LLONG_MAX\n");
2194         llmin = LLONG_MIN;
2195         llmax = LLONG_MAX;
2196 #else
2197         fprintf(stderr, "Calculating  LLONG_MIN and LLONG_MAX\n");
2198         /* This will work on one's complement and two's complement */
2199         for (i = 1; i > llmax; i <<= 1, i++)
2200                 llmax = i;
2201         llmin = llmax + 1LL;    /* wrap */
2202 #endif
2203
2204         /* Sanity check */
2205         if (llmin + 1 < llmin || llmin - 1 < llmin || llmax + 1 > llmax
2206             || llmax - 1 > llmax || llmin == llmax || llmin == 0
2207             || llmax == 0 || llmax < LONG_MAX || llmin > LONG_MIN) {
2208                 fprintf(f, "unknown unknown\n");
2209                 exit(2);
2210         }
2211
2212         if (fprint_ll(f, llmin) < 0)
2213                 exit(3);
2214         if (fprint_ll(f, llmax) < 0)
2215                 exit(4);
2216         if (fclose(f) < 0)
2217                 exit(5);
2218         exit(0);
2219 }
2220                 ]])],
2221                 [
2222                         llong_min=`$AWK '{print $1}' conftest.llminmax`
2223                         llong_max=`$AWK '{print $2}' conftest.llminmax`
2224
2225                         AC_MSG_RESULT($llong_max)
2226                         AC_DEFINE_UNQUOTED(LLONG_MAX, [${llong_max}LL],
2227                             [max value of long long calculated by configure])
2228                         AC_MSG_CHECKING([for min value of long long])
2229                         AC_MSG_RESULT($llong_min)
2230                         AC_DEFINE_UNQUOTED(LLONG_MIN, [${llong_min}LL],
2231                             [min value of long long calculated by configure])
2232                 ],
2233                 [
2234                         AC_MSG_RESULT(not found)
2235                 ],
2236                 [
2237                         AC_MSG_WARN([cross compiling: not checking])
2238                 ]
2239         )
2240 fi
2241
2242
2243 # More checks for data types
2244 AC_CACHE_CHECK([for u_int type], ac_cv_have_u_int, [
2245         AC_TRY_COMPILE(
2246                 [ #include <sys/types.h> ],
2247                 [ u_int a; a = 1;],
2248                 [ ac_cv_have_u_int="yes" ],
2249                 [ ac_cv_have_u_int="no" ]
2250         )
2251 ])
2252 if test "x$ac_cv_have_u_int" = "xyes" ; then
2253         AC_DEFINE(HAVE_U_INT, 1, [define if you have u_int data type])
2254         have_u_int=1
2255 fi
2256
2257 AC_CACHE_CHECK([for intXX_t types], ac_cv_have_intxx_t, [
2258         AC_TRY_COMPILE(
2259                 [ #include <sys/types.h> ],
2260                 [ int8_t a; int16_t b; int32_t c; a = b = c = 1;],
2261                 [ ac_cv_have_intxx_t="yes" ],
2262                 [ ac_cv_have_intxx_t="no" ]
2263         )
2264 ])
2265 if test "x$ac_cv_have_intxx_t" = "xyes" ; then
2266         AC_DEFINE(HAVE_INTXX_T, 1, [define if you have intxx_t data type])
2267         have_intxx_t=1
2268 fi
2269
2270 if (test -z "$have_intxx_t" && \
2271            test "x$ac_cv_header_stdint_h" = "xyes")
2272 then
2273     AC_MSG_CHECKING([for intXX_t types in stdint.h])
2274         AC_TRY_COMPILE(
2275                 [ #include <stdint.h> ],
2276                 [ int8_t a; int16_t b; int32_t c; a = b = c = 1;],
2277                 [
2278                         AC_DEFINE(HAVE_INTXX_T)
2279                         AC_MSG_RESULT(yes)
2280                 ],
2281                 [ AC_MSG_RESULT(no) ]
2282         )
2283 fi
2284
2285 AC_CACHE_CHECK([for int64_t type], ac_cv_have_int64_t, [
2286         AC_TRY_COMPILE(
2287                 [
2288 #include <sys/types.h>
2289 #ifdef HAVE_STDINT_H
2290 # include <stdint.h>
2291 #endif
2292 #include <sys/socket.h>
2293 #ifdef HAVE_SYS_BITYPES_H
2294 # include <sys/bitypes.h>
2295 #endif
2296                 ],
2297                 [ int64_t a; a = 1;],
2298                 [ ac_cv_have_int64_t="yes" ],
2299                 [ ac_cv_have_int64_t="no" ]
2300         )
2301 ])
2302 if test "x$ac_cv_have_int64_t" = "xyes" ; then
2303         AC_DEFINE(HAVE_INT64_T, 1, [define if you have int64_t data type])
2304 fi
2305
2306 AC_CACHE_CHECK([for u_intXX_t types], ac_cv_have_u_intxx_t, [
2307         AC_TRY_COMPILE(
2308                 [ #include <sys/types.h> ],
2309                 [ u_int8_t a; u_int16_t b; u_int32_t c; a = b = c = 1;],
2310                 [ ac_cv_have_u_intxx_t="yes" ],
2311                 [ ac_cv_have_u_intxx_t="no" ]
2312         )
2313 ])
2314 if test "x$ac_cv_have_u_intxx_t" = "xyes" ; then
2315         AC_DEFINE(HAVE_U_INTXX_T, 1, [define if you have u_intxx_t data type])
2316         have_u_intxx_t=1
2317 fi
2318
2319 if test -z "$have_u_intxx_t" ; then
2320     AC_MSG_CHECKING([for u_intXX_t types in sys/socket.h])
2321         AC_TRY_COMPILE(
2322                 [ #include <sys/socket.h> ],
2323                 [ u_int8_t a; u_int16_t b; u_int32_t c; a = b = c = 1;],
2324                 [
2325                         AC_DEFINE(HAVE_U_INTXX_T)
2326                         AC_MSG_RESULT(yes)
2327                 ],
2328                 [ AC_MSG_RESULT(no) ]
2329         )
2330 fi
2331
2332 AC_CACHE_CHECK([for u_int64_t types], ac_cv_have_u_int64_t, [
2333         AC_TRY_COMPILE(
2334                 [ #include <sys/types.h> ],
2335                 [ u_int64_t a; a = 1;],
2336                 [ ac_cv_have_u_int64_t="yes" ],
2337                 [ ac_cv_have_u_int64_t="no" ]
2338         )
2339 ])
2340 if test "x$ac_cv_have_u_int64_t" = "xyes" ; then
2341         AC_DEFINE(HAVE_U_INT64_T, 1, [define if you have u_int64_t data type])
2342         have_u_int64_t=1
2343 fi
2344
2345 if test -z "$have_u_int64_t" ; then
2346     AC_MSG_CHECKING([for u_int64_t type in sys/bitypes.h])
2347         AC_TRY_COMPILE(
2348                 [ #include <sys/bitypes.h> ],
2349                 [ u_int64_t a; a = 1],
2350                 [
2351                         AC_DEFINE(HAVE_U_INT64_T)
2352                         AC_MSG_RESULT(yes)
2353                 ],
2354                 [ AC_MSG_RESULT(no) ]
2355         )
2356 fi
2357
2358 if test -z "$have_u_intxx_t" ; then
2359         AC_CACHE_CHECK([for uintXX_t types], ac_cv_have_uintxx_t, [
2360                 AC_TRY_COMPILE(
2361                         [
2362 #include <sys/types.h>
2363                         ],
2364                         [ uint8_t a; uint16_t b; uint32_t c; a = b = c = 1; ],
2365                         [ ac_cv_have_uintxx_t="yes" ],
2366                         [ ac_cv_have_uintxx_t="no" ]
2367                 )
2368         ])
2369         if test "x$ac_cv_have_uintxx_t" = "xyes" ; then
2370                 AC_DEFINE(HAVE_UINTXX_T, 1,
2371                         [define if you have uintxx_t data type])
2372         fi
2373 fi
2374
2375 if test -z "$have_uintxx_t" ; then
2376     AC_MSG_CHECKING([for uintXX_t types in stdint.h])
2377         AC_TRY_COMPILE(
2378                 [ #include <stdint.h> ],
2379                 [ uint8_t a; uint16_t b; uint32_t c; a = b = c = 1;],
2380                 [
2381                         AC_DEFINE(HAVE_UINTXX_T)
2382                         AC_MSG_RESULT(yes)
2383                 ],
2384                 [ AC_MSG_RESULT(no) ]
2385         )
2386 fi
2387
2388 if (test -z "$have_u_intxx_t" || test -z "$have_intxx_t" && \
2389            test "x$ac_cv_header_sys_bitypes_h" = "xyes")
2390 then
2391         AC_MSG_CHECKING([for intXX_t and u_intXX_t types in sys/bitypes.h])
2392         AC_TRY_COMPILE(
2393                 [
2394 #include <sys/bitypes.h>
2395                 ],
2396                 [
2397                         int8_t a; int16_t b; int32_t c;
2398                         u_int8_t e; u_int16_t f; u_int32_t g;
2399                         a = b = c = e = f = g = 1;
2400                 ],
2401                 [
2402                         AC_DEFINE(HAVE_U_INTXX_T)
2403                         AC_DEFINE(HAVE_INTXX_T)
2404                         AC_MSG_RESULT(yes)
2405                 ],
2406                 [AC_MSG_RESULT(no)]
2407         )
2408 fi
2409
2410
2411 AC_CACHE_CHECK([for u_char], ac_cv_have_u_char, [
2412         AC_TRY_COMPILE(
2413                 [
2414 #include <sys/types.h>
2415                 ],
2416                 [ u_char foo; foo = 125; ],
2417                 [ ac_cv_have_u_char="yes" ],
2418                 [ ac_cv_have_u_char="no" ]
2419         )
2420 ])
2421 if test "x$ac_cv_have_u_char" = "xyes" ; then
2422         AC_DEFINE(HAVE_U_CHAR, 1, [define if you have u_char data type])
2423 fi
2424
2425 TYPE_SOCKLEN_T
2426
2427 AC_CHECK_TYPES(sig_atomic_t,,,[#include <signal.h>])
2428
2429 AC_CHECK_TYPES(in_addr_t,,,
2430 [#include <sys/types.h>
2431 #include <netinet/in.h>])
2432
2433 AC_CACHE_CHECK([for size_t], ac_cv_have_size_t, [
2434         AC_TRY_COMPILE(
2435                 [
2436 #include <sys/types.h>
2437                 ],
2438                 [ size_t foo; foo = 1235; ],
2439                 [ ac_cv_have_size_t="yes" ],
2440                 [ ac_cv_have_size_t="no" ]
2441         )
2442 ])
2443 if test "x$ac_cv_have_size_t" = "xyes" ; then
2444         AC_DEFINE(HAVE_SIZE_T, 1, [define if you have size_t data type])
2445 fi
2446
2447 AC_CACHE_CHECK([for ssize_t], ac_cv_have_ssize_t, [
2448         AC_TRY_COMPILE(
2449                 [
2450 #include <sys/types.h>
2451                 ],
2452                 [ ssize_t foo; foo = 1235; ],
2453                 [ ac_cv_have_ssize_t="yes" ],
2454                 [ ac_cv_have_ssize_t="no" ]
2455         )
2456 ])
2457 if test "x$ac_cv_have_ssize_t" = "xyes" ; then
2458         AC_DEFINE(HAVE_SSIZE_T, 1, [define if you have ssize_t data type])
2459 fi
2460
2461 AC_CACHE_CHECK([for clock_t], ac_cv_have_clock_t, [
2462         AC_TRY_COMPILE(
2463                 [
2464 #include <time.h>
2465                 ],
2466                 [ clock_t foo; foo = 1235; ],
2467                 [ ac_cv_have_clock_t="yes" ],
2468                 [ ac_cv_have_clock_t="no" ]
2469         )
2470 ])
2471 if test "x$ac_cv_have_clock_t" = "xyes" ; then
2472         AC_DEFINE(HAVE_CLOCK_T, 1, [define if you have clock_t data type])
2473 fi
2474
2475 AC_CACHE_CHECK([for sa_family_t], ac_cv_have_sa_family_t, [
2476         AC_TRY_COMPILE(
2477                 [
2478 #include <sys/types.h>
2479 #include <sys/socket.h>
2480                 ],
2481                 [ sa_family_t foo; foo = 1235; ],
2482                 [ ac_cv_have_sa_family_t="yes" ],
2483                 [ AC_TRY_COMPILE(
2484                   [
2485 #include <sys/types.h>
2486 #include <sys/socket.h>
2487 #include <netinet/in.h>
2488                 ],
2489                 [ sa_family_t foo; foo = 1235; ],
2490                 [ ac_cv_have_sa_family_t="yes" ],
2491
2492                 [ ac_cv_have_sa_family_t="no" ]
2493         )]
2494         )
2495 ])
2496 if test "x$ac_cv_have_sa_family_t" = "xyes" ; then
2497         AC_DEFINE(HAVE_SA_FAMILY_T, 1,
2498                 [define if you have sa_family_t data type])
2499 fi
2500
2501 AC_CACHE_CHECK([for pid_t], ac_cv_have_pid_t, [
2502         AC_TRY_COMPILE(
2503                 [
2504 #include <sys/types.h>
2505                 ],
2506                 [ pid_t foo; foo = 1235; ],
2507                 [ ac_cv_have_pid_t="yes" ],
2508                 [ ac_cv_have_pid_t="no" ]
2509         )
2510 ])
2511 if test "x$ac_cv_have_pid_t" = "xyes" ; then
2512         AC_DEFINE(HAVE_PID_T, 1, [define if you have pid_t data type])
2513 fi
2514
2515 AC_CACHE_CHECK([for mode_t], ac_cv_have_mode_t, [
2516         AC_TRY_COMPILE(
2517                 [
2518 #include <sys/types.h>
2519                 ],
2520                 [ mode_t foo; foo = 1235; ],
2521                 [ ac_cv_have_mode_t="yes" ],
2522                 [ ac_cv_have_mode_t="no" ]
2523         )
2524 ])
2525 if test "x$ac_cv_have_mode_t" = "xyes" ; then
2526         AC_DEFINE(HAVE_MODE_T, 1, [define if you have mode_t data type])
2527 fi
2528
2529
2530 AC_CACHE_CHECK([for struct sockaddr_storage], ac_cv_have_struct_sockaddr_storage, [
2531         AC_TRY_COMPILE(
2532                 [
2533 #include <sys/types.h>
2534 #include <sys/socket.h>
2535                 ],
2536                 [ struct sockaddr_storage s; ],
2537                 [ ac_cv_have_struct_sockaddr_storage="yes" ],
2538                 [ ac_cv_have_struct_sockaddr_storage="no" ]
2539         )
2540 ])
2541 if test "x$ac_cv_have_struct_sockaddr_storage" = "xyes" ; then
2542         AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE, 1,
2543                 [define if you have struct sockaddr_storage data type])
2544 fi
2545
2546 AC_CACHE_CHECK([for struct sockaddr_in6], ac_cv_have_struct_sockaddr_in6, [
2547         AC_TRY_COMPILE(
2548                 [
2549 #include <sys/types.h>
2550 #include <netinet/in.h>
2551                 ],
2552                 [ struct sockaddr_in6 s; s.sin6_family = 0; ],
2553                 [ ac_cv_have_struct_sockaddr_in6="yes" ],
2554                 [ ac_cv_have_struct_sockaddr_in6="no" ]
2555         )
2556 ])
2557 if test "x$ac_cv_have_struct_sockaddr_in6" = "xyes" ; then
2558         AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6, 1,
2559                 [define if you have struct sockaddr_in6 data type])
2560 fi
2561
2562 AC_CACHE_CHECK([for struct in6_addr], ac_cv_have_struct_in6_addr, [
2563         AC_TRY_COMPILE(
2564                 [
2565 #include <sys/types.h>
2566 #include <netinet/in.h>
2567                 ],
2568                 [ struct in6_addr s; s.s6_addr[0] = 0; ],
2569                 [ ac_cv_have_struct_in6_addr="yes" ],
2570                 [ ac_cv_have_struct_in6_addr="no" ]
2571         )
2572 ])
2573 if test "x$ac_cv_have_struct_in6_addr" = "xyes" ; then
2574         AC_DEFINE(HAVE_STRUCT_IN6_ADDR, 1,
2575                 [define if you have struct in6_addr data type])
2576 fi
2577
2578 AC_CACHE_CHECK([for struct addrinfo], ac_cv_have_struct_addrinfo, [
2579         AC_TRY_COMPILE(
2580                 [
2581 #include <sys/types.h>
2582 #include <sys/socket.h>
2583 #include <netdb.h>
2584                 ],
2585                 [ struct addrinfo s; s.ai_flags = AI_PASSIVE; ],
2586                 [ ac_cv_have_struct_addrinfo="yes" ],
2587                 [ ac_cv_have_struct_addrinfo="no" ]
2588         )
2589 ])
2590 if test "x$ac_cv_have_struct_addrinfo" = "xyes" ; then
2591         AC_DEFINE(HAVE_STRUCT_ADDRINFO, 1,
2592                 [define if you have struct addrinfo data type])
2593 fi
2594
2595 AC_CACHE_CHECK([for struct timeval], ac_cv_have_struct_timeval, [
2596         AC_TRY_COMPILE(
2597                 [ #include <sys/time.h> ],
2598                 [ struct timeval tv; tv.tv_sec = 1;],
2599                 [ ac_cv_have_struct_timeval="yes" ],
2600                 [ ac_cv_have_struct_timeval="no" ]
2601         )
2602 ])
2603 if test "x$ac_cv_have_struct_timeval" = "xyes" ; then
2604         AC_DEFINE(HAVE_STRUCT_TIMEVAL, 1, [define if you have struct timeval])
2605         have_struct_timeval=1
2606 fi
2607
2608 AC_CHECK_TYPES(struct timespec)
2609
2610 # We need int64_t or else certian parts of the compile will fail.
2611 if test "x$ac_cv_have_int64_t" = "xno" && \
2612         test "x$ac_cv_sizeof_long_int" != "x8" && \
2613         test "x$ac_cv_sizeof_long_long_int" = "x0" ; then
2614         echo "OpenSSH requires int64_t support.  Contact your vendor or install"
2615         echo "an alternative compiler (I.E., GCC) before continuing."
2616         echo ""
2617         exit 1;
2618 else
2619 dnl test snprintf (broken on SCO w/gcc)
2620         AC_RUN_IFELSE(
2621                 [AC_LANG_SOURCE([[
2622 #include <stdio.h>
2623 #include <string.h>
2624 #ifdef HAVE_SNPRINTF
2625 main()
2626 {
2627         char buf[50];
2628         char expected_out[50];
2629         int mazsize = 50 ;
2630 #if (SIZEOF_LONG_INT == 8)
2631         long int num = 0x7fffffffffffffff;
2632 #else
2633         long long num = 0x7fffffffffffffffll;
2634 #endif
2635         strcpy(expected_out, "9223372036854775807");
2636         snprintf(buf, mazsize, "%lld", num);
2637         if(strcmp(buf, expected_out) != 0)
2638                 exit(1);
2639         exit(0);
2640 }
2641 #else
2642 main() { exit(0); }
2643 #endif
2644                 ]])], [ true ], [ AC_DEFINE(BROKEN_SNPRINTF) ],
2645                 AC_MSG_WARN([cross compiling: Assuming working snprintf()])
2646         )
2647 fi
2648
2649 dnl Checks for structure members
2650 OSSH_CHECK_HEADER_FOR_FIELD(ut_host, utmp.h, HAVE_HOST_IN_UTMP)
2651 OSSH_CHECK_HEADER_FOR_FIELD(ut_host, utmpx.h, HAVE_HOST_IN_UTMPX)
2652 OSSH_CHECK_HEADER_FOR_FIELD(syslen, utmpx.h, HAVE_SYSLEN_IN_UTMPX)
2653 OSSH_CHECK_HEADER_FOR_FIELD(ut_pid, utmp.h, HAVE_PID_IN_UTMP)
2654 OSSH_CHECK_HEADER_FOR_FIELD(ut_type, utmp.h, HAVE_TYPE_IN_UTMP)
2655 OSSH_CHECK_HEADER_FOR_FIELD(ut_type, utmpx.h, HAVE_TYPE_IN_UTMPX)
2656 OSSH_CHECK_HEADER_FOR_FIELD(ut_tv, utmp.h, HAVE_TV_IN_UTMP)
2657 OSSH_CHECK_HEADER_FOR_FIELD(ut_id, utmp.h, HAVE_ID_IN_UTMP)
2658 OSSH_CHECK_HEADER_FOR_FIELD(ut_id, utmpx.h, HAVE_ID_IN_UTMPX)
2659 OSSH_CHECK_HEADER_FOR_FIELD(ut_addr, utmp.h, HAVE_ADDR_IN_UTMP)
2660 OSSH_CHECK_HEADER_FOR_FIELD(ut_addr, utmpx.h, HAVE_ADDR_IN_UTMPX)
2661 OSSH_CHECK_HEADER_FOR_FIELD(ut_addr_v6, utmp.h, HAVE_ADDR_V6_IN_UTMP)
2662 OSSH_CHECK_HEADER_FOR_FIELD(ut_addr_v6, utmpx.h, HAVE_ADDR_V6_IN_UTMPX)
2663 OSSH_CHECK_HEADER_FOR_FIELD(ut_exit, utmp.h, HAVE_EXIT_IN_UTMP)
2664 OSSH_CHECK_HEADER_FOR_FIELD(ut_time, utmp.h, HAVE_TIME_IN_UTMP)
2665 OSSH_CHECK_HEADER_FOR_FIELD(ut_time, utmpx.h, HAVE_TIME_IN_UTMPX)
2666 OSSH_CHECK_HEADER_FOR_FIELD(ut_tv, utmpx.h, HAVE_TV_IN_UTMPX)
2667
2668 AC_CHECK_MEMBERS([struct stat.st_blksize])
2669 AC_CHECK_MEMBER([struct __res_state.retrans], [], [AC_DEFINE(__res_state, state,
2670         [Define if we don't have struct __res_state in resolv.h])],
2671 [
2672 #include <stdio.h>
2673 #if HAVE_SYS_TYPES_H
2674 # include <sys/types.h>
2675 #endif
2676 #include <netinet/in.h>
2677 #include <arpa/nameser.h>
2678 #include <resolv.h>
2679 ])
2680
2681 AC_CACHE_CHECK([for ss_family field in struct sockaddr_storage],
2682                 ac_cv_have_ss_family_in_struct_ss, [
2683         AC_TRY_COMPILE(
2684                 [
2685 #include <sys/types.h>
2686 #include <sys/socket.h>
2687                 ],
2688                 [ struct sockaddr_storage s; s.ss_family = 1; ],
2689                 [ ac_cv_have_ss_family_in_struct_ss="yes" ],
2690                 [ ac_cv_have_ss_family_in_struct_ss="no" ],
2691         )
2692 ])
2693 if test "x$ac_cv_have_ss_family_in_struct_ss" = "xyes" ; then
2694         AC_DEFINE(HAVE_SS_FAMILY_IN_SS, 1, [Fields in struct sockaddr_storage])
2695 fi
2696
2697 AC_CACHE_CHECK([for __ss_family field in struct sockaddr_storage],
2698                 ac_cv_have___ss_family_in_struct_ss, [
2699         AC_TRY_COMPILE(
2700                 [
2701 #include <sys/types.h>
2702 #include <sys/socket.h>
2703                 ],
2704                 [ struct sockaddr_storage s; s.__ss_family = 1; ],
2705                 [ ac_cv_have___ss_family_in_struct_ss="yes" ],
2706                 [ ac_cv_have___ss_family_in_struct_ss="no" ]
2707         )
2708 ])
2709 if test "x$ac_cv_have___ss_family_in_struct_ss" = "xyes" ; then
2710         AC_DEFINE(HAVE___SS_FAMILY_IN_SS, 1,
2711                 [Fields in struct sockaddr_storage])
2712 fi
2713
2714 AC_CACHE_CHECK([for pw_class field in struct passwd],
2715                 ac_cv_have_pw_class_in_struct_passwd, [
2716         AC_TRY_COMPILE(
2717                 [
2718 #include <pwd.h>
2719                 ],
2720                 [ struct passwd p; p.pw_class = 0; ],
2721                 [ ac_cv_have_pw_class_in_struct_passwd="yes" ],
2722                 [ ac_cv_have_pw_class_in_struct_passwd="no" ]
2723         )
2724 ])
2725 if test "x$ac_cv_have_pw_class_in_struct_passwd" = "xyes" ; then
2726         AC_DEFINE(HAVE_PW_CLASS_IN_PASSWD, 1,
2727                 [Define if your password has a pw_class field])
2728 fi
2729
2730 AC_CACHE_CHECK([for pw_expire field in struct passwd],
2731                 ac_cv_have_pw_expire_in_struct_passwd, [
2732         AC_TRY_COMPILE(
2733                 [
2734 #include <pwd.h>
2735                 ],
2736                 [ struct passwd p; p.pw_expire = 0; ],
2737                 [ ac_cv_have_pw_expire_in_struct_passwd="yes" ],
2738                 [ ac_cv_have_pw_expire_in_struct_passwd="no" ]
2739         )
2740 ])
2741 if test "x$ac_cv_have_pw_expire_in_struct_passwd" = "xyes" ; then
2742         AC_DEFINE(HAVE_PW_EXPIRE_IN_PASSWD, 1,
2743                 [Define if your password has a pw_expire field])
2744 fi
2745
2746 AC_CACHE_CHECK([for pw_change field in struct passwd],
2747                 ac_cv_have_pw_change_in_struct_passwd, [
2748         AC_TRY_COMPILE(
2749                 [
2750 #include <pwd.h>
2751                 ],
2752                 [ struct passwd p; p.pw_change = 0; ],
2753                 [ ac_cv_have_pw_change_in_struct_passwd="yes" ],
2754                 [ ac_cv_have_pw_change_in_struct_passwd="no" ]
2755         )
2756 ])
2757 if test "x$ac_cv_have_pw_change_in_struct_passwd" = "xyes" ; then
2758         AC_DEFINE(HAVE_PW_CHANGE_IN_PASSWD, 1,
2759                 [Define if your password has a pw_change field])
2760 fi
2761
2762 dnl make sure we're using the real structure members and not defines
2763 AC_CACHE_CHECK([for msg_accrights field in struct msghdr],
2764                 ac_cv_have_accrights_in_msghdr, [
2765         AC_COMPILE_IFELSE(
2766                 [
2767 #include <sys/types.h>
2768 #include <sys/socket.h>
2769 #include <sys/uio.h>
2770 int main() {
2771 #ifdef msg_accrights
2772 #error "msg_accrights is a macro"
2773 exit(1);
2774 #endif
2775 struct msghdr m;
2776 m.msg_accrights = 0;
2777 exit(0);
2778 }
2779                 ],
2780                 [ ac_cv_have_accrights_in_msghdr="yes" ],
2781                 [ ac_cv_have_accrights_in_msghdr="no" ]
2782         )
2783 ])
2784 if test "x$ac_cv_have_accrights_in_msghdr" = "xyes" ; then
2785         AC_DEFINE(HAVE_ACCRIGHTS_IN_MSGHDR, 1,
2786                 [Define if your system uses access rights style
2787                 file descriptor passing])
2788 fi
2789
2790 AC_CACHE_CHECK([for msg_control field in struct msghdr],
2791                 ac_cv_have_control_in_msghdr, [
2792         AC_COMPILE_IFELSE(
2793                 [
2794 #include <sys/types.h>
2795 #include <sys/socket.h>
2796 #include <sys/uio.h>
2797 int main() {
2798 #ifdef msg_control
2799 #error "msg_control is a macro"
2800 exit(1);
2801 #endif
2802 struct msghdr m;
2803 m.msg_control = 0;
2804 exit(0);
2805 }
2806                 ],
2807                 [ ac_cv_have_control_in_msghdr="yes" ],
2808                 [ ac_cv_have_control_in_msghdr="no" ]
2809         )
2810 ])
2811 if test "x$ac_cv_have_control_in_msghdr" = "xyes" ; then
2812         AC_DEFINE(HAVE_CONTROL_IN_MSGHDR, 1,
2813                 [Define if your system uses ancillary data style
2814                 file descriptor passing])
2815 fi
2816
2817 AC_CACHE_CHECK([if libc defines __progname], ac_cv_libc_defines___progname, [
2818         AC_TRY_LINK([],
2819                 [ extern char *__progname; printf("%s", __progname); ],
2820                 [ ac_cv_libc_defines___progname="yes" ],
2821                 [ ac_cv_libc_defines___progname="no" ]
2822         )
2823 ])
2824 if test "x$ac_cv_libc_defines___progname" = "xyes" ; then
2825         AC_DEFINE(HAVE___PROGNAME, 1, [Define if libc defines __progname])
2826 fi
2827
2828 AC_CACHE_CHECK([whether $CC implements __FUNCTION__], ac_cv_cc_implements___FUNCTION__, [
2829         AC_TRY_LINK([
2830 #include <stdio.h>
2831 ],
2832                 [ printf("%s", __FUNCTION__); ],
2833                 [ ac_cv_cc_implements___FUNCTION__="yes" ],
2834                 [ ac_cv_cc_implements___FUNCTION__="no" ]
2835         )
2836 ])
2837 if test "x$ac_cv_cc_implements___FUNCTION__" = "xyes" ; then
2838         AC_DEFINE(HAVE___FUNCTION__, 1,
2839                 [Define if compiler implements __FUNCTION__])
2840 fi
2841
2842 AC_CACHE_CHECK([whether $CC implements __func__], ac_cv_cc_implements___func__, [
2843         AC_TRY_LINK([
2844 #include <stdio.h>
2845 ],
2846                 [ printf("%s", __func__); ],
2847                 [ ac_cv_cc_implements___func__="yes" ],
2848                 [ ac_cv_cc_implements___func__="no" ]
2849         )
2850 ])
2851 if test "x$ac_cv_cc_implements___func__" = "xyes" ; then
2852         AC_DEFINE(HAVE___func__, 1, [Define if compiler implements __func__])
2853 fi
2854
2855 AC_CACHE_CHECK([whether va_copy exists], ac_cv_have_va_copy, [
2856         AC_TRY_LINK(
2857                 [#include <stdarg.h>
2858                  va_list x,y;],
2859                 [va_copy(x,y);],
2860                 [ ac_cv_have_va_copy="yes" ],
2861                 [ ac_cv_have_va_copy="no" ]
2862         )
2863 ])
2864 if test "x$ac_cv_have_va_copy" = "xyes" ; then
2865         AC_DEFINE(HAVE_VA_COPY, 1, [Define if va_copy exists])
2866 fi
2867
2868 AC_CACHE_CHECK([whether __va_copy exists], ac_cv_have___va_copy, [
2869         AC_TRY_LINK(
2870                 [#include <stdarg.h>
2871                  va_list x,y;],
2872                 [__va_copy(x,y);],
2873                 [ ac_cv_have___va_copy="yes" ],
2874                 [ ac_cv_have___va_copy="no" ]
2875         )
2876 ])
2877 if test "x$ac_cv_have___va_copy" = "xyes" ; then
2878         AC_DEFINE(HAVE___VA_COPY, 1, [Define if __va_copy exists])
2879 fi
2880
2881 AC_CACHE_CHECK([whether getopt has optreset support],
2882                 ac_cv_have_getopt_optreset, [
2883         AC_TRY_LINK(
2884                 [
2885 #include <getopt.h>
2886                 ],
2887                 [ extern int optreset; optreset = 0; ],
2888                 [ ac_cv_have_getopt_optreset="yes" ],
2889                 [ ac_cv_have_getopt_optreset="no" ]
2890         )
2891 ])
2892 if test "x$ac_cv_have_getopt_optreset" = "xyes" ; then
2893         AC_DEFINE(HAVE_GETOPT_OPTRESET, 1,
2894                 [Define if your getopt(3) defines and uses optreset])
2895 fi
2896
2897 AC_CACHE_CHECK([if libc defines sys_errlist], ac_cv_libc_defines_sys_errlist, [
2898         AC_TRY_LINK([],
2899                 [ extern const char *const sys_errlist[]; printf("%s", sys_errlist[0]);],
2900                 [ ac_cv_libc_defines_sys_errlist="yes" ],
2901                 [ ac_cv_libc_defines_sys_errlist="no" ]
2902         )
2903 ])
2904 if test "x$ac_cv_libc_defines_sys_errlist" = "xyes" ; then
2905         AC_DEFINE(HAVE_SYS_ERRLIST, 1,
2906                 [Define if your system defines sys_errlist[]])
2907 fi
2908
2909
2910 AC_CACHE_CHECK([if libc defines sys_nerr], ac_cv_libc_defines_sys_nerr, [
2911         AC_TRY_LINK([],
2912                 [ extern int sys_nerr; printf("%i", sys_nerr);],
2913                 [ ac_cv_libc_defines_sys_nerr="yes" ],
2914                 [ ac_cv_libc_defines_sys_nerr="no" ]
2915         )
2916 ])
2917 if test "x$ac_cv_libc_defines_sys_nerr" = "xyes" ; then
2918         AC_DEFINE(HAVE_SYS_NERR, 1, [Define if your system defines sys_nerr])
2919 fi
2920
2921 SCARD_MSG="no"
2922 # Check whether user wants sectok support
2923 AC_ARG_WITH(sectok,
2924         [  --with-sectok           Enable smartcard support using libsectok],
2925         [
2926                 if test "x$withval" != "xno" ; then
2927                         if test "x$withval" != "xyes" ; then
2928                                 CPPFLAGS="$CPPFLAGS -I${withval}"
2929                                 LDFLAGS="$LDFLAGS -L${withval}"
2930                                 if test ! -z "$need_dash_r" ; then
2931                                         LDFLAGS="$LDFLAGS -R${withval}"
2932                                 fi
2933                                 if test ! -z "$blibpath" ; then
2934                                         blibpath="$blibpath:${withval}"
2935                                 fi
2936                         fi
2937                         AC_CHECK_HEADERS(sectok.h)
2938                         if test "$ac_cv_header_sectok_h" != yes; then
2939                                 AC_MSG_ERROR(Can't find sectok.h)
2940                         fi
2941                         AC_CHECK_LIB(sectok, sectok_open)
2942                         if test "$ac_cv_lib_sectok_sectok_open" != yes; then
2943                                 AC_MSG_ERROR(Can't find libsectok)
2944                         fi
2945                         AC_DEFINE(SMARTCARD, 1,
2946                                 [Define if you want smartcard support])
2947                         AC_DEFINE(USE_SECTOK, 1,
2948                                 [Define if you want smartcard support
2949                                 using sectok])
2950                         SCARD_MSG="yes, using sectok"
2951                 fi
2952         ]
2953 )
2954
2955 # Check whether user wants OpenSC support
2956 OPENSC_CONFIG="no"
2957 AC_ARG_WITH(opensc,
2958         [  --with-opensc[[=PFX]]     Enable smartcard support using OpenSC (optionally in PATH)],
2959         [
2960             if test "x$withval" != "xno" ; then
2961                 if test "x$withval" != "xyes" ; then
2962                         OPENSC_CONFIG=$withval/bin/opensc-config
2963                 else
2964                         AC_PATH_PROG(OPENSC_CONFIG, opensc-config, no)
2965                 fi
2966                 if test "$OPENSC_CONFIG" != "no"; then
2967                         LIBOPENSC_CFLAGS=`$OPENSC_CONFIG --cflags`
2968                         LIBOPENSC_LIBS=`$OPENSC_CONFIG --libs`
2969                         CPPFLAGS="$CPPFLAGS $LIBOPENSC_CFLAGS"
2970                         LDFLAGS="$LDFLAGS $LIBOPENSC_LIBS"
2971                         AC_DEFINE(SMARTCARD)
2972                         AC_DEFINE(USE_OPENSC, 1,
2973                                 [Define if you want smartcard support
2974                                 using OpenSC])
2975                         SCARD_MSG="yes, using OpenSC"
2976                 fi
2977             fi
2978         ]
2979 )
2980
2981 # Check libraries needed by DNS fingerprint support
2982 AC_SEARCH_LIBS(getrrsetbyname, resolv,
2983         [AC_DEFINE(HAVE_GETRRSETBYNAME, 1,
2984                 [Define if getrrsetbyname() exists])],
2985         [
2986                 # Needed by our getrrsetbyname()
2987                 AC_SEARCH_LIBS(res_query, resolv)
2988                 AC_SEARCH_LIBS(dn_expand, resolv)
2989                 AC_MSG_CHECKING(if res_query will link)
2990                 AC_TRY_LINK_FUNC(res_query, AC_MSG_RESULT(yes),
2991                    [AC_MSG_RESULT(no)
2992                     saved_LIBS="$LIBS"
2993                     LIBS="$LIBS -lresolv"
2994                     AC_MSG_CHECKING(for res_query in -lresolv)
2995                     AC_LINK_IFELSE([
2996 #include <resolv.h>
2997 int main()
2998 {
2999         res_query (0, 0, 0, 0, 0);
3000         return 0;
3001 }
3002                         ],
3003                         [LIBS="$LIBS -lresolv"
3004                          AC_MSG_RESULT(yes)],
3005                         [LIBS="$saved_LIBS"
3006                          AC_MSG_RESULT(no)])
3007                     ])
3008                 AC_CHECK_FUNCS(_getshort _getlong)
3009                 AC_CHECK_DECLS([_getshort, _getlong], , ,
3010                     [#include <sys/types.h>
3011                     #include <arpa/nameser.h>])
3012                 AC_CHECK_MEMBER(HEADER.ad,
3013                         [AC_DEFINE(HAVE_HEADER_AD, 1,
3014                             [Define if HEADER.ad exists in arpa/nameser.h])],,
3015                         [#include <arpa/nameser.h>])
3016         ])
3017
3018 # Check whether user wants SELinux support
3019 SELINUX_MSG="no"
3020 LIBSELINUX=""
3021 AC_ARG_WITH(selinux,
3022         [  --with-selinux   Enable SELinux support],
3023         [ if test "x$withval" != "xno" ; then
3024                 AC_DEFINE(WITH_SELINUX,1,[Define if you want SELinux support.])
3025                 SELINUX_MSG="yes"
3026                 AC_CHECK_HEADER([selinux/selinux.h], ,
3027                     AC_MSG_ERROR(SELinux support requires selinux.h header))
3028                 AC_CHECK_LIB(selinux, setexeccon, [ LIBSELINUX="-lselinux" ],
3029                     AC_MSG_ERROR(SELinux support requires libselinux library))
3030                 AC_CHECK_FUNCS(getseuserbyname get_default_context_with_level)
3031         fi ]
3032 )
3033 AC_SUBST(LIBSELINUX)
3034
3035 # Check whether user wants Kerberos 5 support
3036 KRB5_MSG="no"
3037 AC_ARG_WITH(kerberos5,
3038         [  --with-kerberos5=PATH   Enable Kerberos 5 support],
3039         [ if test "x$withval" != "xno" ; then
3040                 if test "x$withval" = "xyes" ; then
3041                         KRB5ROOT="/usr/local"
3042                 else
3043                         KRB5ROOT=${withval}
3044                 fi
3045
3046                 AC_DEFINE(KRB5, 1, [Define if you want Kerberos 5 support])
3047                 KRB5_MSG="yes"
3048
3049                 AC_MSG_CHECKING(for krb5-config)
3050                 if test -x  $KRB5ROOT/bin/krb5-config ; then
3051                         KRB5CONF=$KRB5ROOT/bin/krb5-config
3052                         AC_MSG_RESULT($KRB5CONF)
3053
3054                         AC_MSG_CHECKING(for gssapi support)
3055                         if $KRB5CONF | grep gssapi >/dev/null ; then
3056                                 AC_MSG_RESULT(yes)
3057                                 AC_DEFINE(GSSAPI, 1,
3058                                         [Define this if you want GSSAPI
3059                                         support in the version 2 protocol])
3060                                 k5confopts=gssapi
3061                         else
3062                                 AC_MSG_RESULT(no)
3063                                 k5confopts=""
3064                         fi
3065                         K5CFLAGS="`$KRB5CONF --cflags $k5confopts`"
3066                         K5LIBS="`$KRB5CONF --libs $k5confopts`"
3067                         CPPFLAGS="$CPPFLAGS $K5CFLAGS"
3068                         AC_MSG_CHECKING(whether we are using Heimdal)
3069                         AC_TRY_COMPILE([ #include <krb5.h> ],
3070                                        [ char *tmp = heimdal_version; ],
3071                                        [ AC_MSG_RESULT(yes)
3072                                          AC_DEFINE(HEIMDAL, 1,
3073                                         [Define this if you are using the
3074                                         Heimdal version of Kerberos V5]) ],
3075                                          AC_MSG_RESULT(no)
3076                         )
3077                 else
3078                         AC_MSG_RESULT(no)
3079                         CPPFLAGS="$CPPFLAGS -I${KRB5ROOT}/include"
3080                         LDFLAGS="$LDFLAGS -L${KRB5ROOT}/lib"
3081                         AC_MSG_CHECKING(whether we are using Heimdal)
3082                         AC_TRY_COMPILE([ #include <krb5.h> ],
3083                                        [ char *tmp = heimdal_version; ],
3084                                        [ AC_MSG_RESULT(yes)
3085                                          AC_DEFINE(HEIMDAL)
3086                                          K5LIBS="-lkrb5 -ldes"
3087                                          K5LIBS="$K5LIBS -lcom_err -lasn1"
3088                                          AC_CHECK_LIB(roken, net_write,
3089                                            [K5LIBS="$K5LIBS -lroken"])
3090                                        ],
3091                                        [ AC_MSG_RESULT(no)
3092                                          K5LIBS="-lkrb5 -lk5crypto -lcom_err"
3093                                        ]
3094                         )
3095                         AC_SEARCH_LIBS(dn_expand, resolv)
3096
3097                         AC_CHECK_LIB(gssapi,gss_init_sec_context,
3098                                 [ AC_DEFINE(GSSAPI)
3099                                   K5LIBS="-lgssapi $K5LIBS" ],
3100                                 [ AC_CHECK_LIB(gssapi_krb5,gss_init_sec_context,
3101                                         [ AC_DEFINE(GSSAPI)
3102                                           K5LIBS="-lgssapi_krb5 $K5LIBS" ],
3103                                         AC_MSG_WARN([Cannot find any suitable gss-api library - build may fail]),
3104                                         $K5LIBS)
3105                                 ],
3106                                 $K5LIBS)
3107
3108                         AC_CHECK_HEADER(gssapi.h, ,
3109                                 [ unset ac_cv_header_gssapi_h
3110                                   CPPFLAGS="$CPPFLAGS -I${KRB5ROOT}/include/gssapi"
3111                                   AC_CHECK_HEADERS(gssapi.h, ,
3112                                         AC_MSG_WARN([Cannot find any suitable gss-api header - build may fail])
3113                                   )
3114                                 ]
3115                         )
3116
3117                         oldCPP="$CPPFLAGS"
3118                         CPPFLAGS="$CPPFLAGS -I${KRB5ROOT}/include/gssapi"
3119                         AC_CHECK_HEADER(gssapi_krb5.h, ,
3120                                         [ CPPFLAGS="$oldCPP" ])
3121
3122                 fi
3123                 if test ! -z "$need_dash_r" ; then
3124                         LDFLAGS="$LDFLAGS -R${KRB5ROOT}/lib"
3125                 fi
3126                 if test ! -z "$blibpath" ; then
3127                         blibpath="$blibpath:${KRB5ROOT}/lib"
3128                 fi
3129
3130                 AC_CHECK_HEADERS(gssapi.h gssapi/gssapi.h)
3131                 AC_CHECK_HEADERS(gssapi_krb5.h gssapi/gssapi_krb5.h)
3132                 AC_CHECK_HEADERS(gssapi_generic.h gssapi/gssapi_generic.h)
3133
3134                 LIBS="$LIBS $K5LIBS"
3135                 AC_SEARCH_LIBS(k_hasafs, kafs, AC_DEFINE(USE_AFS, 1,
3136                         [Define this if you want to use libkafs' AFS support]))
3137         fi
3138         ]
3139 )
3140
3141 # Looking for programs, paths and files
3142
3143 PRIVSEP_PATH=/var/empty
3144 AC_ARG_WITH(privsep-path,
3145         [  --with-privsep-path=xxx Path for privilege separation chroot (default=/var/empty)],
3146         [
3147                 if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
3148                     test "x${withval}" != "xyes"; then
3149                         PRIVSEP_PATH=$withval
3150                 fi
3151         ]
3152 )
3153 AC_SUBST(PRIVSEP_PATH)
3154
3155 AC_ARG_WITH(xauth,
3156         [  --with-xauth=PATH       Specify path to xauth program ],
3157         [
3158                 if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
3159                     test "x${withval}" != "xyes"; then
3160                         xauth_path=$withval
3161                 fi
3162         ],
3163         [
3164                 TestPath="$PATH"
3165                 TestPath="${TestPath}${PATH_SEPARATOR}/usr/X/bin"
3166                 TestPath="${TestPath}${PATH_SEPARATOR}/usr/bin/X11"
3167                 TestPath="${TestPath}${PATH_SEPARATOR}/usr/X11R6/bin"
3168                 TestPath="${TestPath}${PATH_SEPARATOR}/usr/openwin/bin"
3169                 AC_PATH_PROG(xauth_path, xauth, , $TestPath)
3170                 if (test ! -z "$xauth_path" && test -x "/usr/openwin/bin/xauth") ; then
3171                         xauth_path="/usr/openwin/bin/xauth"
3172                 fi
3173         ]
3174 )
3175
3176 STRIP_OPT=-s
3177 AC_ARG_ENABLE(strip,
3178         [  --disable-strip         Disable calling strip(1) on install],
3179         [
3180                 if test "x$enableval" = "xno" ; then
3181                         STRIP_OPT=
3182                 fi
3183         ]
3184 )
3185 AC_SUBST(STRIP_OPT)
3186
3187 if test -z "$xauth_path" ; then
3188         XAUTH_PATH="undefined"
3189         AC_SUBST(XAUTH_PATH)
3190 else
3191         AC_DEFINE_UNQUOTED(XAUTH_PATH, "$xauth_path",
3192                 [Define if xauth is found in your path])
3193         XAUTH_PATH=$xauth_path
3194         AC_SUBST(XAUTH_PATH)
3195 fi
3196
3197 # Check for mail directory (last resort if we cannot get it from headers)
3198 if test ! -z "$MAIL" ; then
3199         maildir=`dirname $MAIL`
3200         AC_DEFINE_UNQUOTED(MAIL_DIRECTORY, "$maildir",
3201                 [Set this to your mail directory if you don't have maillock.h])
3202 fi
3203
3204 if test ! -z "$cross_compiling" && test "x$cross_compiling" = "xyes"; then
3205         AC_MSG_WARN([cross compiling: Disabling /dev/ptmx test])
3206         disable_ptmx_check=yes
3207 fi
3208 if test -z "$no_dev_ptmx" ; then
3209         if test "x$disable_ptmx_check" != "xyes" ; then
3210                 AC_CHECK_FILE("/dev/ptmx",
3211                         [
3212                                 AC_DEFINE_UNQUOTED(HAVE_DEV_PTMX, 1,
3213                                         [Define if you have /dev/ptmx])
3214                                 have_dev_ptmx=1
3215                         ]
3216                 )
3217         fi
3218 fi
3219
3220 if test ! -z "$cross_compiling" && test "x$cross_compiling" != "xyes"; then
3221         AC_CHECK_FILE("/dev/ptc",
3222                 [
3223                         AC_DEFINE_UNQUOTED(HAVE_DEV_PTS_AND_PTC, 1,
3224                                 [Define if you have /dev/ptc])
3225                         have_dev_ptc=1
3226                 ]
3227         )
3228 else
3229         AC_MSG_WARN([cross compiling: Disabling /dev/ptc test])
3230 fi
3231
3232 # Options from here on. Some of these are preset by platform above
3233 AC_ARG_WITH(mantype,
3234         [  --with-mantype=man|cat|doc  Set man page type],
3235         [
3236                 case "$withval" in
3237                 man|cat|doc)
3238                         MANTYPE=$withval
3239                         ;;
3240                 *)
3241                         AC_MSG_ERROR(invalid man type: $withval)
3242                         ;;
3243                 esac
3244         ]
3245 )
3246 if test -z "$MANTYPE"; then
3247         TestPath="/usr/bin${PATH_SEPARATOR}/usr/ucb"
3248         AC_PATH_PROGS(NROFF, nroff awf, /bin/false, $TestPath)
3249         if ${NROFF} -mdoc ${srcdir}/ssh.1 >/dev/null 2>&1; then
3250                 MANTYPE=doc
3251         elif ${NROFF} -man ${srcdir}/ssh.1 >/dev/null 2>&1; then
3252                 MANTYPE=man
3253         else
3254                 MANTYPE=cat
3255         fi
3256 fi
3257 AC_SUBST(MANTYPE)
3258 if test "$MANTYPE" = "doc"; then
3259         mansubdir=man;
3260 else
3261         mansubdir=$MANTYPE;
3262 fi
3263 AC_SUBST(mansubdir)
3264
3265 # Check whether to enable MD5 passwords
3266 MD5_MSG="no"
3267 AC_ARG_WITH(md5-passwords,
3268         [  --with-md5-passwords    Enable use of MD5 passwords],
3269         [
3270                 if test "x$withval" != "xno" ; then
3271                         AC_DEFINE(HAVE_MD5_PASSWORDS, 1,
3272                                 [Define if you want to allow MD5 passwords])
3273                         MD5_MSG="yes"
3274                 fi
3275         ]
3276 )
3277
3278 # Whether to disable shadow password support
3279 AC_ARG_WITH(shadow,
3280         [  --without-shadow        Disable shadow password support],
3281         [
3282                 if test "x$withval" = "xno" ; then
3283                         AC_DEFINE(DISABLE_SHADOW)
3284                         disable_shadow=yes
3285                 fi
3286         ]
3287 )
3288
3289 if test -z "$disable_shadow" ; then
3290         AC_MSG_CHECKING([if the systems has expire shadow information])
3291         AC_TRY_COMPILE(
3292         [
3293 #include <sys/types.h>
3294 #include <shadow.h>
3295         struct spwd sp;
3296         ],[ sp.sp_expire = sp.sp_lstchg = sp.sp_inact = 0; ],
3297         [ sp_expire_available=yes ], []
3298         )
3299
3300         if test "x$sp_expire_available" = "xyes" ; then
3301                 AC_MSG_RESULT(yes)
3302                 AC_DEFINE(HAS_SHADOW_EXPIRE, 1,
3303                     [Define if you want to use shadow password expire field])
3304         else
3305                 AC_MSG_RESULT(no)
3306         fi
3307 fi
3308
3309 # Use ip address instead of hostname in $DISPLAY
3310 if test ! -z "$IPADDR_IN_DISPLAY" ; then
3311         DISPLAY_HACK_MSG="yes"
3312         AC_DEFINE(IPADDR_IN_DISPLAY, 1,
3313                 [Define if you need to use IP address
3314                 instead of hostname in $DISPLAY])
3315 else
3316         DISPLAY_HACK_MSG="no"
3317         AC_ARG_WITH(ipaddr-display,
3318                 [  --with-ipaddr-display   Use ip address instead of hostname in \$DISPLAY],
3319                 [
3320                         if test "x$withval" != "xno" ; then
3321                                 AC_DEFINE(IPADDR_IN_DISPLAY)
3322                                 DISPLAY_HACK_MSG="yes"
3323                         fi
3324                 ]
3325         )
3326 fi
3327
3328 # check for /etc/default/login and use it if present.
3329 AC_ARG_ENABLE(etc-default-login,
3330         [  --disable-etc-default-login Disable using PATH from /etc/default/login [no]],
3331         [ if test "x$enableval" = "xno"; then
3332                 AC_MSG_NOTICE([/etc/default/login handling disabled])
3333                 etc_default_login=no
3334           else
3335                 etc_default_login=yes
3336           fi ],
3337         [ if test ! -z "$cross_compiling" && test "x$cross_compiling" = "xyes";
3338           then
3339                 AC_MSG_WARN([cross compiling: not checking /etc/default/login])
3340                 etc_default_login=no
3341           else
3342                 etc_default_login=yes
3343           fi ]
3344 )
3345
3346 if test "x$etc_default_login" != "xno"; then
3347         AC_CHECK_FILE("/etc/default/login",
3348             [ external_path_file=/etc/default/login ])
3349         if test "x$external_path_file" = "x/etc/default/login"; then
3350                 AC_DEFINE(HAVE_ETC_DEFAULT_LOGIN, 1,
3351                         [Define if your system has /etc/default/login])
3352         fi
3353 fi
3354
3355 dnl BSD systems use /etc/login.conf so --with-default-path= has no effect
3356 if test $ac_cv_func_login_getcapbool = "yes" && \
3357         test $ac_cv_header_login_cap_h = "yes" ; then
3358         external_path_file=/etc/login.conf
3359 fi
3360
3361 # Whether to mess with the default path
3362 SERVER_PATH_MSG="(default)"
3363 AC_ARG_WITH(default-path,
3364         [  --with-default-path=    Specify default \$PATH environment for server],
3365         [
3366                 if test "x$external_path_file" = "x/etc/login.conf" ; then
3367                         AC_MSG_WARN([
3368 --with-default-path=PATH has no effect on this system.
3369 Edit /etc/login.conf instead.])
3370                 elif test "x$withval" != "xno" ; then
3371                         if test ! -z "$external_path_file" ; then
3372                                 AC_MSG_WARN([
3373 --with-default-path=PATH will only be used if PATH is not defined in
3374 $external_path_file .])
3375                         fi
3376                         user_path="$withval"
3377                         SERVER_PATH_MSG="$withval"
3378                 fi
3379         ],
3380         [ if test "x$external_path_file" = "x/etc/login.conf" ; then
3381                 AC_MSG_WARN([Make sure the path to scp is in /etc/login.conf])
3382         else
3383                 if test ! -z "$external_path_file" ; then
3384                         AC_MSG_WARN([
3385 If PATH is defined in $external_path_file, ensure the path to scp is included,
3386 otherwise scp will not work.])
3387                 fi
3388                 AC_RUN_IFELSE(
3389                         [AC_LANG_SOURCE([[
3390 /* find out what STDPATH is */
3391 #include <stdio.h>
3392 #ifdef HAVE_PATHS_H
3393 # include <paths.h>
3394 #endif
3395 #ifndef _PATH_STDPATH
3396 # ifdef _PATH_USERPATH  /* Irix */
3397 #  define _PATH_STDPATH _PATH_USERPATH
3398 # else
3399 #  define _PATH_STDPATH "/usr/bin:/bin:/usr/sbin:/sbin"
3400 # endif
3401 #endif
3402 #include <sys/types.h>
3403 #include <sys/stat.h>
3404 #include <fcntl.h>
3405 #define DATA "conftest.stdpath"
3406
3407 main()
3408 {
3409         FILE *fd;
3410         int rc;
3411
3412         fd = fopen(DATA,"w");
3413         if(fd == NULL)
3414                 exit(1);
3415
3416         if ((rc = fprintf(fd,"%s", _PATH_STDPATH)) < 0)
3417                 exit(1);
3418
3419         exit(0);
3420 }
3421                 ]])],
3422                 [ user_path=`cat conftest.stdpath` ],
3423                 [ user_path="/usr/bin:/bin:/usr/sbin:/sbin" ],
3424                 [ user_path="/usr/bin:/bin:/usr/sbin:/sbin" ]
3425         )
3426 # make sure $bindir is in USER_PATH so scp will work
3427                 t_bindir=`eval echo ${bindir}`
3428                 case $t_bindir in
3429                         NONE/*) t_bindir=`echo $t_bindir | sed "s~NONE~$prefix~"` ;;
3430                 esac
3431                 case $t_bindir in
3432                         NONE/*) t_bindir=`echo $t_bindir | sed "s~NONE~$ac_default_prefix~"` ;;
3433                 esac
3434                 echo $user_path | grep ":$t_bindir"  > /dev/null 2>&1
3435                 if test $? -ne 0  ; then
3436                         echo $user_path | grep "^$t_bindir"  > /dev/null 2>&1
3437                         if test $? -ne 0  ; then
3438                                 user_path=$user_path:$t_bindir
3439                                 AC_MSG_RESULT(Adding $t_bindir to USER_PATH so scp will work)
3440                         fi
3441                 fi
3442         fi ]
3443 )
3444 if test "x$external_path_file" != "x/etc/login.conf" ; then
3445         AC_DEFINE_UNQUOTED(USER_PATH, "$user_path", [Specify default $PATH])
3446         AC_SUBST(user_path)
3447 fi
3448
3449 # Set superuser path separately to user path
3450 AC_ARG_WITH(superuser-path,
3451         [  --with-superuser-path=  Specify different path for super-user],
3452         [
3453                 if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
3454                     test "x${withval}" != "xyes"; then
3455                         AC_DEFINE_UNQUOTED(SUPERUSER_PATH, "$withval",
3456                                 [Define if you want a different $PATH
3457                                 for the superuser])
3458                         superuser_path=$withval
3459                 fi
3460         ]
3461 )
3462
3463
3464 AC_MSG_CHECKING([if we need to convert IPv4 in IPv6-mapped addresses])
3465 IPV4_IN6_HACK_MSG="no"
3466 AC_ARG_WITH(4in6,
3467         [  --with-4in6             Check for and convert IPv4 in IPv6 mapped addresses],
3468         [
3469                 if test "x$withval" != "xno" ; then
3470                         AC_MSG_RESULT(yes)
3471                         AC_DEFINE(IPV4_IN_IPV6, 1,
3472                                 [Detect IPv4 in IPv6 mapped addresses
3473                                 and treat as IPv4])
3474                         IPV4_IN6_HACK_MSG="yes"
3475                 else
3476                         AC_MSG_RESULT(no)
3477                 fi
3478         ],[
3479                 if test "x$inet6_default_4in6" = "xyes"; then
3480                         AC_MSG_RESULT([yes (default)])
3481                         AC_DEFINE(IPV4_IN_IPV6)
3482                         IPV4_IN6_HACK_MSG="yes"
3483                 else
3484                         AC_MSG_RESULT([no (default)])
3485                 fi
3486         ]
3487 )
3488
3489 # Whether to enable BSD auth support
3490 BSD_AUTH_MSG=no
3491 AC_ARG_WITH(bsd-auth,
3492         [  --with-bsd-auth         Enable BSD auth support],
3493         [
3494                 if test "x$withval" != "xno" ; then
3495                         AC_DEFINE(BSD_AUTH, 1,
3496                                 [Define if you have BSD auth support])
3497                         BSD_AUTH_MSG=yes
3498                 fi
3499         ]
3500 )
3501
3502 # Where to place sshd.pid
3503 piddir=/var/run
3504 # make sure the directory exists
3505 if test ! -d $piddir ; then
3506         piddir=`eval echo ${sysconfdir}`
3507         case $piddir in
3508                 NONE/*) piddir=`echo $piddir | sed "s~NONE~$ac_default_prefix~"` ;;
3509         esac
3510 fi
3511
3512 AC_ARG_WITH(pid-dir,
3513         [  --with-pid-dir=PATH     Specify location of ssh.pid file],
3514         [
3515                 if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
3516                     test "x${withval}" != "xyes"; then
3517                         piddir=$withval
3518                         if test ! -d $piddir ; then
3519                         AC_MSG_WARN([** no $piddir directory on this system **])
3520                         fi
3521                 fi
3522         ]
3523 )
3524
3525 AC_DEFINE_UNQUOTED(_PATH_SSH_PIDDIR, "$piddir", [Specify location of ssh.pid])
3526 AC_SUBST(piddir)
3527
3528 dnl allow user to disable some login recording features
3529 AC_ARG_ENABLE(lastlog,
3530         [  --disable-lastlog       disable use of lastlog even if detected [no]],
3531         [
3532                 if test "x$enableval" = "xno" ; then
3533                         AC_DEFINE(DISABLE_LASTLOG)
3534                 fi
3535         ]
3536 )
3537 AC_ARG_ENABLE(utmp,
3538         [  --disable-utmp          disable use of utmp even if detected [no]],
3539         [
3540                 if test "x$enableval" = "xno" ; then
3541                         AC_DEFINE(DISABLE_UTMP)
3542                 fi
3543         ]
3544 )
3545 AC_ARG_ENABLE(utmpx,
3546         [  --disable-utmpx         disable use of utmpx even if detected [no]],
3547         [
3548                 if test "x$enableval" = "xno" ; then
3549                         AC_DEFINE(DISABLE_UTMPX, 1,
3550                                 [Define if you don't want to use utmpx])
3551                 fi
3552         ]
3553 )
3554 AC_ARG_ENABLE(wtmp,
3555         [  --disable-wtmp          disable use of wtmp even if detected [no]],
3556         [
3557                 if test "x$enableval" = "xno" ; then
3558                         AC_DEFINE(DISABLE_WTMP)
3559                 fi
3560         ]
3561 )
3562 AC_ARG_ENABLE(wtmpx,
3563         [  --disable-wtmpx         disable use of wtmpx even if detected [no]],
3564         [
3565                 if test "x$enableval" = "xno" ; then
3566                         AC_DEFINE(DISABLE_WTMPX, 1,
3567                                 [Define if you don't want to use wtmpx])
3568                 fi
3569         ]
3570 )
3571 AC_ARG_ENABLE(libutil,
3572         [  --disable-libutil       disable use of libutil (login() etc.) [no]],
3573         [
3574                 if test "x$enableval" = "xno" ; then
3575                         AC_DEFINE(DISABLE_LOGIN)
3576                 fi
3577         ]
3578 )
3579 AC_ARG_ENABLE(pututline,
3580         [  --disable-pututline     disable use of pututline() etc. ([uw]tmp) [no]],
3581         [
3582                 if test "x$enableval" = "xno" ; then
3583                         AC_DEFINE(DISABLE_PUTUTLINE, 1,
3584                                 [Define if you don't want to use pututline()
3585                                 etc. to write [uw]tmp])
3586                 fi
3587         ]
3588 )
3589 AC_ARG_ENABLE(pututxline,
3590         [  --disable-pututxline    disable use of pututxline() etc. ([uw]tmpx) [no]],
3591         [
3592                 if test "x$enableval" = "xno" ; then
3593                         AC_DEFINE(DISABLE_PUTUTXLINE, 1,
3594                                 [Define if you don't want to use pututxline()
3595                                 etc. to write [uw]tmpx])
3596                 fi
3597         ]
3598 )
3599 AC_ARG_WITH(lastlog,
3600   [  --with-lastlog=FILE|DIR specify lastlog location [common locations]],
3601         [
3602                 if test "x$withval" = "xno" ; then
3603                         AC_DEFINE(DISABLE_LASTLOG)
3604                 elif test -n "$withval"  &&  test "x${withval}" != "xyes"; then
3605                         conf_lastlog_location=$withval
3606                 fi
3607         ]
3608 )
3609
3610 dnl lastlog, [uw]tmpx? detection
3611 dnl  NOTE: set the paths in the platform section to avoid the
3612 dnl   need for command-line parameters
3613 dnl lastlog and [uw]tmp are subject to a file search if all else fails
3614
3615 dnl lastlog detection
3616 dnl  NOTE: the code itself will detect if lastlog is a directory
3617 AC_MSG_CHECKING([if your system defines LASTLOG_FILE])
3618 AC_TRY_COMPILE([
3619 #include <sys/types.h>
3620 #include <utmp.h>
3621 #ifdef HAVE_LASTLOG_H
3622 #  include <lastlog.h>
3623 #endif
3624 #ifdef HAVE_PATHS_H
3625 #  include <paths.h>
3626 #endif
3627 #ifdef HAVE_LOGIN_H
3628 # include <login.h>
3629 #endif
3630         ],
3631         [ char *lastlog = LASTLOG_FILE; ],
3632         [ AC_MSG_RESULT(yes) ],
3633         [
3634                 AC_MSG_RESULT(no)
3635                 AC_MSG_CHECKING([if your system defines _PATH_LASTLOG])
3636                 AC_TRY_COMPILE([
3637 #include <sys/types.h>
3638 #include <utmp.h>
3639 #ifdef HAVE_LASTLOG_H
3640 #  include <lastlog.h>
3641 #endif
3642 #ifdef HAVE_PATHS_H
3643 #  include <paths.h>
3644 #endif
3645                 ],
3646                 [ char *lastlog = _PATH_LASTLOG; ],
3647                 [ AC_MSG_RESULT(yes) ],
3648                 [
3649                         AC_MSG_RESULT(no)
3650                         system_lastlog_path=no
3651                 ])
3652         ]
3653 )
3654
3655 if test -z "$conf_lastlog_location"; then
3656         if test x"$system_lastlog_path" = x"no" ; then
3657                 for f in /var/log/lastlog /usr/adm/lastlog /var/adm/lastlog /etc/security/lastlog ; do
3658                                 if (test -d "$f" || test -f "$f") ; then
3659                                         conf_lastlog_location=$f
3660                                 fi
3661                 done
3662                 if test -z "$conf_lastlog_location"; then
3663                         AC_MSG_WARN([** Cannot find lastlog **])
3664                         dnl Don't define DISABLE_LASTLOG - that means we don't try wtmp/wtmpx
3665                 fi
3666         fi
3667 fi
3668
3669 if test -n "$conf_lastlog_location"; then
3670         AC_DEFINE_UNQUOTED(CONF_LASTLOG_FILE, "$conf_lastlog_location",
3671                 [Define if you want to specify the path to your lastlog file])
3672 fi
3673
3674 dnl utmp detection
3675 AC_MSG_CHECKING([if your system defines UTMP_FILE])
3676 AC_TRY_COMPILE([
3677 #include <sys/types.h>
3678 #include <utmp.h>
3679 #ifdef HAVE_PATHS_H
3680 #  include <paths.h>
3681 #endif
3682         ],
3683         [ char *utmp = UTMP_FILE; ],
3684         [ AC_MSG_RESULT(yes) ],
3685         [ AC_MSG_RESULT(no)
3686           system_utmp_path=no ]
3687 )
3688 if test -z "$conf_utmp_location"; then
3689         if test x"$system_utmp_path" = x"no" ; then
3690                 for f in /etc/utmp /usr/adm/utmp /var/run/utmp; do
3691                         if test -f $f ; then
3692                                 conf_utmp_location=$f
3693                         fi
3694                 done
3695                 if test -z "$conf_utmp_location"; then
3696                         AC_DEFINE(DISABLE_UTMP)
3697                 fi
3698         fi
3699 fi
3700 if test -n "$conf_utmp_location"; then
3701         AC_DEFINE_UNQUOTED(CONF_UTMP_FILE, "$conf_utmp_location",
3702                 [Define if you want to specify the path to your utmp file])
3703 fi
3704
3705 dnl wtmp detection
3706 AC_MSG_CHECKING([if your system defines WTMP_FILE])
3707 AC_TRY_COMPILE([
3708 #include <sys/types.h>
3709 #include <utmp.h>
3710 #ifdef HAVE_PATHS_H
3711 #  include <paths.h>
3712 #endif
3713         ],
3714         [ char *wtmp = WTMP_FILE; ],
3715         [ AC_MSG_RESULT(yes) ],
3716         [ AC_MSG_RESULT(no)
3717           system_wtmp_path=no ]
3718 )
3719 if test -z "$conf_wtmp_location"; then
3720         if test x"$system_wtmp_path" = x"no" ; then
3721                 for f in /usr/adm/wtmp /var/log/wtmp; do
3722                         if test -f $f ; then
3723                                 conf_wtmp_location=$f
3724                         fi
3725                 done
3726                 if test -z "$conf_wtmp_location"; then
3727                         AC_DEFINE(DISABLE_WTMP)
3728                 fi
3729         fi
3730 fi
3731 if test -n "$conf_wtmp_location"; then
3732         AC_DEFINE_UNQUOTED(CONF_WTMP_FILE, "$conf_wtmp_location",
3733                 [Define if you want to specify the path to your wtmp file])
3734 fi
3735
3736
3737 dnl utmpx detection - I don't know any system so perverse as to require
3738 dnl  utmpx, but not define UTMPX_FILE (ditto wtmpx.) No doubt it's out
3739 dnl  there, though.
3740 AC_MSG_CHECKING([if your system defines UTMPX_FILE])
3741 AC_TRY_COMPILE([
3742 #include <sys/types.h>
3743 #include <utmp.h>
3744 #ifdef HAVE_UTMPX_H
3745 #include <utmpx.h>
3746 #endif
3747 #ifdef HAVE_PATHS_H
3748 #  include <paths.h>
3749 #endif
3750         ],
3751         [ char *utmpx = UTMPX_FILE; ],
3752         [ AC_MSG_RESULT(yes) ],
3753         [ AC_MSG_RESULT(no)
3754           system_utmpx_path=no ]
3755 )
3756 if test -z "$conf_utmpx_location"; then
3757         if test x"$system_utmpx_path" = x"no" ; then
3758                 AC_DEFINE(DISABLE_UTMPX)
3759         fi
3760 else
3761         AC_DEFINE_UNQUOTED(CONF_UTMPX_FILE, "$conf_utmpx_location",
3762                 [Define if you want to specify the path to your utmpx file])
3763 fi
3764
3765 dnl wtmpx detection
3766 AC_MSG_CHECKING([if your system defines WTMPX_FILE])
3767 AC_TRY_COMPILE([
3768 #include <sys/types.h>
3769 #include <utmp.h>
3770 #ifdef HAVE_UTMPX_H
3771 #include <utmpx.h>
3772 #endif
3773 #ifdef HAVE_PATHS_H
3774 #  include <paths.h>
3775 #endif
3776         ],
3777         [ char *wtmpx = WTMPX_FILE; ],
3778         [ AC_MSG_RESULT(yes) ],
3779         [ AC_MSG_RESULT(no)
3780           system_wtmpx_path=no ]
3781 )
3782 if test -z "$conf_wtmpx_location"; then
3783         if test x"$system_wtmpx_path" = x"no" ; then
3784                 AC_DEFINE(DISABLE_WTMPX)
3785         fi
3786 else
3787         AC_DEFINE_UNQUOTED(CONF_WTMPX_FILE, "$conf_wtmpx_location",
3788                 [Define if you want to specify the path to your wtmpx file])
3789 fi
3790
3791
3792 if test ! -z "$blibpath" ; then
3793         LDFLAGS="$LDFLAGS $blibflags$blibpath"
3794         AC_MSG_WARN([Please check and edit blibpath in LDFLAGS in Makefile])
3795 fi
3796
3797 dnl remove pam and dl because they are in $LIBPAM
3798 if test "$PAM_MSG" = yes ; then
3799         LIBS=`echo $LIBS | sed 's/-lpam //'`
3800 fi
3801 if test "$ac_cv_lib_pam_pam_set_item" = yes ; then
3802         LIBS=`echo $LIBS | sed 's/-ldl //'`
3803 fi
3804
3805 dnl Adding -Werror to CFLAGS early prevents configure tests from running.
3806 dnl Add now.
3807 CFLAGS="$CFLAGS $werror_flags"
3808
3809 AC_EXEEXT
3810 AC_CONFIG_FILES([Makefile buildpkg.sh opensshd.init openbsd-compat/Makefile \
3811         openbsd-compat/regress/Makefile scard/Makefile ssh_prng_cmds survey.sh])
3812 AC_OUTPUT
3813
3814 # Print summary of options
3815
3816 # Someone please show me a better way :)
3817 A=`eval echo ${prefix}` ; A=`eval echo ${A}`
3818 B=`eval echo ${bindir}` ; B=`eval echo ${B}`
3819 C=`eval echo ${sbindir}` ; C=`eval echo ${C}`
3820 D=`eval echo ${sysconfdir}` ; D=`eval echo ${D}`
3821 E=`eval echo ${libexecdir}/ssh-askpass` ; E=`eval echo ${E}`
3822 F=`eval echo ${mandir}/${mansubdir}X` ; F=`eval echo ${F}`
3823 G=`eval echo ${piddir}` ; G=`eval echo ${G}`
3824 H=`eval echo ${PRIVSEP_PATH}` ; H=`eval echo ${H}`
3825 I=`eval echo ${user_path}` ; I=`eval echo ${I}`
3826 J=`eval echo ${superuser_path}` ; J=`eval echo ${J}`
3827
3828 echo ""
3829 echo "OpenSSH has been configured with the following options:"
3830 echo "                     User binaries: $B"
3831 echo "                   System binaries: $C"
3832 echo "               Configuration files: $D"
3833 echo "                   Askpass program: $E"
3834 echo "                      Manual pages: $F"
3835 echo "                          PID file: $G"
3836 echo "  Privilege separation chroot path: $H"
3837 if test "x$external_path_file" = "x/etc/login.conf" ; then
3838 echo "   At runtime, sshd will use the path defined in $external_path_file"
3839 echo "   Make sure the path to scp is present, otherwise scp will not work"
3840 else
3841 echo "            sshd default user PATH: $I"
3842         if test ! -z "$external_path_file"; then
3843 echo "   (If PATH is set in $external_path_file it will be used instead. If"
3844 echo "   used, ensure the path to scp is present, otherwise scp will not work.)"
3845         fi
3846 fi
3847 if test ! -z "$superuser_path" ; then
3848 echo "          sshd superuser user PATH: $J"
3849 fi
3850 echo "                    Manpage format: $MANTYPE"
3851 echo "                       PAM support: $PAM_MSG"
3852 echo "                 KerberosV support: $KRB5_MSG"
3853 echo "                   SELinux support: $SELINUX_MSG"
3854 echo "                 Smartcard support: $SCARD_MSG"
3855 echo "                     S/KEY support: $SKEY_MSG"
3856 echo "              TCP Wrappers support: $TCPW_MSG"
3857 echo "              MD5 password support: $MD5_MSG"
3858 echo "                   libedit support: $LIBEDIT_MSG"
3859 echo "       IP address in \$DISPLAY hack: $DISPLAY_HACK_MSG"
3860 echo "           Translate v4 in v6 hack: $IPV4_IN6_HACK_MSG"
3861 echo "                  BSD Auth support: $BSD_AUTH_MSG"
3862 echo "              Random number source: $RAND_MSG"
3863 if test ! -z "$USE_RAND_HELPER" ; then
3864 echo "     ssh-rand-helper collects from: $RAND_HELPER_MSG"
3865 fi
3866
3867 echo ""
3868
3869 echo "              Host: ${host}"
3870 echo "          Compiler: ${CC}"
3871 echo "    Compiler flags: ${CFLAGS}"
3872 echo "Preprocessor flags: ${CPPFLAGS}"
3873 echo "      Linker flags: ${LDFLAGS}"
3874 echo "         Libraries: ${LIBWRAP} ${LIBPAM} ${LIBS}"
3875
3876 echo ""
3877
3878 if test "x$MAKE_PACKAGE_SUPPORTED" = "xyes" ; then
3879         echo "SVR4 style packages are supported with \"make package\""
3880         echo ""
3881 fi
3882
3883 if test "x$PAM_MSG" = "xyes" ; then
3884         echo "PAM is enabled. You may need to install a PAM control file "
3885         echo "for sshd, otherwise password authentication may fail. "
3886         echo "Example PAM control files can be found in the contrib/ "
3887         echo "subdirectory"
3888         echo ""
3889 fi
3890
3891 if test ! -z "$RAND_HELPER_CMDHASH" ; then
3892         echo "WARNING: you are using the builtin random number collection "
3893         echo "service. Please read WARNING.RNG and request that your OS "
3894         echo "vendor includes kernel-based random number collection in "
3895         echo "future versions of your OS."
3896         echo ""
3897 fi
3898
3899 if test ! -z "$NO_PEERCHECK" ; then
3900         echo "WARNING: the operating system that you are using does not "
3901         echo "appear to support either the getpeereid() API nor the "
3902         echo "SO_PEERCRED getsockopt() option. These facilities are used to "
3903         echo "enforce security checks to prevent unauthorised connections to "
3904         echo "ssh-agent. Their absence increases the risk that a malicious "
3905         echo "user can connect to your agent. "
3906         echo ""
3907 fi
3908
3909 if test "$AUDIT_MODULE" = "bsm" ; then
3910         echo "WARNING: BSM audit support is currently considered EXPERIMENTAL."
3911         echo "See the Solaris section in README.platform for details."
3912 fi
This page took 0.363393 seconds and 5 git commands to generate.