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