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