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