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