]> andersk Git - openssh.git/blob - configure.ac
- (djm) [md-sha256.c configure.ac] md-sha256.c needs sha2.h if present
[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_SETPGRP, 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         AC_DEFINE(DISABLE_LASTLOG)
587         AC_DEFINE(SSHD_ACQUIRES_CTTY)
588         enable_etc_default_login=no     # has incompatible /etc/default/login
589         ;;
590
591 *-*-ultrix*)
592         AC_DEFINE(BROKEN_GETGROUPS, 1, [getgroups(0,NULL) will return -1])
593         AC_DEFINE(BROKEN_MMAP, 1, [Ultrix mmap can't map files])
594         AC_DEFINE(NEED_SETPGRP)
595         AC_DEFINE(HAVE_SYS_SYSLOG_H, 1, [Force use of sys/syslog.h on Ultrix])
596         ;;
597
598 *-*-lynxos)
599         CFLAGS="$CFLAGS -D__NO_INCLUDE_WARN__"
600         AC_DEFINE(MISSING_HOWMANY)
601         AC_DEFINE(BROKEN_SETVBUF, 1, [LynxOS has broken setvbuf() implementation])
602         ;;
603 esac
604
605 # Allow user to specify flags
606 AC_ARG_WITH(cflags,
607         [  --with-cflags           Specify additional flags to pass to compiler],
608         [
609                 if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
610                     test "x${withval}" != "xyes"; then
611                         CFLAGS="$CFLAGS $withval"
612                 fi
613         ]
614 )
615 AC_ARG_WITH(cppflags,
616         [  --with-cppflags         Specify additional flags to pass to preprocessor] ,
617         [
618                 if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
619                     test "x${withval}" != "xyes"; then
620                         CPPFLAGS="$CPPFLAGS $withval"
621                 fi
622         ]
623 )
624 AC_ARG_WITH(ldflags,
625         [  --with-ldflags          Specify additional flags to pass to linker],
626         [
627                 if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
628                     test "x${withval}" != "xyes"; then
629                         LDFLAGS="$LDFLAGS $withval"
630                 fi
631         ]
632 )
633 AC_ARG_WITH(libs,
634         [  --with-libs             Specify additional libraries to link with],
635         [
636                 if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
637                     test "x${withval}" != "xyes"; then
638                         LIBS="$LIBS $withval"
639                 fi
640         ]
641 )
642 AC_ARG_WITH(Werror,
643         [  --with-Werror           Build main code with -Werror],
644         [
645                 if test -n "$withval"  &&  test "x$withval" != "xno"; then
646                         werror_flags="-Werror"
647                         if test "x${withval}" != "xyes"; then
648                                 werror_flags="$withval"
649                         fi
650                 fi
651         ]
652 )
653
654 AC_MSG_CHECKING(compiler and flags for sanity)
655 AC_RUN_IFELSE(
656         [AC_LANG_SOURCE([
657 #include <stdio.h>
658 int main(){exit(0);}
659         ])],
660         [       AC_MSG_RESULT(yes) ],
661         [
662                 AC_MSG_RESULT(no)
663                 AC_MSG_ERROR([*** compiler cannot create working executables, check config.log ***])
664         ],
665         [       AC_MSG_WARN([cross compiling: not checking compiler sanity]) ]
666 )
667
668 dnl Checks for header files.
669 AC_CHECK_HEADERS( \
670         bstring.h \
671         crypt.h \
672         dirent.h \
673         endian.h \
674         features.h \
675         floatingpoint.h \
676         getopt.h \
677         glob.h \
678         ia.h \
679         iaf.h \
680         limits.h \
681         login.h \
682         login_cap.h \
683         maillock.h \
684         ndir.h \
685         netdb.h \
686         netgroup.h \
687         pam/pam_appl.h \
688         paths.h \
689         pty.h \
690         readpassphrase.h \
691         rpc/types.h \
692         security/pam_appl.h \
693         sha2.h \
694         shadow.h \
695         stddef.h \
696         stdint.h \
697         string.h \
698         strings.h \
699         sys/audit.h \
700         sys/bitypes.h \
701         sys/bsdtty.h \
702         sys/cdefs.h \
703         sys/dir.h \
704         sys/mman.h \
705         sys/ndir.h \
706         sys/prctl.h \
707         sys/pstat.h \
708         sys/select.h \
709         sys/stat.h \
710         sys/stream.h \
711         sys/stropts.h \
712         sys/strtio.h \
713         sys/sysmacros.h \
714         sys/time.h \
715         sys/timers.h \
716         sys/un.h \
717         time.h \
718         tmpdir.h \
719         ttyent.h \
720         unistd.h \
721         usersec.h \
722         util.h \
723         utime.h \
724         utmp.h \
725         utmpx.h \
726         vis.h \
727 )
728
729 # lastlog.h requires sys/time.h to be included first on Solaris
730 AC_CHECK_HEADERS(lastlog.h, [], [], [
731 #ifdef HAVE_SYS_TIME_H
732 # include <sys/time.h>
733 #endif
734 ])
735
736 # sys/ptms.h requires sys/stream.h to be included first on Solaris
737 AC_CHECK_HEADERS(sys/ptms.h, [], [], [
738 #ifdef HAVE_SYS_STREAM_H
739 # include <sys/stream.h>
740 #endif
741 ])
742
743 # Checks for libraries.
744 AC_CHECK_FUNC(yp_match, , AC_CHECK_LIB(nsl, yp_match))
745 AC_CHECK_FUNC(setsockopt, , AC_CHECK_LIB(socket, setsockopt))
746
747 dnl IRIX and Solaris 2.5.1 have dirname() in libgen
748 AC_CHECK_FUNCS(dirname, [AC_CHECK_HEADERS(libgen.h)] ,[
749         AC_CHECK_LIB(gen, dirname,[
750                 AC_CACHE_CHECK([for broken dirname],
751                         ac_cv_have_broken_dirname, [
752                         save_LIBS="$LIBS"
753                         LIBS="$LIBS -lgen"
754                         AC_RUN_IFELSE(
755                                 [AC_LANG_SOURCE([[
756 #include <libgen.h>
757 #include <string.h>
758
759 int main(int argc, char **argv) {
760     char *s, buf[32];
761
762     strncpy(buf,"/etc", 32);
763     s = dirname(buf);
764     if (!s || strncmp(s, "/", 32) != 0) {
765         exit(1);
766     } else {
767         exit(0);
768     }
769 }
770                                 ]])],
771                                 [ ac_cv_have_broken_dirname="no" ],
772                                 [ ac_cv_have_broken_dirname="yes" ],
773                                 [ ac_cv_have_broken_dirname="no" ],
774                         )
775                         LIBS="$save_LIBS"
776                 ])
777                 if test "x$ac_cv_have_broken_dirname" = "xno" ; then
778                         LIBS="$LIBS -lgen"
779                         AC_DEFINE(HAVE_DIRNAME)
780                         AC_CHECK_HEADERS(libgen.h)
781                 fi
782         ])
783 ])
784
785 AC_CHECK_FUNC(getspnam, ,
786         AC_CHECK_LIB(gen, getspnam, LIBS="$LIBS -lgen"))
787 AC_SEARCH_LIBS(basename, gen, AC_DEFINE(HAVE_BASENAME, 1,
788         [Define if you have the basename function.]))
789
790 dnl zlib is required
791 AC_ARG_WITH(zlib,
792         [  --with-zlib=PATH        Use zlib in PATH],
793         [ if test "x$withval" = "xno" ; then
794                 AC_MSG_ERROR([*** zlib is required ***])
795           elif test "x$withval" != "xyes"; then
796                 if test -d "$withval/lib"; then
797                         if test -n "${need_dash_r}"; then
798                                 LDFLAGS="-L${withval}/lib -R${withval}/lib ${LDFLAGS}"
799                         else
800                                 LDFLAGS="-L${withval}/lib ${LDFLAGS}"
801                         fi
802                 else
803                         if test -n "${need_dash_r}"; then
804                                 LDFLAGS="-L${withval} -R${withval} ${LDFLAGS}"
805                         else
806                                 LDFLAGS="-L${withval} ${LDFLAGS}"
807                         fi
808                 fi
809                 if test -d "$withval/include"; then
810                         CPPFLAGS="-I${withval}/include ${CPPFLAGS}"
811                 else
812                         CPPFLAGS="-I${withval} ${CPPFLAGS}"
813                 fi
814         fi ]
815 )
816
817 AC_CHECK_LIB(z, deflate, ,
818         [
819                 saved_CPPFLAGS="$CPPFLAGS"
820                 saved_LDFLAGS="$LDFLAGS"
821                 save_LIBS="$LIBS"
822                 dnl Check default zlib install dir
823                 if test -n "${need_dash_r}"; then
824                         LDFLAGS="-L/usr/local/lib -R/usr/local/lib ${saved_LDFLAGS}"
825                 else
826                         LDFLAGS="-L/usr/local/lib ${saved_LDFLAGS}"
827                 fi
828                 CPPFLAGS="-I/usr/local/include ${saved_CPPFLAGS}"
829                 LIBS="$LIBS -lz"
830                 AC_TRY_LINK_FUNC(deflate, AC_DEFINE(HAVE_LIBZ),
831                         [
832                                 AC_MSG_ERROR([*** zlib missing - please install first or check config.log ***])
833                         ]
834                 )
835         ]
836 )
837 AC_CHECK_HEADER([zlib.h], ,AC_MSG_ERROR([*** zlib.h missing - please install first or check config.log ***]))
838
839 AC_ARG_WITH(zlib-version-check,
840         [  --without-zlib-version-check Disable zlib version check],
841         [  if test "x$withval" = "xno" ; then
842                 zlib_check_nonfatal=1
843            fi
844         ]
845 )
846
847 AC_MSG_CHECKING(for possibly buggy zlib)
848 AC_RUN_IFELSE([AC_LANG_SOURCE([[
849 #include <stdio.h>
850 #include <zlib.h>
851 int main()
852 {
853         int a=0, b=0, c=0, d=0, n, v;
854         n = sscanf(ZLIB_VERSION, "%d.%d.%d.%d", &a, &b, &c, &d);
855         if (n != 3 && n != 4)
856                 exit(1);
857         v = a*1000000 + b*10000 + c*100 + d;
858         fprintf(stderr, "found zlib version %s (%d)\n", ZLIB_VERSION, v);
859
860         /* 1.1.4 is OK */
861         if (a == 1 && b == 1 && c >= 4)
862                 exit(0);
863
864         /* 1.2.3 and up are OK */
865         if (v >= 1020300)
866                 exit(0);
867
868         exit(2);
869 }
870         ]])],
871         AC_MSG_RESULT(no),
872         [ AC_MSG_RESULT(yes)
873           if test -z "$zlib_check_nonfatal" ; then
874                 AC_MSG_ERROR([*** zlib too old - check config.log ***
875 Your reported zlib version has known security problems.  It's possible your
876 vendor has fixed these problems without changing the version number.  If you
877 are sure this is the case, you can disable the check by running
878 "./configure --without-zlib-version-check".
879 If you are in doubt, upgrade zlib to version 1.2.3 or greater.
880 See http://www.gzip.org/zlib/ for details.])
881           else
882                 AC_MSG_WARN([zlib version may have security problems])
883           fi
884         ],
885         [       AC_MSG_WARN([cross compiling: not checking zlib version]) ]
886 )
887
888 dnl UnixWare 2.x
889 AC_CHECK_FUNC(strcasecmp,
890         [], [ AC_CHECK_LIB(resolv, strcasecmp, LIBS="$LIBS -lresolv") ]
891 )
892 AC_CHECK_FUNCS(utimes,
893         [], [ AC_CHECK_LIB(c89, utimes, [AC_DEFINE(HAVE_UTIMES)
894                                         LIBS="$LIBS -lc89"]) ]
895 )
896
897 dnl    Checks for libutil functions
898 AC_CHECK_HEADERS(libutil.h)
899 AC_SEARCH_LIBS(login, util bsd, [AC_DEFINE(HAVE_LOGIN, 1,
900         [Define if your libraries define login()])])
901 AC_CHECK_FUNCS(logout updwtmp logwtmp)
902
903 AC_FUNC_STRFTIME
904
905 # Check for ALTDIRFUNC glob() extension
906 AC_MSG_CHECKING(for GLOB_ALTDIRFUNC support)
907 AC_EGREP_CPP(FOUNDIT,
908         [
909                 #include <glob.h>
910                 #ifdef GLOB_ALTDIRFUNC
911                 FOUNDIT
912                 #endif
913         ],
914         [
915                 AC_DEFINE(GLOB_HAS_ALTDIRFUNC, 1,
916                         [Define if your system glob() function has
917                         the GLOB_ALTDIRFUNC extension])
918                 AC_MSG_RESULT(yes)
919         ],
920         [
921                 AC_MSG_RESULT(no)
922         ]
923 )
924
925 # Check for g.gl_matchc glob() extension
926 AC_MSG_CHECKING(for gl_matchc field in glob_t)
927 AC_TRY_COMPILE(FOUNDIT,
928         [ #include <glob.h> ],
929         [glob_t g; g.gl_matchc = 1;],
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 AC_ARG_WITH(ssl-engine,
1838         [  --with-ssl-engine       Enable OpenSSL (hardware) ENGINE support ],
1839         [ if test "x$withval" != "xno" ; then
1840                 AC_MSG_CHECKING(for OpenSSL ENGINE support)
1841                 AC_TRY_COMPILE(
1842                         [ #include <openssl/engine.h>],
1843                         [
1844 int main(void){ENGINE_load_builtin_engines();ENGINE_register_all_complete();}
1845                         ],
1846                         [ AC_MSG_RESULT(yes)
1847                           AC_DEFINE(USE_OPENSSL_ENGINE, 1,
1848                              [Enable OpenSSL engine support])
1849                         ],
1850                         [ AC_MSG_ERROR(OpenSSL ENGINE support not found)]
1851                 )
1852           fi ]
1853 )
1854
1855 # Check for OpenSSL without EVP_aes_{192,256}_cbc
1856 AC_MSG_CHECKING([whether OpenSSL has crippled AES support])
1857 AC_COMPILE_IFELSE(
1858         [AC_LANG_SOURCE([[
1859 #include <string.h>
1860 #include <openssl/evp.h>
1861 int main(void) { exit(EVP_aes_192_cbc() == NULL || EVP_aes_256_cbc() == NULL);}
1862         ]])],
1863         [
1864                 AC_MSG_RESULT(no)
1865         ],
1866         [
1867                 AC_MSG_RESULT(yes)
1868                 AC_DEFINE(OPENSSL_LOBOTOMISED_AES, 1,
1869                     [libcrypto is missing AES 192 and 256 bit functions])
1870         ]
1871 )
1872
1873 # Some systems want crypt() from libcrypt, *not* the version in OpenSSL,
1874 # because the system crypt() is more featureful.
1875 if test "x$check_for_libcrypt_before" = "x1"; then
1876         AC_CHECK_LIB(crypt, crypt)
1877 fi
1878
1879 # Some Linux systems (Slackware) need crypt() from libcrypt, *not* the
1880 # version in OpenSSL.
1881 if test "x$check_for_libcrypt_later" = "x1"; then
1882         AC_CHECK_LIB(crypt, crypt, LIBS="$LIBS -lcrypt")
1883 fi
1884
1885 # Search for SHA256 support in libc and/or OpenSSL
1886 AC_CHECK_FUNCS(SHA256_Update EVP_sha256)
1887
1888 AC_CHECK_LIB(iaf, ia_openinfo)
1889
1890 ### Configure cryptographic random number support
1891
1892 # Check wheter OpenSSL seeds itself
1893 AC_MSG_CHECKING([whether OpenSSL's PRNG is internally seeded])
1894 AC_RUN_IFELSE(
1895         [AC_LANG_SOURCE([[
1896 #include <string.h>
1897 #include <openssl/rand.h>
1898 int main(void) { exit(RAND_status() == 1 ? 0 : 1); }
1899         ]])],
1900         [
1901                 OPENSSL_SEEDS_ITSELF=yes
1902                 AC_MSG_RESULT(yes)
1903         ],
1904         [
1905                 AC_MSG_RESULT(no)
1906                 # Default to use of the rand helper if OpenSSL doesn't
1907                 # seed itself
1908                 USE_RAND_HELPER=yes
1909         ],
1910         [
1911                 AC_MSG_WARN([cross compiling: assuming yes])
1912                 # This is safe, since all recent OpenSSL versions will
1913                 # complain at runtime if not seeded correctly.
1914                 OPENSSL_SEEDS_ITSELF=yes
1915         ]
1916 )
1917
1918
1919 # Do we want to force the use of the rand helper?
1920 AC_ARG_WITH(rand-helper,
1921         [  --with-rand-helper      Use subprocess to gather strong randomness ],
1922         [
1923                 if test "x$withval" = "xno" ; then
1924                         # Force use of OpenSSL's internal RNG, even if
1925                         # the previous test showed it to be unseeded.
1926                         if test -z "$OPENSSL_SEEDS_ITSELF" ; then
1927                                 AC_MSG_WARN([*** Forcing use of OpenSSL's non-self-seeding PRNG])
1928                                 OPENSSL_SEEDS_ITSELF=yes
1929                                 USE_RAND_HELPER=""
1930                         fi
1931                 else
1932                         USE_RAND_HELPER=yes
1933                 fi
1934         ],
1935 )
1936
1937 # Which randomness source do we use?
1938 if test ! -z "$OPENSSL_SEEDS_ITSELF" && test -z "$USE_RAND_HELPER" ; then
1939         # OpenSSL only
1940         AC_DEFINE(OPENSSL_PRNG_ONLY, 1,
1941                 [Define if you want OpenSSL's internally seeded PRNG only])
1942         RAND_MSG="OpenSSL internal ONLY"
1943         INSTALL_SSH_RAND_HELPER=""
1944 elif test ! -z "$USE_RAND_HELPER" ; then
1945         # install rand helper
1946         RAND_MSG="ssh-rand-helper"
1947         INSTALL_SSH_RAND_HELPER="yes"
1948 fi
1949 AC_SUBST(INSTALL_SSH_RAND_HELPER)
1950
1951 ### Configuration of ssh-rand-helper
1952
1953 # PRNGD TCP socket
1954 AC_ARG_WITH(prngd-port,
1955         [  --with-prngd-port=PORT  read entropy from PRNGD/EGD TCP localhost:PORT],
1956         [
1957                 case "$withval" in
1958                 no)
1959                         withval=""
1960                         ;;
1961                 [[0-9]]*)
1962                         ;;
1963                 *)
1964                         AC_MSG_ERROR(You must specify a numeric port number for --with-prngd-port)
1965                         ;;
1966                 esac
1967                 if test ! -z "$withval" ; then
1968                         PRNGD_PORT="$withval"
1969                         AC_DEFINE_UNQUOTED(PRNGD_PORT, $PRNGD_PORT,
1970                                 [Port number of PRNGD/EGD random number socket])
1971                 fi
1972         ]
1973 )
1974
1975 # PRNGD Unix domain socket
1976 AC_ARG_WITH(prngd-socket,
1977         [  --with-prngd-socket=FILE read entropy from PRNGD/EGD socket FILE (default=/var/run/egd-pool)],
1978         [
1979                 case "$withval" in
1980                 yes)
1981                         withval="/var/run/egd-pool"
1982                         ;;
1983                 no)
1984                         withval=""
1985                         ;;
1986                 /*)
1987                         ;;
1988                 *)
1989                         AC_MSG_ERROR(You must specify an absolute path to the entropy socket)
1990                         ;;
1991                 esac
1992
1993                 if test ! -z "$withval" ; then
1994                         if test ! -z "$PRNGD_PORT" ; then
1995                                 AC_MSG_ERROR(You may not specify both a PRNGD/EGD port and socket)
1996                         fi
1997                         if test ! -r "$withval" ; then
1998                                 AC_MSG_WARN(Entropy socket is not readable)
1999                         fi
2000                         PRNGD_SOCKET="$withval"
2001                         AC_DEFINE_UNQUOTED(PRNGD_SOCKET, "$PRNGD_SOCKET",
2002                                 [Location of PRNGD/EGD random number socket])
2003                 fi
2004         ],
2005         [
2006                 # Check for existing socket only if we don't have a random device already
2007                 if test "$USE_RAND_HELPER" = yes ; then
2008                         AC_MSG_CHECKING(for PRNGD/EGD socket)
2009                         # Insert other locations here
2010                         for sock in /var/run/egd-pool /dev/egd-pool /etc/entropy; do
2011                                 if test -r $sock && $TEST_MINUS_S_SH -c "test -S $sock -o -p $sock" ; then
2012                                         PRNGD_SOCKET="$sock"
2013                                         AC_DEFINE_UNQUOTED(PRNGD_SOCKET, "$PRNGD_SOCKET")
2014                                         break;
2015                                 fi
2016                         done
2017                         if test ! -z "$PRNGD_SOCKET" ; then
2018                                 AC_MSG_RESULT($PRNGD_SOCKET)
2019                         else
2020                                 AC_MSG_RESULT(not found)
2021                         fi
2022                 fi
2023         ]
2024 )
2025
2026 # Change default command timeout for hashing entropy source
2027 entropy_timeout=200
2028 AC_ARG_WITH(entropy-timeout,
2029         [  --with-entropy-timeout  Specify entropy gathering command timeout (msec)],
2030         [
2031                 if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
2032                     test "x${withval}" != "xyes"; then
2033                         entropy_timeout=$withval
2034                 fi
2035         ]
2036 )
2037 AC_DEFINE_UNQUOTED(ENTROPY_TIMEOUT_MSEC, $entropy_timeout,
2038         [Builtin PRNG command timeout])
2039
2040 SSH_PRIVSEP_USER=sshd
2041 AC_ARG_WITH(privsep-user,
2042         [  --with-privsep-user=user Specify non-privileged user for privilege separation],
2043         [
2044                 if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
2045                     test "x${withval}" != "xyes"; then
2046                         SSH_PRIVSEP_USER=$withval
2047                 fi
2048         ]
2049 )
2050 AC_DEFINE_UNQUOTED(SSH_PRIVSEP_USER, "$SSH_PRIVSEP_USER",
2051         [non-privileged user for privilege separation])
2052 AC_SUBST(SSH_PRIVSEP_USER)
2053
2054 # We do this little dance with the search path to insure
2055 # that programs that we select for use by installed programs
2056 # (which may be run by the super-user) come from trusted
2057 # locations before they come from the user's private area.
2058 # This should help avoid accidentally configuring some
2059 # random version of a program in someone's personal bin.
2060
2061 OPATH=$PATH
2062 PATH=/bin:/usr/bin
2063 test -h /bin 2> /dev/null && PATH=/usr/bin
2064 test -d /sbin && PATH=$PATH:/sbin
2065 test -d /usr/sbin && PATH=$PATH:/usr/sbin
2066 PATH=$PATH:/etc:$OPATH
2067
2068 # These programs are used by the command hashing source to gather entropy
2069 OSSH_PATH_ENTROPY_PROG(PROG_LS, ls)
2070 OSSH_PATH_ENTROPY_PROG(PROG_NETSTAT, netstat)
2071 OSSH_PATH_ENTROPY_PROG(PROG_ARP, arp)
2072 OSSH_PATH_ENTROPY_PROG(PROG_IFCONFIG, ifconfig)
2073 OSSH_PATH_ENTROPY_PROG(PROG_JSTAT, jstat)
2074 OSSH_PATH_ENTROPY_PROG(PROG_PS, ps)
2075 OSSH_PATH_ENTROPY_PROG(PROG_SAR, sar)
2076 OSSH_PATH_ENTROPY_PROG(PROG_W, w)
2077 OSSH_PATH_ENTROPY_PROG(PROG_WHO, who)
2078 OSSH_PATH_ENTROPY_PROG(PROG_LAST, last)
2079 OSSH_PATH_ENTROPY_PROG(PROG_LASTLOG, lastlog)
2080 OSSH_PATH_ENTROPY_PROG(PROG_DF, df)
2081 OSSH_PATH_ENTROPY_PROG(PROG_VMSTAT, vmstat)
2082 OSSH_PATH_ENTROPY_PROG(PROG_UPTIME, uptime)
2083 OSSH_PATH_ENTROPY_PROG(PROG_IPCS, ipcs)
2084 OSSH_PATH_ENTROPY_PROG(PROG_TAIL, tail)
2085 # restore PATH
2086 PATH=$OPATH
2087
2088 # Where does ssh-rand-helper get its randomness from?
2089 INSTALL_SSH_PRNG_CMDS=""
2090 if test ! -z "$INSTALL_SSH_RAND_HELPER" ; then
2091         if test ! -z "$PRNGD_PORT" ; then
2092                 RAND_HELPER_MSG="TCP localhost:$PRNGD_PORT"
2093         elif test ! -z "$PRNGD_SOCKET" ; then
2094                 RAND_HELPER_MSG="Unix domain socket \"$PRNGD_SOCKET\""
2095         else
2096                 RAND_HELPER_MSG="Command hashing (timeout $entropy_timeout)"
2097                 RAND_HELPER_CMDHASH=yes
2098                 INSTALL_SSH_PRNG_CMDS="yes"
2099         fi
2100 fi
2101 AC_SUBST(INSTALL_SSH_PRNG_CMDS)
2102
2103
2104 # Cheap hack to ensure NEWS-OS libraries are arranged right.
2105 if test ! -z "$SONY" ; then
2106   LIBS="$LIBS -liberty";
2107 fi
2108
2109 # Check for  long long datatypes
2110 AC_CHECK_TYPES([long long, unsigned long long, long double])
2111
2112 # Check datatype sizes
2113 AC_CHECK_SIZEOF(char, 1)
2114 AC_CHECK_SIZEOF(short int, 2)
2115 AC_CHECK_SIZEOF(int, 4)
2116 AC_CHECK_SIZEOF(long int, 4)
2117 AC_CHECK_SIZEOF(long long int, 8)
2118
2119 # Sanity check long long for some platforms (AIX)
2120 if test "x$ac_cv_sizeof_long_long_int" = "x4" ; then
2121         ac_cv_sizeof_long_long_int=0
2122 fi
2123
2124 # compute LLONG_MIN and LLONG_MAX if we don't know them.
2125 if test -z "$have_llong_max"; then
2126         AC_MSG_CHECKING([for max value of long long])
2127         AC_RUN_IFELSE(
2128                 [AC_LANG_SOURCE([[
2129 #include <stdio.h>
2130 /* Why is this so damn hard? */
2131 #ifdef __GNUC__
2132 # undef __GNUC__
2133 #endif
2134 #define __USE_ISOC99
2135 #include <limits.h>
2136 #define DATA "conftest.llminmax"
2137 #define my_abs(a) ((a) < 0 ? ((a) * -1) : (a))
2138
2139 /*
2140  * printf in libc on some platforms (eg old Tru64) does not understand %lld so
2141  * we do this the hard way.
2142  */
2143 static int
2144 fprint_ll(FILE *f, long long n)
2145 {
2146         unsigned int i;
2147         int l[sizeof(long long) * 8];
2148
2149         if (n < 0)
2150                 if (fprintf(f, "-") < 0)
2151                         return -1;
2152         for (i = 0; n != 0; i++) {
2153                 l[i] = my_abs(n % 10);
2154                 n /= 10;
2155         }
2156         do {
2157                 if (fprintf(f, "%d", l[--i]) < 0)
2158                         return -1;
2159         } while (i != 0);
2160         if (fprintf(f, " ") < 0)
2161                 return -1;
2162         return 0;
2163 }
2164
2165 int main(void) {
2166         FILE *f;
2167         long long i, llmin, llmax = 0;
2168
2169         if((f = fopen(DATA,"w")) == NULL)
2170                 exit(1);
2171
2172 #if defined(LLONG_MIN) && defined(LLONG_MAX)
2173         fprintf(stderr, "Using system header for LLONG_MIN and LLONG_MAX\n");
2174         llmin = LLONG_MIN;
2175         llmax = LLONG_MAX;
2176 #else
2177         fprintf(stderr, "Calculating  LLONG_MIN and LLONG_MAX\n");
2178         /* This will work on one's complement and two's complement */
2179         for (i = 1; i > llmax; i <<= 1, i++)
2180                 llmax = i;
2181         llmin = llmax + 1LL;    /* wrap */
2182 #endif
2183
2184         /* Sanity check */
2185         if (llmin + 1 < llmin || llmin - 1 < llmin || llmax + 1 > llmax
2186             || llmax - 1 > llmax || llmin == llmax || llmin == 0
2187             || llmax == 0 || llmax < LONG_MAX || llmin > LONG_MIN) {
2188                 fprintf(f, "unknown unknown\n");
2189                 exit(2);
2190         }
2191
2192         if (fprint_ll(f, llmin) < 0)
2193                 exit(3);
2194         if (fprint_ll(f, llmax) < 0)
2195                 exit(4);
2196         if (fclose(f) < 0)
2197                 exit(5);
2198         exit(0);
2199 }
2200                 ]])],
2201                 [
2202                         llong_min=`$AWK '{print $1}' conftest.llminmax`
2203                         llong_max=`$AWK '{print $2}' conftest.llminmax`
2204
2205                         AC_MSG_RESULT($llong_max)
2206                         AC_DEFINE_UNQUOTED(LLONG_MAX, [${llong_max}LL],
2207                             [max value of long long calculated by configure])
2208                         AC_MSG_CHECKING([for min value of long long])
2209                         AC_MSG_RESULT($llong_min)
2210                         AC_DEFINE_UNQUOTED(LLONG_MIN, [${llong_min}LL],
2211                             [min value of long long calculated by configure])
2212                 ],
2213                 [
2214                         AC_MSG_RESULT(not found)
2215                 ],
2216                 [
2217                         AC_MSG_WARN([cross compiling: not checking])
2218                 ]
2219         )
2220 fi
2221
2222
2223 # More checks for data types
2224 AC_CACHE_CHECK([for u_int type], ac_cv_have_u_int, [
2225         AC_TRY_COMPILE(
2226                 [ #include <sys/types.h> ],
2227                 [ u_int a; a = 1;],
2228                 [ ac_cv_have_u_int="yes" ],
2229                 [ ac_cv_have_u_int="no" ]
2230         )
2231 ])
2232 if test "x$ac_cv_have_u_int" = "xyes" ; then
2233         AC_DEFINE(HAVE_U_INT, 1, [define if you have u_int data type])
2234         have_u_int=1
2235 fi
2236
2237 AC_CACHE_CHECK([for intXX_t types], ac_cv_have_intxx_t, [
2238         AC_TRY_COMPILE(
2239                 [ #include <sys/types.h> ],
2240                 [ int8_t a; int16_t b; int32_t c; a = b = c = 1;],
2241                 [ ac_cv_have_intxx_t="yes" ],
2242                 [ ac_cv_have_intxx_t="no" ]
2243         )
2244 ])
2245 if test "x$ac_cv_have_intxx_t" = "xyes" ; then
2246         AC_DEFINE(HAVE_INTXX_T, 1, [define if you have intxx_t data type])
2247         have_intxx_t=1
2248 fi
2249
2250 if (test -z "$have_intxx_t" && \
2251            test "x$ac_cv_header_stdint_h" = "xyes")
2252 then
2253     AC_MSG_CHECKING([for intXX_t types in stdint.h])
2254         AC_TRY_COMPILE(
2255                 [ #include <stdint.h> ],
2256                 [ int8_t a; int16_t b; int32_t c; a = b = c = 1;],
2257                 [
2258                         AC_DEFINE(HAVE_INTXX_T)
2259                         AC_MSG_RESULT(yes)
2260                 ],
2261                 [ AC_MSG_RESULT(no) ]
2262         )
2263 fi
2264
2265 AC_CACHE_CHECK([for int64_t type], ac_cv_have_int64_t, [
2266         AC_TRY_COMPILE(
2267                 [
2268 #include <sys/types.h>
2269 #ifdef HAVE_STDINT_H
2270 # include <stdint.h>
2271 #endif
2272 #include <sys/socket.h>
2273 #ifdef HAVE_SYS_BITYPES_H
2274 # include <sys/bitypes.h>
2275 #endif
2276                 ],
2277                 [ int64_t a; a = 1;],
2278                 [ ac_cv_have_int64_t="yes" ],
2279                 [ ac_cv_have_int64_t="no" ]
2280         )
2281 ])
2282 if test "x$ac_cv_have_int64_t" = "xyes" ; then
2283         AC_DEFINE(HAVE_INT64_T, 1, [define if you have int64_t data type])
2284 fi
2285
2286 AC_CACHE_CHECK([for u_intXX_t types], ac_cv_have_u_intxx_t, [
2287         AC_TRY_COMPILE(
2288                 [ #include <sys/types.h> ],
2289                 [ u_int8_t a; u_int16_t b; u_int32_t c; a = b = c = 1;],
2290                 [ ac_cv_have_u_intxx_t="yes" ],
2291                 [ ac_cv_have_u_intxx_t="no" ]
2292         )
2293 ])
2294 if test "x$ac_cv_have_u_intxx_t" = "xyes" ; then
2295         AC_DEFINE(HAVE_U_INTXX_T, 1, [define if you have u_intxx_t data type])
2296         have_u_intxx_t=1
2297 fi
2298
2299 if test -z "$have_u_intxx_t" ; then
2300     AC_MSG_CHECKING([for u_intXX_t types in sys/socket.h])
2301         AC_TRY_COMPILE(
2302                 [ #include <sys/socket.h> ],
2303                 [ u_int8_t a; u_int16_t b; u_int32_t c; a = b = c = 1;],
2304                 [
2305                         AC_DEFINE(HAVE_U_INTXX_T)
2306                         AC_MSG_RESULT(yes)
2307                 ],
2308                 [ AC_MSG_RESULT(no) ]
2309         )
2310 fi
2311
2312 AC_CACHE_CHECK([for u_int64_t types], ac_cv_have_u_int64_t, [
2313         AC_TRY_COMPILE(
2314                 [ #include <sys/types.h> ],
2315                 [ u_int64_t a; a = 1;],
2316                 [ ac_cv_have_u_int64_t="yes" ],
2317                 [ ac_cv_have_u_int64_t="no" ]
2318         )
2319 ])
2320 if test "x$ac_cv_have_u_int64_t" = "xyes" ; then
2321         AC_DEFINE(HAVE_U_INT64_T, 1, [define if you have u_int64_t data type])
2322         have_u_int64_t=1
2323 fi
2324
2325 if test -z "$have_u_int64_t" ; then
2326     AC_MSG_CHECKING([for u_int64_t type in sys/bitypes.h])
2327         AC_TRY_COMPILE(
2328                 [ #include <sys/bitypes.h> ],
2329                 [ u_int64_t a; a = 1],
2330                 [
2331                         AC_DEFINE(HAVE_U_INT64_T)
2332                         AC_MSG_RESULT(yes)
2333                 ],
2334                 [ AC_MSG_RESULT(no) ]
2335         )
2336 fi
2337
2338 if test -z "$have_u_intxx_t" ; then
2339         AC_CACHE_CHECK([for uintXX_t types], ac_cv_have_uintxx_t, [
2340                 AC_TRY_COMPILE(
2341                         [
2342 #include <sys/types.h>
2343                         ],
2344                         [ uint8_t a; uint16_t b; uint32_t c; a = b = c = 1; ],
2345                         [ ac_cv_have_uintxx_t="yes" ],
2346                         [ ac_cv_have_uintxx_t="no" ]
2347                 )
2348         ])
2349         if test "x$ac_cv_have_uintxx_t" = "xyes" ; then
2350                 AC_DEFINE(HAVE_UINTXX_T, 1,
2351                         [define if you have uintxx_t data type])
2352         fi
2353 fi
2354
2355 if test -z "$have_uintxx_t" ; then
2356     AC_MSG_CHECKING([for uintXX_t types in stdint.h])
2357         AC_TRY_COMPILE(
2358                 [ #include <stdint.h> ],
2359                 [ uint8_t a; uint16_t b; uint32_t c; a = b = c = 1;],
2360                 [
2361                         AC_DEFINE(HAVE_UINTXX_T)
2362                         AC_MSG_RESULT(yes)
2363                 ],
2364                 [ AC_MSG_RESULT(no) ]
2365         )
2366 fi
2367
2368 if (test -z "$have_u_intxx_t" || test -z "$have_intxx_t" && \
2369            test "x$ac_cv_header_sys_bitypes_h" = "xyes")
2370 then
2371         AC_MSG_CHECKING([for intXX_t and u_intXX_t types in sys/bitypes.h])
2372         AC_TRY_COMPILE(
2373                 [
2374 #include <sys/bitypes.h>
2375                 ],
2376                 [
2377                         int8_t a; int16_t b; int32_t c;
2378                         u_int8_t e; u_int16_t f; u_int32_t g;
2379                         a = b = c = e = f = g = 1;
2380                 ],
2381                 [
2382                         AC_DEFINE(HAVE_U_INTXX_T)
2383                         AC_DEFINE(HAVE_INTXX_T)
2384                         AC_MSG_RESULT(yes)
2385                 ],
2386                 [AC_MSG_RESULT(no)]
2387         )
2388 fi
2389
2390
2391 AC_CACHE_CHECK([for u_char], ac_cv_have_u_char, [
2392         AC_TRY_COMPILE(
2393                 [
2394 #include <sys/types.h>
2395                 ],
2396                 [ u_char foo; foo = 125; ],
2397                 [ ac_cv_have_u_char="yes" ],
2398                 [ ac_cv_have_u_char="no" ]
2399         )
2400 ])
2401 if test "x$ac_cv_have_u_char" = "xyes" ; then
2402         AC_DEFINE(HAVE_U_CHAR, 1, [define if you have u_char data type])
2403 fi
2404
2405 TYPE_SOCKLEN_T
2406
2407 AC_CHECK_TYPES(sig_atomic_t,,,[#include <signal.h>])
2408
2409 AC_CHECK_TYPES(in_addr_t,,,
2410 [#include <sys/types.h>
2411 #include <netinet/in.h>])
2412
2413 AC_CACHE_CHECK([for size_t], ac_cv_have_size_t, [
2414         AC_TRY_COMPILE(
2415                 [
2416 #include <sys/types.h>
2417                 ],
2418                 [ size_t foo; foo = 1235; ],
2419                 [ ac_cv_have_size_t="yes" ],
2420                 [ ac_cv_have_size_t="no" ]
2421         )
2422 ])
2423 if test "x$ac_cv_have_size_t" = "xyes" ; then
2424         AC_DEFINE(HAVE_SIZE_T, 1, [define if you have size_t data type])
2425 fi
2426
2427 AC_CACHE_CHECK([for ssize_t], ac_cv_have_ssize_t, [
2428         AC_TRY_COMPILE(
2429                 [
2430 #include <sys/types.h>
2431                 ],
2432                 [ ssize_t foo; foo = 1235; ],
2433                 [ ac_cv_have_ssize_t="yes" ],
2434                 [ ac_cv_have_ssize_t="no" ]
2435         )
2436 ])
2437 if test "x$ac_cv_have_ssize_t" = "xyes" ; then
2438         AC_DEFINE(HAVE_SSIZE_T, 1, [define if you have ssize_t data type])
2439 fi
2440
2441 AC_CACHE_CHECK([for clock_t], ac_cv_have_clock_t, [
2442         AC_TRY_COMPILE(
2443                 [
2444 #include <time.h>
2445                 ],
2446                 [ clock_t foo; foo = 1235; ],
2447                 [ ac_cv_have_clock_t="yes" ],
2448                 [ ac_cv_have_clock_t="no" ]
2449         )
2450 ])
2451 if test "x$ac_cv_have_clock_t" = "xyes" ; then
2452         AC_DEFINE(HAVE_CLOCK_T, 1, [define if you have clock_t data type])
2453 fi
2454
2455 AC_CACHE_CHECK([for sa_family_t], ac_cv_have_sa_family_t, [
2456         AC_TRY_COMPILE(
2457                 [
2458 #include <sys/types.h>
2459 #include <sys/socket.h>
2460                 ],
2461                 [ sa_family_t foo; foo = 1235; ],
2462                 [ ac_cv_have_sa_family_t="yes" ],
2463                 [ AC_TRY_COMPILE(
2464                   [
2465 #include <sys/types.h>
2466 #include <sys/socket.h>
2467 #include <netinet/in.h>
2468                 ],
2469                 [ sa_family_t foo; foo = 1235; ],
2470                 [ ac_cv_have_sa_family_t="yes" ],
2471
2472                 [ ac_cv_have_sa_family_t="no" ]
2473         )]
2474         )
2475 ])
2476 if test "x$ac_cv_have_sa_family_t" = "xyes" ; then
2477         AC_DEFINE(HAVE_SA_FAMILY_T, 1,
2478                 [define if you have sa_family_t data type])
2479 fi
2480
2481 AC_CACHE_CHECK([for pid_t], ac_cv_have_pid_t, [
2482         AC_TRY_COMPILE(
2483                 [
2484 #include <sys/types.h>
2485                 ],
2486                 [ pid_t foo; foo = 1235; ],
2487                 [ ac_cv_have_pid_t="yes" ],
2488                 [ ac_cv_have_pid_t="no" ]
2489         )
2490 ])
2491 if test "x$ac_cv_have_pid_t" = "xyes" ; then
2492         AC_DEFINE(HAVE_PID_T, 1, [define if you have pid_t data type])
2493 fi
2494
2495 AC_CACHE_CHECK([for mode_t], ac_cv_have_mode_t, [
2496         AC_TRY_COMPILE(
2497                 [
2498 #include <sys/types.h>
2499                 ],
2500                 [ mode_t foo; foo = 1235; ],
2501                 [ ac_cv_have_mode_t="yes" ],
2502                 [ ac_cv_have_mode_t="no" ]
2503         )
2504 ])
2505 if test "x$ac_cv_have_mode_t" = "xyes" ; then
2506         AC_DEFINE(HAVE_MODE_T, 1, [define if you have mode_t data type])
2507 fi
2508
2509
2510 AC_CACHE_CHECK([for struct sockaddr_storage], ac_cv_have_struct_sockaddr_storage, [
2511         AC_TRY_COMPILE(
2512                 [
2513 #include <sys/types.h>
2514 #include <sys/socket.h>
2515                 ],
2516                 [ struct sockaddr_storage s; ],
2517                 [ ac_cv_have_struct_sockaddr_storage="yes" ],
2518                 [ ac_cv_have_struct_sockaddr_storage="no" ]
2519         )
2520 ])
2521 if test "x$ac_cv_have_struct_sockaddr_storage" = "xyes" ; then
2522         AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE, 1,
2523                 [define if you have struct sockaddr_storage data type])
2524 fi
2525
2526 AC_CACHE_CHECK([for struct sockaddr_in6], ac_cv_have_struct_sockaddr_in6, [
2527         AC_TRY_COMPILE(
2528                 [
2529 #include <sys/types.h>
2530 #include <netinet/in.h>
2531                 ],
2532                 [ struct sockaddr_in6 s; s.sin6_family = 0; ],
2533                 [ ac_cv_have_struct_sockaddr_in6="yes" ],
2534                 [ ac_cv_have_struct_sockaddr_in6="no" ]
2535         )
2536 ])
2537 if test "x$ac_cv_have_struct_sockaddr_in6" = "xyes" ; then
2538         AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6, 1,
2539                 [define if you have struct sockaddr_in6 data type])
2540 fi
2541
2542 AC_CACHE_CHECK([for struct in6_addr], ac_cv_have_struct_in6_addr, [
2543         AC_TRY_COMPILE(
2544                 [
2545 #include <sys/types.h>
2546 #include <netinet/in.h>
2547                 ],
2548                 [ struct in6_addr s; s.s6_addr[0] = 0; ],
2549                 [ ac_cv_have_struct_in6_addr="yes" ],
2550                 [ ac_cv_have_struct_in6_addr="no" ]
2551         )
2552 ])
2553 if test "x$ac_cv_have_struct_in6_addr" = "xyes" ; then
2554         AC_DEFINE(HAVE_STRUCT_IN6_ADDR, 1,
2555                 [define if you have struct in6_addr data type])
2556 fi
2557
2558 AC_CACHE_CHECK([for struct addrinfo], ac_cv_have_struct_addrinfo, [
2559         AC_TRY_COMPILE(
2560                 [
2561 #include <sys/types.h>
2562 #include <sys/socket.h>
2563 #include <netdb.h>
2564                 ],
2565                 [ struct addrinfo s; s.ai_flags = AI_PASSIVE; ],
2566                 [ ac_cv_have_struct_addrinfo="yes" ],
2567                 [ ac_cv_have_struct_addrinfo="no" ]
2568         )
2569 ])
2570 if test "x$ac_cv_have_struct_addrinfo" = "xyes" ; then
2571         AC_DEFINE(HAVE_STRUCT_ADDRINFO, 1,
2572                 [define if you have struct addrinfo data type])
2573 fi
2574
2575 AC_CACHE_CHECK([for struct timeval], ac_cv_have_struct_timeval, [
2576         AC_TRY_COMPILE(
2577                 [ #include <sys/time.h> ],
2578                 [ struct timeval tv; tv.tv_sec = 1;],
2579                 [ ac_cv_have_struct_timeval="yes" ],
2580                 [ ac_cv_have_struct_timeval="no" ]
2581         )
2582 ])
2583 if test "x$ac_cv_have_struct_timeval" = "xyes" ; then
2584         AC_DEFINE(HAVE_STRUCT_TIMEVAL, 1, [define if you have struct timeval])
2585         have_struct_timeval=1
2586 fi
2587
2588 AC_CHECK_TYPES(struct timespec)
2589
2590 # We need int64_t or else certian parts of the compile will fail.
2591 if test "x$ac_cv_have_int64_t" = "xno" && \
2592         test "x$ac_cv_sizeof_long_int" != "x8" && \
2593         test "x$ac_cv_sizeof_long_long_int" = "x0" ; then
2594         echo "OpenSSH requires int64_t support.  Contact your vendor or install"
2595         echo "an alternative compiler (I.E., GCC) before continuing."
2596         echo ""
2597         exit 1;
2598 else
2599 dnl test snprintf (broken on SCO w/gcc)
2600         AC_RUN_IFELSE(
2601                 [AC_LANG_SOURCE([[
2602 #include <stdio.h>
2603 #include <string.h>
2604 #ifdef HAVE_SNPRINTF
2605 main()
2606 {
2607         char buf[50];
2608         char expected_out[50];
2609         int mazsize = 50 ;
2610 #if (SIZEOF_LONG_INT == 8)
2611         long int num = 0x7fffffffffffffff;
2612 #else
2613         long long num = 0x7fffffffffffffffll;
2614 #endif
2615         strcpy(expected_out, "9223372036854775807");
2616         snprintf(buf, mazsize, "%lld", num);
2617         if(strcmp(buf, expected_out) != 0)
2618                 exit(1);
2619         exit(0);
2620 }
2621 #else
2622 main() { exit(0); }
2623 #endif
2624                 ]])], [ true ], [ AC_DEFINE(BROKEN_SNPRINTF) ],
2625                 AC_MSG_WARN([cross compiling: Assuming working snprintf()])
2626         )
2627 fi
2628
2629 dnl Checks for structure members
2630 OSSH_CHECK_HEADER_FOR_FIELD(ut_host, utmp.h, HAVE_HOST_IN_UTMP)
2631 OSSH_CHECK_HEADER_FOR_FIELD(ut_host, utmpx.h, HAVE_HOST_IN_UTMPX)
2632 OSSH_CHECK_HEADER_FOR_FIELD(syslen, utmpx.h, HAVE_SYSLEN_IN_UTMPX)
2633 OSSH_CHECK_HEADER_FOR_FIELD(ut_pid, utmp.h, HAVE_PID_IN_UTMP)
2634 OSSH_CHECK_HEADER_FOR_FIELD(ut_type, utmp.h, HAVE_TYPE_IN_UTMP)
2635 OSSH_CHECK_HEADER_FOR_FIELD(ut_type, utmpx.h, HAVE_TYPE_IN_UTMPX)
2636 OSSH_CHECK_HEADER_FOR_FIELD(ut_tv, utmp.h, HAVE_TV_IN_UTMP)
2637 OSSH_CHECK_HEADER_FOR_FIELD(ut_id, utmp.h, HAVE_ID_IN_UTMP)
2638 OSSH_CHECK_HEADER_FOR_FIELD(ut_id, utmpx.h, HAVE_ID_IN_UTMPX)
2639 OSSH_CHECK_HEADER_FOR_FIELD(ut_addr, utmp.h, HAVE_ADDR_IN_UTMP)
2640 OSSH_CHECK_HEADER_FOR_FIELD(ut_addr, utmpx.h, HAVE_ADDR_IN_UTMPX)
2641 OSSH_CHECK_HEADER_FOR_FIELD(ut_addr_v6, utmp.h, HAVE_ADDR_V6_IN_UTMP)
2642 OSSH_CHECK_HEADER_FOR_FIELD(ut_addr_v6, utmpx.h, HAVE_ADDR_V6_IN_UTMPX)
2643 OSSH_CHECK_HEADER_FOR_FIELD(ut_exit, utmp.h, HAVE_EXIT_IN_UTMP)
2644 OSSH_CHECK_HEADER_FOR_FIELD(ut_time, utmp.h, HAVE_TIME_IN_UTMP)
2645 OSSH_CHECK_HEADER_FOR_FIELD(ut_time, utmpx.h, HAVE_TIME_IN_UTMPX)
2646 OSSH_CHECK_HEADER_FOR_FIELD(ut_tv, utmpx.h, HAVE_TV_IN_UTMPX)
2647
2648 AC_CHECK_MEMBERS([struct stat.st_blksize])
2649 AC_CHECK_MEMBER([struct __res_state.retrans], [], [AC_DEFINE(__res_state, state,
2650         [Define if we don't have struct __res_state in resolv.h])],
2651 [
2652 #include <stdio.h>
2653 #if HAVE_SYS_TYPES_H
2654 # include <sys/types.h>
2655 #endif
2656 #include <netinet/in.h>
2657 #include <arpa/nameser.h>
2658 #include <resolv.h>
2659 ])
2660
2661 AC_CACHE_CHECK([for ss_family field in struct sockaddr_storage],
2662                 ac_cv_have_ss_family_in_struct_ss, [
2663         AC_TRY_COMPILE(
2664                 [
2665 #include <sys/types.h>
2666 #include <sys/socket.h>
2667                 ],
2668                 [ struct sockaddr_storage s; s.ss_family = 1; ],
2669                 [ ac_cv_have_ss_family_in_struct_ss="yes" ],
2670                 [ ac_cv_have_ss_family_in_struct_ss="no" ],
2671         )
2672 ])
2673 if test "x$ac_cv_have_ss_family_in_struct_ss" = "xyes" ; then
2674         AC_DEFINE(HAVE_SS_FAMILY_IN_SS, 1, [Fields in struct sockaddr_storage])
2675 fi
2676
2677 AC_CACHE_CHECK([for __ss_family field in struct sockaddr_storage],
2678                 ac_cv_have___ss_family_in_struct_ss, [
2679         AC_TRY_COMPILE(
2680                 [
2681 #include <sys/types.h>
2682 #include <sys/socket.h>
2683                 ],
2684                 [ struct sockaddr_storage s; s.__ss_family = 1; ],
2685                 [ ac_cv_have___ss_family_in_struct_ss="yes" ],
2686                 [ ac_cv_have___ss_family_in_struct_ss="no" ]
2687         )
2688 ])
2689 if test "x$ac_cv_have___ss_family_in_struct_ss" = "xyes" ; then
2690         AC_DEFINE(HAVE___SS_FAMILY_IN_SS, 1,
2691                 [Fields in struct sockaddr_storage])
2692 fi
2693
2694 AC_CACHE_CHECK([for pw_class field in struct passwd],
2695                 ac_cv_have_pw_class_in_struct_passwd, [
2696         AC_TRY_COMPILE(
2697                 [
2698 #include <pwd.h>
2699                 ],
2700                 [ struct passwd p; p.pw_class = 0; ],
2701                 [ ac_cv_have_pw_class_in_struct_passwd="yes" ],
2702                 [ ac_cv_have_pw_class_in_struct_passwd="no" ]
2703         )
2704 ])
2705 if test "x$ac_cv_have_pw_class_in_struct_passwd" = "xyes" ; then
2706         AC_DEFINE(HAVE_PW_CLASS_IN_PASSWD, 1,
2707                 [Define if your password has a pw_class field])
2708 fi
2709
2710 AC_CACHE_CHECK([for pw_expire field in struct passwd],
2711                 ac_cv_have_pw_expire_in_struct_passwd, [
2712         AC_TRY_COMPILE(
2713                 [
2714 #include <pwd.h>
2715                 ],
2716                 [ struct passwd p; p.pw_expire = 0; ],
2717                 [ ac_cv_have_pw_expire_in_struct_passwd="yes" ],
2718                 [ ac_cv_have_pw_expire_in_struct_passwd="no" ]
2719         )
2720 ])
2721 if test "x$ac_cv_have_pw_expire_in_struct_passwd" = "xyes" ; then
2722         AC_DEFINE(HAVE_PW_EXPIRE_IN_PASSWD, 1,
2723                 [Define if your password has a pw_expire field])
2724 fi
2725
2726 AC_CACHE_CHECK([for pw_change field in struct passwd],
2727                 ac_cv_have_pw_change_in_struct_passwd, [
2728         AC_TRY_COMPILE(
2729                 [
2730 #include <pwd.h>
2731                 ],
2732                 [ struct passwd p; p.pw_change = 0; ],
2733                 [ ac_cv_have_pw_change_in_struct_passwd="yes" ],
2734                 [ ac_cv_have_pw_change_in_struct_passwd="no" ]
2735         )
2736 ])
2737 if test "x$ac_cv_have_pw_change_in_struct_passwd" = "xyes" ; then
2738         AC_DEFINE(HAVE_PW_CHANGE_IN_PASSWD, 1,
2739                 [Define if your password has a pw_change field])
2740 fi
2741
2742 dnl make sure we're using the real structure members and not defines
2743 AC_CACHE_CHECK([for msg_accrights field in struct msghdr],
2744                 ac_cv_have_accrights_in_msghdr, [
2745         AC_COMPILE_IFELSE(
2746                 [
2747 #include <sys/types.h>
2748 #include <sys/socket.h>
2749 #include <sys/uio.h>
2750 int main() {
2751 #ifdef msg_accrights
2752 #error "msg_accrights is a macro"
2753 exit(1);
2754 #endif
2755 struct msghdr m;
2756 m.msg_accrights = 0;
2757 exit(0);
2758 }
2759                 ],
2760                 [ ac_cv_have_accrights_in_msghdr="yes" ],
2761                 [ ac_cv_have_accrights_in_msghdr="no" ]
2762         )
2763 ])
2764 if test "x$ac_cv_have_accrights_in_msghdr" = "xyes" ; then
2765         AC_DEFINE(HAVE_ACCRIGHTS_IN_MSGHDR, 1,
2766                 [Define if your system uses access rights style
2767                 file descriptor passing])
2768 fi
2769
2770 AC_CACHE_CHECK([for msg_control field in struct msghdr],
2771                 ac_cv_have_control_in_msghdr, [
2772         AC_COMPILE_IFELSE(
2773                 [
2774 #include <sys/types.h>
2775 #include <sys/socket.h>
2776 #include <sys/uio.h>
2777 int main() {
2778 #ifdef msg_control
2779 #error "msg_control is a macro"
2780 exit(1);
2781 #endif
2782 struct msghdr m;
2783 m.msg_control = 0;
2784 exit(0);
2785 }
2786                 ],
2787                 [ ac_cv_have_control_in_msghdr="yes" ],
2788                 [ ac_cv_have_control_in_msghdr="no" ]
2789         )
2790 ])
2791 if test "x$ac_cv_have_control_in_msghdr" = "xyes" ; then
2792         AC_DEFINE(HAVE_CONTROL_IN_MSGHDR, 1,
2793                 [Define if your system uses ancillary data style
2794                 file descriptor passing])
2795 fi
2796
2797 AC_CACHE_CHECK([if libc defines __progname], ac_cv_libc_defines___progname, [
2798         AC_TRY_LINK([],
2799                 [ extern char *__progname; printf("%s", __progname); ],
2800                 [ ac_cv_libc_defines___progname="yes" ],
2801                 [ ac_cv_libc_defines___progname="no" ]
2802         )
2803 ])
2804 if test "x$ac_cv_libc_defines___progname" = "xyes" ; then
2805         AC_DEFINE(HAVE___PROGNAME, 1, [Define if libc defines __progname])
2806 fi
2807
2808 AC_CACHE_CHECK([whether $CC implements __FUNCTION__], ac_cv_cc_implements___FUNCTION__, [
2809         AC_TRY_LINK([
2810 #include <stdio.h>
2811 ],
2812                 [ printf("%s", __FUNCTION__); ],
2813                 [ ac_cv_cc_implements___FUNCTION__="yes" ],
2814                 [ ac_cv_cc_implements___FUNCTION__="no" ]
2815         )
2816 ])
2817 if test "x$ac_cv_cc_implements___FUNCTION__" = "xyes" ; then
2818         AC_DEFINE(HAVE___FUNCTION__, 1,
2819                 [Define if compiler implements __FUNCTION__])
2820 fi
2821
2822 AC_CACHE_CHECK([whether $CC implements __func__], ac_cv_cc_implements___func__, [
2823         AC_TRY_LINK([
2824 #include <stdio.h>
2825 ],
2826                 [ printf("%s", __func__); ],
2827                 [ ac_cv_cc_implements___func__="yes" ],
2828                 [ ac_cv_cc_implements___func__="no" ]
2829         )
2830 ])
2831 if test "x$ac_cv_cc_implements___func__" = "xyes" ; then
2832         AC_DEFINE(HAVE___func__, 1, [Define if compiler implements __func__])
2833 fi
2834
2835 AC_CACHE_CHECK([whether va_copy exists], ac_cv_have_va_copy, [
2836         AC_TRY_LINK(
2837                 [#include <stdarg.h>
2838                  va_list x,y;],
2839                 [va_copy(x,y);],
2840                 [ ac_cv_have_va_copy="yes" ],
2841                 [ ac_cv_have_va_copy="no" ]
2842         )
2843 ])
2844 if test "x$ac_cv_have_va_copy" = "xyes" ; then
2845         AC_DEFINE(HAVE_VA_COPY, 1, [Define if va_copy exists])
2846 fi
2847
2848 AC_CACHE_CHECK([whether __va_copy exists], ac_cv_have___va_copy, [
2849         AC_TRY_LINK(
2850                 [#include <stdarg.h>
2851                  va_list x,y;],
2852                 [__va_copy(x,y);],
2853                 [ ac_cv_have___va_copy="yes" ],
2854                 [ ac_cv_have___va_copy="no" ]
2855         )
2856 ])
2857 if test "x$ac_cv_have___va_copy" = "xyes" ; then
2858         AC_DEFINE(HAVE___VA_COPY, 1, [Define if __va_copy exists])
2859 fi
2860
2861 AC_CACHE_CHECK([whether getopt has optreset support],
2862                 ac_cv_have_getopt_optreset, [
2863         AC_TRY_LINK(
2864                 [
2865 #include <getopt.h>
2866                 ],
2867                 [ extern int optreset; optreset = 0; ],
2868                 [ ac_cv_have_getopt_optreset="yes" ],
2869                 [ ac_cv_have_getopt_optreset="no" ]
2870         )
2871 ])
2872 if test "x$ac_cv_have_getopt_optreset" = "xyes" ; then
2873         AC_DEFINE(HAVE_GETOPT_OPTRESET, 1,
2874                 [Define if your getopt(3) defines and uses optreset])
2875 fi
2876
2877 AC_CACHE_CHECK([if libc defines sys_errlist], ac_cv_libc_defines_sys_errlist, [
2878         AC_TRY_LINK([],
2879                 [ extern const char *const sys_errlist[]; printf("%s", sys_errlist[0]);],
2880                 [ ac_cv_libc_defines_sys_errlist="yes" ],
2881                 [ ac_cv_libc_defines_sys_errlist="no" ]
2882         )
2883 ])
2884 if test "x$ac_cv_libc_defines_sys_errlist" = "xyes" ; then
2885         AC_DEFINE(HAVE_SYS_ERRLIST, 1,
2886                 [Define if your system defines sys_errlist[]])
2887 fi
2888
2889
2890 AC_CACHE_CHECK([if libc defines sys_nerr], ac_cv_libc_defines_sys_nerr, [
2891         AC_TRY_LINK([],
2892                 [ extern int sys_nerr; printf("%i", sys_nerr);],
2893                 [ ac_cv_libc_defines_sys_nerr="yes" ],
2894                 [ ac_cv_libc_defines_sys_nerr="no" ]
2895         )
2896 ])
2897 if test "x$ac_cv_libc_defines_sys_nerr" = "xyes" ; then
2898         AC_DEFINE(HAVE_SYS_NERR, 1, [Define if your system defines sys_nerr])
2899 fi
2900
2901 SCARD_MSG="no"
2902 # Check whether user wants sectok support
2903 AC_ARG_WITH(sectok,
2904         [  --with-sectok           Enable smartcard support using libsectok],
2905         [
2906                 if test "x$withval" != "xno" ; then
2907                         if test "x$withval" != "xyes" ; then
2908                                 CPPFLAGS="$CPPFLAGS -I${withval}"
2909                                 LDFLAGS="$LDFLAGS -L${withval}"
2910                                 if test ! -z "$need_dash_r" ; then
2911                                         LDFLAGS="$LDFLAGS -R${withval}"
2912                                 fi
2913                                 if test ! -z "$blibpath" ; then
2914                                         blibpath="$blibpath:${withval}"
2915                                 fi
2916                         fi
2917                         AC_CHECK_HEADERS(sectok.h)
2918                         if test "$ac_cv_header_sectok_h" != yes; then
2919                                 AC_MSG_ERROR(Can't find sectok.h)
2920                         fi
2921                         AC_CHECK_LIB(sectok, sectok_open)
2922                         if test "$ac_cv_lib_sectok_sectok_open" != yes; then
2923                                 AC_MSG_ERROR(Can't find libsectok)
2924                         fi
2925                         AC_DEFINE(SMARTCARD, 1,
2926                                 [Define if you want smartcard support])
2927                         AC_DEFINE(USE_SECTOK, 1,
2928                                 [Define if you want smartcard support
2929                                 using sectok])
2930                         SCARD_MSG="yes, using sectok"
2931                 fi
2932         ]
2933 )
2934
2935 # Check whether user wants OpenSC support
2936 OPENSC_CONFIG="no"
2937 AC_ARG_WITH(opensc,
2938         [  --with-opensc[[=PFX]]     Enable smartcard support using OpenSC (optionally in PATH)],
2939         [
2940             if test "x$withval" != "xno" ; then
2941                 if test "x$withval" != "xyes" ; then
2942                         OPENSC_CONFIG=$withval/bin/opensc-config
2943                 else
2944                         AC_PATH_PROG(OPENSC_CONFIG, opensc-config, no)
2945                 fi
2946                 if test "$OPENSC_CONFIG" != "no"; then
2947                         LIBOPENSC_CFLAGS=`$OPENSC_CONFIG --cflags`
2948                         LIBOPENSC_LIBS=`$OPENSC_CONFIG --libs`
2949                         CPPFLAGS="$CPPFLAGS $LIBOPENSC_CFLAGS"
2950                         LDFLAGS="$LDFLAGS $LIBOPENSC_LIBS"
2951                         AC_DEFINE(SMARTCARD)
2952                         AC_DEFINE(USE_OPENSC, 1,
2953                                 [Define if you want smartcard support
2954                                 using OpenSC])
2955                         SCARD_MSG="yes, using OpenSC"
2956                 fi
2957             fi
2958         ]
2959 )
2960
2961 # Check libraries needed by DNS fingerprint support
2962 AC_SEARCH_LIBS(getrrsetbyname, resolv,
2963         [AC_DEFINE(HAVE_GETRRSETBYNAME, 1,
2964                 [Define if getrrsetbyname() exists])],
2965         [
2966                 # Needed by our getrrsetbyname()
2967                 AC_SEARCH_LIBS(res_query, resolv)
2968                 AC_SEARCH_LIBS(dn_expand, resolv)
2969                 AC_MSG_CHECKING(if res_query will link)
2970                 AC_TRY_LINK_FUNC(res_query, AC_MSG_RESULT(yes),
2971                    [AC_MSG_RESULT(no)
2972                     saved_LIBS="$LIBS"
2973                     LIBS="$LIBS -lresolv"
2974                     AC_MSG_CHECKING(for res_query in -lresolv)
2975                     AC_LINK_IFELSE([
2976 #include <resolv.h>
2977 int main()
2978 {
2979         res_query (0, 0, 0, 0, 0);
2980         return 0;
2981 }
2982                         ],
2983                         [LIBS="$LIBS -lresolv"
2984                          AC_MSG_RESULT(yes)],
2985                         [LIBS="$saved_LIBS"
2986                          AC_MSG_RESULT(no)])
2987                     ])
2988                 AC_CHECK_FUNCS(_getshort _getlong)
2989                 AC_CHECK_DECLS([_getshort, _getlong], , ,
2990                     [#include <sys/types.h>
2991                     #include <arpa/nameser.h>])
2992                 AC_CHECK_MEMBER(HEADER.ad,
2993                         [AC_DEFINE(HAVE_HEADER_AD, 1,
2994                             [Define if HEADER.ad exists in arpa/nameser.h])],,
2995                         [#include <arpa/nameser.h>])
2996         ])
2997
2998 # Check whether user wants Kerberos 5 support
2999 KRB5_MSG="no"
3000 AC_ARG_WITH(kerberos5,
3001         [  --with-kerberos5=PATH   Enable Kerberos 5 support],
3002         [ if test "x$withval" != "xno" ; then
3003                 if test "x$withval" = "xyes" ; then
3004                         KRB5ROOT="/usr/local"
3005                 else
3006                         KRB5ROOT=${withval}
3007                 fi
3008
3009                 AC_DEFINE(KRB5, 1, [Define if you want Kerberos 5 support])
3010                 KRB5_MSG="yes"
3011
3012                 AC_MSG_CHECKING(for krb5-config)
3013                 if test -x  $KRB5ROOT/bin/krb5-config ; then
3014                         KRB5CONF=$KRB5ROOT/bin/krb5-config
3015                         AC_MSG_RESULT($KRB5CONF)
3016
3017                         AC_MSG_CHECKING(for gssapi support)
3018                         if $KRB5CONF | grep gssapi >/dev/null ; then
3019                                 AC_MSG_RESULT(yes)
3020                                 AC_DEFINE(GSSAPI, 1,
3021                                         [Define this if you want GSSAPI
3022                                         support in the version 2 protocol])
3023                                 k5confopts=gssapi
3024                         else
3025                                 AC_MSG_RESULT(no)
3026                                 k5confopts=""
3027                         fi
3028                         K5CFLAGS="`$KRB5CONF --cflags $k5confopts`"
3029                         K5LIBS="`$KRB5CONF --libs $k5confopts`"
3030                         CPPFLAGS="$CPPFLAGS $K5CFLAGS"
3031                         AC_MSG_CHECKING(whether we are using Heimdal)
3032                         AC_TRY_COMPILE([ #include <krb5.h> ],
3033                                        [ char *tmp = heimdal_version; ],
3034                                        [ AC_MSG_RESULT(yes)
3035                                          AC_DEFINE(HEIMDAL, 1,
3036                                         [Define this if you are using the
3037                                         Heimdal version of Kerberos V5]) ],
3038                                          AC_MSG_RESULT(no)
3039                         )
3040                 else
3041                         AC_MSG_RESULT(no)
3042                         CPPFLAGS="$CPPFLAGS -I${KRB5ROOT}/include"
3043                         LDFLAGS="$LDFLAGS -L${KRB5ROOT}/lib"
3044                         AC_MSG_CHECKING(whether we are using Heimdal)
3045                         AC_TRY_COMPILE([ #include <krb5.h> ],
3046                                        [ char *tmp = heimdal_version; ],
3047                                        [ AC_MSG_RESULT(yes)
3048                                          AC_DEFINE(HEIMDAL)
3049                                          K5LIBS="-lkrb5 -ldes"
3050                                          K5LIBS="$K5LIBS -lcom_err -lasn1"
3051                                          AC_CHECK_LIB(roken, net_write,
3052                                            [K5LIBS="$K5LIBS -lroken"])
3053                                        ],
3054                                        [ AC_MSG_RESULT(no)
3055                                          K5LIBS="-lkrb5 -lk5crypto -lcom_err"
3056                                        ]
3057                         )
3058                         AC_SEARCH_LIBS(dn_expand, resolv)
3059
3060                         AC_CHECK_LIB(gssapi,gss_init_sec_context,
3061                                 [ AC_DEFINE(GSSAPI)
3062                                   K5LIBS="-lgssapi $K5LIBS" ],
3063                                 [ AC_CHECK_LIB(gssapi_krb5,gss_init_sec_context,
3064                                         [ AC_DEFINE(GSSAPI)
3065                                           K5LIBS="-lgssapi_krb5 $K5LIBS" ],
3066                                         AC_MSG_WARN([Cannot find any suitable gss-api library - build may fail]),
3067                                         $K5LIBS)
3068                                 ],
3069                                 $K5LIBS)
3070
3071                         AC_CHECK_HEADER(gssapi.h, ,
3072                                 [ unset ac_cv_header_gssapi_h
3073                                   CPPFLAGS="$CPPFLAGS -I${KRB5ROOT}/include/gssapi"
3074                                   AC_CHECK_HEADERS(gssapi.h, ,
3075                                         AC_MSG_WARN([Cannot find any suitable gss-api header - build may fail])
3076                                   )
3077                                 ]
3078                         )
3079
3080                         oldCPP="$CPPFLAGS"
3081                         CPPFLAGS="$CPPFLAGS -I${KRB5ROOT}/include/gssapi"
3082                         AC_CHECK_HEADER(gssapi_krb5.h, ,
3083                                         [ CPPFLAGS="$oldCPP" ])
3084
3085                 fi
3086                 if test ! -z "$need_dash_r" ; then
3087                         LDFLAGS="$LDFLAGS -R${KRB5ROOT}/lib"
3088                 fi
3089                 if test ! -z "$blibpath" ; then
3090                         blibpath="$blibpath:${KRB5ROOT}/lib"
3091                 fi
3092
3093                 AC_CHECK_HEADERS(gssapi.h gssapi/gssapi.h)
3094                 AC_CHECK_HEADERS(gssapi_krb5.h gssapi/gssapi_krb5.h)
3095                 AC_CHECK_HEADERS(gssapi_generic.h gssapi/gssapi_generic.h)
3096
3097                 LIBS="$LIBS $K5LIBS"
3098                 AC_SEARCH_LIBS(k_hasafs, kafs, AC_DEFINE(USE_AFS, 1,
3099                         [Define this if you want to use libkafs' AFS support]))
3100         fi
3101         ]
3102 )
3103
3104 # Looking for programs, paths and files
3105
3106 PRIVSEP_PATH=/var/empty
3107 AC_ARG_WITH(privsep-path,
3108         [  --with-privsep-path=xxx Path for privilege separation chroot (default=/var/empty)],
3109         [
3110                 if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
3111                     test "x${withval}" != "xyes"; then
3112                         PRIVSEP_PATH=$withval
3113                 fi
3114         ]
3115 )
3116 AC_SUBST(PRIVSEP_PATH)
3117
3118 AC_ARG_WITH(xauth,
3119         [  --with-xauth=PATH       Specify path to xauth program ],
3120         [
3121                 if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
3122                     test "x${withval}" != "xyes"; then
3123                         xauth_path=$withval
3124                 fi
3125         ],
3126         [
3127                 TestPath="$PATH"
3128                 TestPath="${TestPath}${PATH_SEPARATOR}/usr/X/bin"
3129                 TestPath="${TestPath}${PATH_SEPARATOR}/usr/bin/X11"
3130                 TestPath="${TestPath}${PATH_SEPARATOR}/usr/X11R6/bin"
3131                 TestPath="${TestPath}${PATH_SEPARATOR}/usr/openwin/bin"
3132                 AC_PATH_PROG(xauth_path, xauth, , $TestPath)
3133                 if (test ! -z "$xauth_path" && test -x "/usr/openwin/bin/xauth") ; then
3134                         xauth_path="/usr/openwin/bin/xauth"
3135                 fi
3136         ]
3137 )
3138
3139 STRIP_OPT=-s
3140 AC_ARG_ENABLE(strip,
3141         [  --disable-strip         Disable calling strip(1) on install],
3142         [
3143                 if test "x$enableval" = "xno" ; then
3144                         STRIP_OPT=
3145                 fi
3146         ]
3147 )
3148 AC_SUBST(STRIP_OPT)
3149
3150 if test -z "$xauth_path" ; then
3151         XAUTH_PATH="undefined"
3152         AC_SUBST(XAUTH_PATH)
3153 else
3154         AC_DEFINE_UNQUOTED(XAUTH_PATH, "$xauth_path",
3155                 [Define if xauth is found in your path])
3156         XAUTH_PATH=$xauth_path
3157         AC_SUBST(XAUTH_PATH)
3158 fi
3159
3160 # Check for mail directory (last resort if we cannot get it from headers)
3161 if test ! -z "$MAIL" ; then
3162         maildir=`dirname $MAIL`
3163         AC_DEFINE_UNQUOTED(MAIL_DIRECTORY, "$maildir",
3164                 [Set this to your mail directory if you don't have maillock.h])
3165 fi
3166
3167 if test ! -z "$cross_compiling" && test "x$cross_compiling" = "xyes"; then
3168         AC_MSG_WARN([cross compiling: Disabling /dev/ptmx test])
3169         disable_ptmx_check=yes
3170 fi
3171 if test -z "$no_dev_ptmx" ; then
3172         if test "x$disable_ptmx_check" != "xyes" ; then
3173                 AC_CHECK_FILE("/dev/ptmx",
3174                         [
3175                                 AC_DEFINE_UNQUOTED(HAVE_DEV_PTMX, 1,
3176                                         [Define if you have /dev/ptmx])
3177                                 have_dev_ptmx=1
3178                         ]
3179                 )
3180         fi
3181 fi
3182
3183 if test ! -z "$cross_compiling" && test "x$cross_compiling" != "xyes"; then
3184         AC_CHECK_FILE("/dev/ptc",
3185                 [
3186                         AC_DEFINE_UNQUOTED(HAVE_DEV_PTS_AND_PTC, 1,
3187                                 [Define if you have /dev/ptc])
3188                         have_dev_ptc=1
3189                 ]
3190         )
3191 else
3192         AC_MSG_WARN([cross compiling: Disabling /dev/ptc test])
3193 fi
3194
3195 # Options from here on. Some of these are preset by platform above
3196 AC_ARG_WITH(mantype,
3197         [  --with-mantype=man|cat|doc  Set man page type],
3198         [
3199                 case "$withval" in
3200                 man|cat|doc)
3201                         MANTYPE=$withval
3202                         ;;
3203                 *)
3204                         AC_MSG_ERROR(invalid man type: $withval)
3205                         ;;
3206                 esac
3207         ]
3208 )
3209 if test -z "$MANTYPE"; then
3210         TestPath="/usr/bin${PATH_SEPARATOR}/usr/ucb"
3211         AC_PATH_PROGS(NROFF, nroff awf, /bin/false, $TestPath)
3212         if ${NROFF} -mdoc ${srcdir}/ssh.1 >/dev/null 2>&1; then
3213                 MANTYPE=doc
3214         elif ${NROFF} -man ${srcdir}/ssh.1 >/dev/null 2>&1; then
3215                 MANTYPE=man
3216         else
3217                 MANTYPE=cat
3218         fi
3219 fi
3220 AC_SUBST(MANTYPE)
3221 if test "$MANTYPE" = "doc"; then
3222         mansubdir=man;
3223 else
3224         mansubdir=$MANTYPE;
3225 fi
3226 AC_SUBST(mansubdir)
3227
3228 # Check whether to enable MD5 passwords
3229 MD5_MSG="no"
3230 AC_ARG_WITH(md5-passwords,
3231         [  --with-md5-passwords    Enable use of MD5 passwords],
3232         [
3233                 if test "x$withval" != "xno" ; then
3234                         AC_DEFINE(HAVE_MD5_PASSWORDS, 1,
3235                                 [Define if you want to allow MD5 passwords])
3236                         MD5_MSG="yes"
3237                 fi
3238         ]
3239 )
3240
3241 # Whether to disable shadow password support
3242 AC_ARG_WITH(shadow,
3243         [  --without-shadow        Disable shadow password support],
3244         [
3245                 if test "x$withval" = "xno" ; then
3246                         AC_DEFINE(DISABLE_SHADOW)
3247                         disable_shadow=yes
3248                 fi
3249         ]
3250 )
3251
3252 if test -z "$disable_shadow" ; then
3253         AC_MSG_CHECKING([if the systems has expire shadow information])
3254         AC_TRY_COMPILE(
3255         [
3256 #include <sys/types.h>
3257 #include <shadow.h>
3258         struct spwd sp;
3259         ],[ sp.sp_expire = sp.sp_lstchg = sp.sp_inact = 0; ],
3260         [ sp_expire_available=yes ], []
3261         )
3262
3263         if test "x$sp_expire_available" = "xyes" ; then
3264                 AC_MSG_RESULT(yes)
3265                 AC_DEFINE(HAS_SHADOW_EXPIRE, 1,
3266                     [Define if you want to use shadow password expire field])
3267         else
3268                 AC_MSG_RESULT(no)
3269         fi
3270 fi
3271
3272 # Use ip address instead of hostname in $DISPLAY
3273 if test ! -z "$IPADDR_IN_DISPLAY" ; then
3274         DISPLAY_HACK_MSG="yes"
3275         AC_DEFINE(IPADDR_IN_DISPLAY, 1,
3276                 [Define if you need to use IP address
3277                 instead of hostname in $DISPLAY])
3278 else
3279         DISPLAY_HACK_MSG="no"
3280         AC_ARG_WITH(ipaddr-display,
3281                 [  --with-ipaddr-display   Use ip address instead of hostname in \$DISPLAY],
3282                 [
3283                         if test "x$withval" != "xno" ; then
3284                                 AC_DEFINE(IPADDR_IN_DISPLAY)
3285                                 DISPLAY_HACK_MSG="yes"
3286                         fi
3287                 ]
3288         )
3289 fi
3290
3291 # check for /etc/default/login and use it if present.
3292 AC_ARG_ENABLE(etc-default-login,
3293         [  --disable-etc-default-login Disable using PATH from /etc/default/login [no]],
3294         [ if test "x$enableval" = "xno"; then
3295                 AC_MSG_NOTICE([/etc/default/login handling disabled])
3296                 etc_default_login=no
3297           else
3298                 etc_default_login=yes
3299           fi ],
3300         [ if test ! -z "$cross_compiling" && test "x$cross_compiling" = "xyes";
3301           then
3302                 AC_MSG_WARN([cross compiling: not checking /etc/default/login])
3303                 etc_default_login=no
3304           else
3305                 etc_default_login=yes
3306           fi ]
3307 )
3308
3309 if test "x$etc_default_login" != "xno"; then
3310         AC_CHECK_FILE("/etc/default/login",
3311             [ external_path_file=/etc/default/login ])
3312         if test "x$external_path_file" = "x/etc/default/login"; then
3313                 AC_DEFINE(HAVE_ETC_DEFAULT_LOGIN, 1,
3314                         [Define if your system has /etc/default/login])
3315         fi
3316 fi
3317
3318 dnl BSD systems use /etc/login.conf so --with-default-path= has no effect
3319 if test $ac_cv_func_login_getcapbool = "yes" && \
3320         test $ac_cv_header_login_cap_h = "yes" ; then
3321         external_path_file=/etc/login.conf
3322 fi
3323
3324 # Whether to mess with the default path
3325 SERVER_PATH_MSG="(default)"
3326 AC_ARG_WITH(default-path,
3327         [  --with-default-path=    Specify default \$PATH environment for server],
3328         [
3329                 if test "x$external_path_file" = "x/etc/login.conf" ; then
3330                         AC_MSG_WARN([
3331 --with-default-path=PATH has no effect on this system.
3332 Edit /etc/login.conf instead.])
3333                 elif test "x$withval" != "xno" ; then
3334                         if test ! -z "$external_path_file" ; then
3335                                 AC_MSG_WARN([
3336 --with-default-path=PATH will only be used if PATH is not defined in
3337 $external_path_file .])
3338                         fi
3339                         user_path="$withval"
3340                         SERVER_PATH_MSG="$withval"
3341                 fi
3342         ],
3343         [ if test "x$external_path_file" = "x/etc/login.conf" ; then
3344                 AC_MSG_WARN([Make sure the path to scp is in /etc/login.conf])
3345         else
3346                 if test ! -z "$external_path_file" ; then
3347                         AC_MSG_WARN([
3348 If PATH is defined in $external_path_file, ensure the path to scp is included,
3349 otherwise scp will not work.])
3350                 fi
3351                 AC_RUN_IFELSE(
3352                         [AC_LANG_SOURCE([[
3353 /* find out what STDPATH is */
3354 #include <stdio.h>
3355 #ifdef HAVE_PATHS_H
3356 # include <paths.h>
3357 #endif
3358 #ifndef _PATH_STDPATH
3359 # ifdef _PATH_USERPATH  /* Irix */
3360 #  define _PATH_STDPATH _PATH_USERPATH
3361 # else
3362 #  define _PATH_STDPATH "/usr/bin:/bin:/usr/sbin:/sbin"
3363 # endif
3364 #endif
3365 #include <sys/types.h>
3366 #include <sys/stat.h>
3367 #include <fcntl.h>
3368 #define DATA "conftest.stdpath"
3369
3370 main()
3371 {
3372         FILE *fd;
3373         int rc;
3374
3375         fd = fopen(DATA,"w");
3376         if(fd == NULL)
3377                 exit(1);
3378
3379         if ((rc = fprintf(fd,"%s", _PATH_STDPATH)) < 0)
3380                 exit(1);
3381
3382         exit(0);
3383 }
3384                 ]])],
3385                 [ user_path=`cat conftest.stdpath` ],
3386                 [ user_path="/usr/bin:/bin:/usr/sbin:/sbin" ],
3387                 [ user_path="/usr/bin:/bin:/usr/sbin:/sbin" ]
3388         )
3389 # make sure $bindir is in USER_PATH so scp will work
3390                 t_bindir=`eval echo ${bindir}`
3391                 case $t_bindir in
3392                         NONE/*) t_bindir=`echo $t_bindir | sed "s~NONE~$prefix~"` ;;
3393                 esac
3394                 case $t_bindir in
3395                         NONE/*) t_bindir=`echo $t_bindir | sed "s~NONE~$ac_default_prefix~"` ;;
3396                 esac
3397                 echo $user_path | grep ":$t_bindir"  > /dev/null 2>&1
3398                 if test $? -ne 0  ; then
3399                         echo $user_path | grep "^$t_bindir"  > /dev/null 2>&1
3400                         if test $? -ne 0  ; then
3401                                 user_path=$user_path:$t_bindir
3402                                 AC_MSG_RESULT(Adding $t_bindir to USER_PATH so scp will work)
3403                         fi
3404                 fi
3405         fi ]
3406 )
3407 if test "x$external_path_file" != "x/etc/login.conf" ; then
3408         AC_DEFINE_UNQUOTED(USER_PATH, "$user_path", [Specify default $PATH])
3409         AC_SUBST(user_path)
3410 fi
3411
3412 # Set superuser path separately to user path
3413 AC_ARG_WITH(superuser-path,
3414         [  --with-superuser-path=  Specify different path for super-user],
3415         [
3416                 if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
3417                     test "x${withval}" != "xyes"; then
3418                         AC_DEFINE_UNQUOTED(SUPERUSER_PATH, "$withval",
3419                                 [Define if you want a different $PATH
3420                                 for the superuser])
3421                         superuser_path=$withval
3422                 fi
3423         ]
3424 )
3425
3426
3427 AC_MSG_CHECKING([if we need to convert IPv4 in IPv6-mapped addresses])
3428 IPV4_IN6_HACK_MSG="no"
3429 AC_ARG_WITH(4in6,
3430         [  --with-4in6             Check for and convert IPv4 in IPv6 mapped addresses],
3431         [
3432                 if test "x$withval" != "xno" ; then
3433                         AC_MSG_RESULT(yes)
3434                         AC_DEFINE(IPV4_IN_IPV6, 1,
3435                                 [Detect IPv4 in IPv6 mapped addresses
3436                                 and treat as IPv4])
3437                         IPV4_IN6_HACK_MSG="yes"
3438                 else
3439                         AC_MSG_RESULT(no)
3440                 fi
3441         ],[
3442                 if test "x$inet6_default_4in6" = "xyes"; then
3443                         AC_MSG_RESULT([yes (default)])
3444                         AC_DEFINE(IPV4_IN_IPV6)
3445                         IPV4_IN6_HACK_MSG="yes"
3446                 else
3447                         AC_MSG_RESULT([no (default)])
3448                 fi
3449         ]
3450 )
3451
3452 # Whether to enable BSD auth support
3453 BSD_AUTH_MSG=no
3454 AC_ARG_WITH(bsd-auth,
3455         [  --with-bsd-auth         Enable BSD auth support],
3456         [
3457                 if test "x$withval" != "xno" ; then
3458                         AC_DEFINE(BSD_AUTH, 1,
3459                                 [Define if you have BSD auth support])
3460                         BSD_AUTH_MSG=yes
3461                 fi
3462         ]
3463 )
3464
3465 # Where to place sshd.pid
3466 piddir=/var/run
3467 # make sure the directory exists
3468 if test ! -d $piddir ; then
3469         piddir=`eval echo ${sysconfdir}`
3470         case $piddir in
3471                 NONE/*) piddir=`echo $piddir | sed "s~NONE~$ac_default_prefix~"` ;;
3472         esac
3473 fi
3474
3475 AC_ARG_WITH(pid-dir,
3476         [  --with-pid-dir=PATH     Specify location of ssh.pid file],
3477         [
3478                 if test -n "$withval"  &&  test "x$withval" != "xno"  &&  \
3479                     test "x${withval}" != "xyes"; then
3480                         piddir=$withval
3481                         if test ! -d $piddir ; then
3482                         AC_MSG_WARN([** no $piddir directory on this system **])
3483                         fi
3484                 fi
3485         ]
3486 )
3487
3488 AC_DEFINE_UNQUOTED(_PATH_SSH_PIDDIR, "$piddir", [Specify location of ssh.pid])
3489 AC_SUBST(piddir)
3490
3491 dnl allow user to disable some login recording features
3492 AC_ARG_ENABLE(lastlog,
3493         [  --disable-lastlog       disable use of lastlog even if detected [no]],
3494         [
3495                 if test "x$enableval" = "xno" ; then
3496                         AC_DEFINE(DISABLE_LASTLOG)
3497                 fi
3498         ]
3499 )
3500 AC_ARG_ENABLE(utmp,
3501         [  --disable-utmp          disable use of utmp even if detected [no]],
3502         [
3503                 if test "x$enableval" = "xno" ; then
3504                         AC_DEFINE(DISABLE_UTMP)
3505                 fi
3506         ]
3507 )
3508 AC_ARG_ENABLE(utmpx,
3509         [  --disable-utmpx         disable use of utmpx even if detected [no]],
3510         [
3511                 if test "x$enableval" = "xno" ; then
3512                         AC_DEFINE(DISABLE_UTMPX, 1,
3513                                 [Define if you don't want to use utmpx])
3514                 fi
3515         ]
3516 )
3517 AC_ARG_ENABLE(wtmp,
3518         [  --disable-wtmp          disable use of wtmp even if detected [no]],
3519         [
3520                 if test "x$enableval" = "xno" ; then
3521                         AC_DEFINE(DISABLE_WTMP)
3522                 fi
3523         ]
3524 )
3525 AC_ARG_ENABLE(wtmpx,
3526         [  --disable-wtmpx         disable use of wtmpx even if detected [no]],
3527         [
3528                 if test "x$enableval" = "xno" ; then
3529                         AC_DEFINE(DISABLE_WTMPX, 1,
3530                                 [Define if you don't want to use wtmpx])
3531                 fi
3532         ]
3533 )
3534 AC_ARG_ENABLE(libutil,
3535         [  --disable-libutil       disable use of libutil (login() etc.) [no]],
3536         [
3537                 if test "x$enableval" = "xno" ; then
3538                         AC_DEFINE(DISABLE_LOGIN)
3539                 fi
3540         ]
3541 )
3542 AC_ARG_ENABLE(pututline,
3543         [  --disable-pututline     disable use of pututline() etc. ([uw]tmp) [no]],
3544         [
3545                 if test "x$enableval" = "xno" ; then
3546                         AC_DEFINE(DISABLE_PUTUTLINE, 1,
3547                                 [Define if you don't want to use pututline()
3548                                 etc. to write [uw]tmp])
3549                 fi
3550         ]
3551 )
3552 AC_ARG_ENABLE(pututxline,
3553         [  --disable-pututxline    disable use of pututxline() etc. ([uw]tmpx) [no]],
3554         [
3555                 if test "x$enableval" = "xno" ; then
3556                         AC_DEFINE(DISABLE_PUTUTXLINE, 1,
3557                                 [Define if you don't want to use pututxline()
3558                                 etc. to write [uw]tmpx])
3559                 fi
3560         ]
3561 )
3562 AC_ARG_WITH(lastlog,
3563   [  --with-lastlog=FILE|DIR specify lastlog location [common locations]],
3564         [
3565                 if test "x$withval" = "xno" ; then
3566                         AC_DEFINE(DISABLE_LASTLOG)
3567                 elif test -n "$withval"  &&  test "x${withval}" != "xyes"; then
3568                         conf_lastlog_location=$withval
3569                 fi
3570         ]
3571 )
3572
3573 dnl lastlog, [uw]tmpx? detection
3574 dnl  NOTE: set the paths in the platform section to avoid the
3575 dnl   need for command-line parameters
3576 dnl lastlog and [uw]tmp are subject to a file search if all else fails
3577
3578 dnl lastlog detection
3579 dnl  NOTE: the code itself will detect if lastlog is a directory
3580 AC_MSG_CHECKING([if your system defines LASTLOG_FILE])
3581 AC_TRY_COMPILE([
3582 #include <sys/types.h>
3583 #include <utmp.h>
3584 #ifdef HAVE_LASTLOG_H
3585 #  include <lastlog.h>
3586 #endif
3587 #ifdef HAVE_PATHS_H
3588 #  include <paths.h>
3589 #endif
3590 #ifdef HAVE_LOGIN_H
3591 # include <login.h>
3592 #endif
3593         ],
3594         [ char *lastlog = LASTLOG_FILE; ],
3595         [ AC_MSG_RESULT(yes) ],
3596         [
3597                 AC_MSG_RESULT(no)
3598                 AC_MSG_CHECKING([if your system defines _PATH_LASTLOG])
3599                 AC_TRY_COMPILE([
3600 #include <sys/types.h>
3601 #include <utmp.h>
3602 #ifdef HAVE_LASTLOG_H
3603 #  include <lastlog.h>
3604 #endif
3605 #ifdef HAVE_PATHS_H
3606 #  include <paths.h>
3607 #endif
3608                 ],
3609                 [ char *lastlog = _PATH_LASTLOG; ],
3610                 [ AC_MSG_RESULT(yes) ],
3611                 [
3612                         AC_MSG_RESULT(no)
3613                         system_lastlog_path=no
3614                 ])
3615         ]
3616 )
3617
3618 if test -z "$conf_lastlog_location"; then
3619         if test x"$system_lastlog_path" = x"no" ; then
3620                 for f in /var/log/lastlog /usr/adm/lastlog /var/adm/lastlog /etc/security/lastlog ; do
3621                                 if (test -d "$f" || test -f "$f") ; then
3622                                         conf_lastlog_location=$f
3623                                 fi
3624                 done
3625                 if test -z "$conf_lastlog_location"; then
3626                         AC_MSG_WARN([** Cannot find lastlog **])
3627                         dnl Don't define DISABLE_LASTLOG - that means we don't try wtmp/wtmpx
3628                 fi
3629         fi
3630 fi
3631
3632 if test -n "$conf_lastlog_location"; then
3633         AC_DEFINE_UNQUOTED(CONF_LASTLOG_FILE, "$conf_lastlog_location",
3634                 [Define if you want to specify the path to your lastlog file])
3635 fi
3636
3637 dnl utmp detection
3638 AC_MSG_CHECKING([if your system defines UTMP_FILE])
3639 AC_TRY_COMPILE([
3640 #include <sys/types.h>
3641 #include <utmp.h>
3642 #ifdef HAVE_PATHS_H
3643 #  include <paths.h>
3644 #endif
3645         ],
3646         [ char *utmp = UTMP_FILE; ],
3647         [ AC_MSG_RESULT(yes) ],
3648         [ AC_MSG_RESULT(no)
3649           system_utmp_path=no ]
3650 )
3651 if test -z "$conf_utmp_location"; then
3652         if test x"$system_utmp_path" = x"no" ; then
3653                 for f in /etc/utmp /usr/adm/utmp /var/run/utmp; do
3654                         if test -f $f ; then
3655                                 conf_utmp_location=$f
3656                         fi
3657                 done
3658                 if test -z "$conf_utmp_location"; then
3659                         AC_DEFINE(DISABLE_UTMP)
3660                 fi
3661         fi
3662 fi
3663 if test -n "$conf_utmp_location"; then
3664         AC_DEFINE_UNQUOTED(CONF_UTMP_FILE, "$conf_utmp_location",
3665                 [Define if you want to specify the path to your utmp file])
3666 fi
3667
3668 dnl wtmp detection
3669 AC_MSG_CHECKING([if your system defines WTMP_FILE])
3670 AC_TRY_COMPILE([
3671 #include <sys/types.h>
3672 #include <utmp.h>
3673 #ifdef HAVE_PATHS_H
3674 #  include <paths.h>
3675 #endif
3676         ],
3677         [ char *wtmp = WTMP_FILE; ],
3678         [ AC_MSG_RESULT(yes) ],
3679         [ AC_MSG_RESULT(no)
3680           system_wtmp_path=no ]
3681 )
3682 if test -z "$conf_wtmp_location"; then
3683         if test x"$system_wtmp_path" = x"no" ; then
3684                 for f in /usr/adm/wtmp /var/log/wtmp; do
3685                         if test -f $f ; then
3686                                 conf_wtmp_location=$f
3687                         fi
3688                 done
3689                 if test -z "$conf_wtmp_location"; then
3690                         AC_DEFINE(DISABLE_WTMP)
3691                 fi
3692         fi
3693 fi
3694 if test -n "$conf_wtmp_location"; then
3695         AC_DEFINE_UNQUOTED(CONF_WTMP_FILE, "$conf_wtmp_location",
3696                 [Define if you want to specify the path to your wtmp file])
3697 fi
3698
3699
3700 dnl utmpx detection - I don't know any system so perverse as to require
3701 dnl  utmpx, but not define UTMPX_FILE (ditto wtmpx.) No doubt it's out
3702 dnl  there, though.
3703 AC_MSG_CHECKING([if your system defines UTMPX_FILE])
3704 AC_TRY_COMPILE([
3705 #include <sys/types.h>
3706 #include <utmp.h>
3707 #ifdef HAVE_UTMPX_H
3708 #include <utmpx.h>
3709 #endif
3710 #ifdef HAVE_PATHS_H
3711 #  include <paths.h>
3712 #endif
3713         ],
3714         [ char *utmpx = UTMPX_FILE; ],
3715         [ AC_MSG_RESULT(yes) ],
3716         [ AC_MSG_RESULT(no)
3717           system_utmpx_path=no ]
3718 )
3719 if test -z "$conf_utmpx_location"; then
3720         if test x"$system_utmpx_path" = x"no" ; then
3721                 AC_DEFINE(DISABLE_UTMPX)
3722         fi
3723 else
3724         AC_DEFINE_UNQUOTED(CONF_UTMPX_FILE, "$conf_utmpx_location",
3725                 [Define if you want to specify the path to your utmpx file])
3726 fi
3727
3728 dnl wtmpx detection
3729 AC_MSG_CHECKING([if your system defines WTMPX_FILE])
3730 AC_TRY_COMPILE([
3731 #include <sys/types.h>
3732 #include <utmp.h>
3733 #ifdef HAVE_UTMPX_H
3734 #include <utmpx.h>
3735 #endif
3736 #ifdef HAVE_PATHS_H
3737 #  include <paths.h>
3738 #endif
3739         ],
3740         [ char *wtmpx = WTMPX_FILE; ],
3741         [ AC_MSG_RESULT(yes) ],
3742         [ AC_MSG_RESULT(no)
3743           system_wtmpx_path=no ]
3744 )
3745 if test -z "$conf_wtmpx_location"; then
3746         if test x"$system_wtmpx_path" = x"no" ; then
3747                 AC_DEFINE(DISABLE_WTMPX)
3748         fi
3749 else
3750         AC_DEFINE_UNQUOTED(CONF_WTMPX_FILE, "$conf_wtmpx_location",
3751                 [Define if you want to specify the path to your wtmpx file])
3752 fi
3753
3754
3755 if test ! -z "$blibpath" ; then
3756         LDFLAGS="$LDFLAGS $blibflags$blibpath"
3757         AC_MSG_WARN([Please check and edit blibpath in LDFLAGS in Makefile])
3758 fi
3759
3760 dnl remove pam and dl because they are in $LIBPAM
3761 if test "$PAM_MSG" = yes ; then
3762         LIBS=`echo $LIBS | sed 's/-lpam //'`
3763 fi
3764 if test "$ac_cv_lib_pam_pam_set_item" = yes ; then
3765         LIBS=`echo $LIBS | sed 's/-ldl //'`
3766 fi
3767
3768 dnl Adding -Werror to CFLAGS early prevents configure tests from running.
3769 dnl Add now.
3770 CFLAGS="$CFLAGS $werror_flags"
3771
3772 AC_EXEEXT
3773 AC_CONFIG_FILES([Makefile buildpkg.sh opensshd.init openbsd-compat/Makefile \
3774         openbsd-compat/regress/Makefile scard/Makefile ssh_prng_cmds survey.sh])
3775 AC_OUTPUT
3776
3777 # Print summary of options
3778
3779 # Someone please show me a better way :)
3780 A=`eval echo ${prefix}` ; A=`eval echo ${A}`
3781 B=`eval echo ${bindir}` ; B=`eval echo ${B}`
3782 C=`eval echo ${sbindir}` ; C=`eval echo ${C}`
3783 D=`eval echo ${sysconfdir}` ; D=`eval echo ${D}`
3784 E=`eval echo ${libexecdir}/ssh-askpass` ; E=`eval echo ${E}`
3785 F=`eval echo ${mandir}/${mansubdir}X` ; F=`eval echo ${F}`
3786 G=`eval echo ${piddir}` ; G=`eval echo ${G}`
3787 H=`eval echo ${PRIVSEP_PATH}` ; H=`eval echo ${H}`
3788 I=`eval echo ${user_path}` ; I=`eval echo ${I}`
3789 J=`eval echo ${superuser_path}` ; J=`eval echo ${J}`
3790
3791 echo ""
3792 echo "OpenSSH has been configured with the following options:"
3793 echo "                     User binaries: $B"
3794 echo "                   System binaries: $C"
3795 echo "               Configuration files: $D"
3796 echo "                   Askpass program: $E"
3797 echo "                      Manual pages: $F"
3798 echo "                          PID file: $G"
3799 echo "  Privilege separation chroot path: $H"
3800 if test "x$external_path_file" = "x/etc/login.conf" ; then
3801 echo "   At runtime, sshd will use the path defined in $external_path_file"
3802 echo "   Make sure the path to scp is present, otherwise scp will not work"
3803 else
3804 echo "            sshd default user PATH: $I"
3805         if test ! -z "$external_path_file"; then
3806 echo "   (If PATH is set in $external_path_file it will be used instead. If"
3807 echo "   used, ensure the path to scp is present, otherwise scp will not work.)"
3808         fi
3809 fi
3810 if test ! -z "$superuser_path" ; then
3811 echo "          sshd superuser user PATH: $J"
3812 fi
3813 echo "                    Manpage format: $MANTYPE"
3814 echo "                       PAM support: $PAM_MSG"
3815 echo "                 KerberosV support: $KRB5_MSG"
3816 echo "                 Smartcard support: $SCARD_MSG"
3817 echo "                     S/KEY support: $SKEY_MSG"
3818 echo "              TCP Wrappers support: $TCPW_MSG"
3819 echo "              MD5 password support: $MD5_MSG"
3820 echo "                   libedit support: $LIBEDIT_MSG"
3821 echo "       IP address in \$DISPLAY hack: $DISPLAY_HACK_MSG"
3822 echo "           Translate v4 in v6 hack: $IPV4_IN6_HACK_MSG"
3823 echo "                  BSD Auth support: $BSD_AUTH_MSG"
3824 echo "              Random number source: $RAND_MSG"
3825 if test ! -z "$USE_RAND_HELPER" ; then
3826 echo "     ssh-rand-helper collects from: $RAND_HELPER_MSG"
3827 fi
3828
3829 echo ""
3830
3831 echo "              Host: ${host}"
3832 echo "          Compiler: ${CC}"
3833 echo "    Compiler flags: ${CFLAGS}"
3834 echo "Preprocessor flags: ${CPPFLAGS}"
3835 echo "      Linker flags: ${LDFLAGS}"
3836 echo "         Libraries: ${LIBWRAP} ${LIBPAM} ${LIBS}"
3837
3838 echo ""
3839
3840 if test "x$MAKE_PACKAGE_SUPPORTED" = "xyes" ; then
3841         echo "SVR4 style packages are supported with \"make package\""
3842         echo ""
3843 fi
3844
3845 if test "x$PAM_MSG" = "xyes" ; then
3846         echo "PAM is enabled. You may need to install a PAM control file "
3847         echo "for sshd, otherwise password authentication may fail. "
3848         echo "Example PAM control files can be found in the contrib/ "
3849         echo "subdirectory"
3850         echo ""
3851 fi
3852
3853 if test ! -z "$RAND_HELPER_CMDHASH" ; then
3854         echo "WARNING: you are using the builtin random number collection "
3855         echo "service. Please read WARNING.RNG and request that your OS "
3856         echo "vendor includes kernel-based random number collection in "
3857         echo "future versions of your OS."
3858         echo ""
3859 fi
3860
3861 if test ! -z "$NO_PEERCHECK" ; then
3862         echo "WARNING: the operating system that you are using does not "
3863         echo "appear to support either the getpeereid() API nor the "
3864         echo "SO_PEERCRED getsockopt() option. These facilities are used to "
3865         echo "enforce security checks to prevent unauthorised connections to "
3866         echo "ssh-agent. Their absence increases the risk that a malicious "
3867         echo "user can connect to your agent. "
3868         echo ""
3869 fi
3870
3871 if test "$AUDIT_MODULE" = "bsm" ; then
3872         echo "WARNING: BSM audit support is currently considered EXPERIMENTAL."
3873         echo "See the Solaris section in README.platform for details."
3874 fi
This page took 0.431672 seconds and 5 git commands to generate.