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