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