AC_INIT(ssh.c)

AC_CONFIG_HEADER(config.h)
AC_PROG_CC
AC_CANONICAL_HOST

# Checks for programs.
AC_PROG_CPP
AC_PROG_RANLIB
AC_PROG_INSTALL
AC_CHECK_PROG(AR, ar, ar)
AC_PATH_PROG(PERL, perl)
AC_SUBST(PERL)
AC_PATH_PROG(ENT, ent)
AC_SUBST(ENT)

if test -z "$LD" ; then
	LD=$CC
fi
AC_SUBST(LD)
	
# C Compiler features
AC_C_INLINE
if test "$GCC" = "yes"; then 
	CFLAGS="$CFLAGS -Wall"
fi

# Check for some target-specific stuff
case "$host" in
*-*-aix*)
	AFS_LIBS="-lld"
	CFLAGS="$CFLAGS -I/usr/local/include"
	LDFLAGS="$LDFLAGS -L/usr/local/lib"
	if (test "$LD" != "gcc" && test -z "$blibpath"); then
		blibpath="/usr/lib:/lib:/usr/local/lib"
	fi
	AC_CHECK_FUNC(authenticate, [AC_DEFINE(WITH_AIXAUTHENTICATE)])
	AC_DEFINE(BROKEN_GETADDRINFO)
	MANTYPE='$(CATMAN)'
	mansubdir=cat
	dnl AIX handles lastlog as part of its login message
	AC_DEFINE(DISABLE_LASTLOG)
	MANTYPE='$(CATMAN)'
	mansubdir=cat
	;;
*-*-hpux10*)
	if test -z "$GCC"; then
		CFLAGS="$CFLAGS -Ae"
	fi
	CFLAGS="$CFLAGS -D_HPUX_SOURCE"
	AC_DEFINE(IPADDR_IN_DISPLAY)
	AC_MSG_CHECKING(for HPUX trusted system password database)
	if test -f /tcb/files/auth/system/default; then
		AC_MSG_RESULT(yes)
		AC_DEFINE(HAVE_HPUX_TRUSTED_SYSTEM_PW)
		LIBS="$LIBS -lsec"
		AC_MSG_WARN([This configuration is untested])
	else
		AC_MSG_RESULT(no)
		AC_DEFINE(DISABLE_SHADOW)
	fi
	MANTYPE='$(CATMAN)'
	mansubdir=cat
	;;
*-*-hpux11*)
	if test -z "$GCC"; then
		CFLAGS="$CFLAGS -Ae"
	fi
	CFLAGS="$CFLAGS -D_HPUX_SOURCE"
	AC_DEFINE(IPADDR_IN_DISPLAY)
	AC_MSG_CHECKING(for HPUX trusted system password database)
	if test -f /tcb/files/auth/system/default; then
		AC_MSG_RESULT(yes)
		AC_DEFINE(HAVE_HPUX_TRUSTED_SYSTEM_PW)
		LIBS="$LIBS -lsec"
		AC_MSG_WARN([This configuration is untested])
	else
		AC_MSG_RESULT(no)
		AC_DEFINE(DISABLE_SHADOW)
	fi
	MANTYPE='$(CATMAN)'
	mansubdir=cat
	;;
*-*-irix5*)
	CFLAGS="$CFLAGS -I/usr/local/include"
	LDFLAGS="$LDFLAGS"
	MANTYPE='$(CATMAN)'
	no_libsocket=1
	no_libnsl=1
	;;
*-*-irix6*)
	CFLAGS="$CFLAGS -I/usr/local/include"
	LDFLAGS="$LDFLAGS"
	MANTYPE='$(CATMAN)'
	AC_DEFINE(WITH_IRIX_ARRAY)
	AC_DEFINE(WITH_IRIX_PROJECT)
	AC_DEFINE(WITH_IRIX_AUDIT)
	no_libsocket=1
	no_libnsl=1
	;;
*-*-linux*)
	no_dev_ptmx=1
	AC_DEFINE(DONT_TRY_OTHER_AF)
	AC_DEFINE(PAM_TTY_KLUDGE)
	inet6_default_4in6=yes
	;;
*-*-netbsd*)
	need_dash_r=1
	;;
*-next-*)
	# hardwire lastlog location (can't detect it on some versions)
	conf_lastlog_location="/usr/adm/lastlog"
        conf_utmp_location=/etc/utmp
	AC_DEFINE(HAVE_NEXT)
	CFLAGS="$CFLAGS -I/usr/local/include"
	MAIL=/usr/spool/mail
	AC_MSG_WARN([*** Tested: PA-RISC/m68k  Untested: Sparc/Intel])
	AC_MSG_WARN([*** Expect 'scp' to fail!])
	AC_MSG_WARN([*** Please report any problems, thanks])
	;;
*-*-solaris*)
	CFLAGS="$CFLAGS -I/usr/local/include"
	LDFLAGS="$LDFLAGS -L/usr/local/lib -R/usr/local/lib -L/usr/ucblib -R/usr/ucblib"
	need_dash_r=1
	# hardwire lastlog location (can't detect it on some versions)
	conf_lastlog_location="/var/adm/lastlog"
	AC_MSG_CHECKING(for obsolete utmp and wtmp in solaris2.x)
	sol2ver=`echo "$host"| sed -e 's/.*[[0-9]]\.//'`
	if test "$sol2ver" -ge 8; then
		AC_MSG_RESULT(yes)
		AC_DEFINE(DISABLE_UTMP)
		AC_DEFINE(DISABLE_WTMP)
	else
		AC_MSG_RESULT(no)
	fi
	;;
*-*-sunos4*)
	CFLAGS="$CFLAGS -DSUNOS4"
	AC_CHECK_FUNCS(getpwanam)
	;;
*-sni-sysv*)
	CFLAGS="$CFLAGS -I/usr/local/include"
	LDFLAGS="$LDFLAGS -L/usr/local/lib -L/usr/ucblib"
	MANTYPE='$(CATMAN)'
	AC_DEFINE(IP_TOS_IS_BROKEN)
	mansubdir=cat
	LIBS="$LIBS -lgen -lnsl -lsocket -lucb"
	;;
*-*-sysv*)
	CFLAGS="$CFLAGS -I/usr/local/include"
	LDFLAGS="$LDFLAGS -L/usr/local/lib"
	MANTYPE='$(CATMAN)'
	mansubdir=cat
	LIBS="$LIBS -lgen -lsocket"
	;;
*-*-sco3*)
	CFLAGS="$CFLAGS -I/usr/local/include"
	LDFLAGS="$LDFLAGS -L/usr/local/lib"
	MANTYPE='$(CATMAN)'
	mansubdir=cat
	LIBS="$LIBS -lgen -lsocket"
	no_dev_ptmx=1
	;;
*-dec-osf*)
# This is untested
	if test ! -z "USE_SIA" ; then
		AC_MSG_CHECKING(for Digital Unix Security Integration Architecture)
		if test -f /etc/sia/matrix.conf; then
			AC_MSG_RESULT(yes)
			AC_DEFINE(HAVE_OSF_SIA)
			AC_DEFINE(DISABLE_LOGIN)
			LIBS="$LIBS -lsecurity -ldb -lm -laud"
		else
			AC_MSG_RESULT(no)
		fi
	fi
	;;
esac

# Allow user to specify flags
AC_ARG_WITH(cflags,
	[  --with-cflags           Specify additional flags to pass to compiler],
	[
		if test "x$withval" != "xno" ; then
			CFLAGS="$CFLAGS $withval"
		fi
	]	
)
AC_ARG_WITH(ldflags,
	[  --with-ldlags           Specify additional flags to pass to linker],
	[
		if test "x$withval" != "xno" ; then
			LDFLAGS="$LDFLAGS $withval"
		fi
	]	
)
AC_ARG_WITH(libs,
	[  --with-libs             Specify additional libraries to link with],
	[
		if test "x$withval" != "xno" ; then
			LIBS="$LIBS $withval"
		fi
	]	
)


# Checks for libraries.
AC_CHECK_LIB(z, deflate, ,AC_MSG_ERROR([*** zlib missing - please install first ***]))
AC_CHECK_LIB(util, login, AC_DEFINE(HAVE_LIBUTIL_LOGIN) LIBS="$LIBS -lutil")

if test -z "$no_libsocket" ; then
	AC_CHECK_LIB(nsl, yp_match, , )
fi
if test -z "$no_libnsl" ; then
	AC_CHECK_LIB(socket, main, , )
fi

# Checks for header files.
AC_CHECK_HEADERS(bstring.h endian.h lastlog.h limits.h login.h maillock.h netdb.h netgroup.h netinet/in_systm.h paths.h poll.h pty.h shadow.h security/pam_appl.h sys/bitypes.h sys/bsdtty.h sys/cdefs.h sys/poll.h sys/select.h sys/stat.h sys/stropts.h sys/sysmacros.h sys/time.h sys/ttcompat.h stddef.h time.h usersec.h util.h utmp.h utmpx.h)

# Checks for library functions.
AC_CHECK_FUNCS(arc4random atexit b64_ntop bcopy bindresvport_af clock freeaddrinfo gai_strerror getaddrinfo getnameinfo getrusage inet_aton innetgr md5_crypt memmove mkdtemp on_exit openpty rresvport_af setenv seteuid setlogin setproctitle setreuid sigaction sigvec snprintf strlcat strlcpy vsnprintf vhangup _getpty __b64_ntop)
dnl    checks for time functions
AC_CHECK_FUNCS(gettimeofday time)
dnl    checks for libutil functions
AC_CHECK_FUNCS(login logout updwtmp logwtmp)
dnl    checks for utmp functions
AC_CHECK_FUNCS(entutent getutent getutid getutline pututline setutent)
AC_CHECK_FUNCS(utmpname)
dnl    checks for utmpx functions
AC_CHECK_FUNCS(entutxent getutxent getutxid getutxline pututxline )
AC_CHECK_FUNCS(setutxent utmpxname)

AC_CHECK_FUNC(getuserattr, 
	[AC_DEFINE(HAVE_GETUSERATTR)],
	[AC_CHECK_LIB(s, getuserattr, [LIBS="$LIBS -ls"; AC_DEFINE(HAVE_GETUSERATTR)])]
)

AC_CHECK_FUNC(login, 
	[AC_DEFINE(HAVE_LOGIN)],
	[AC_CHECK_LIB(bsd, login, [LIBS="$LIBS -lbsd"; AC_DEFINE(HAVE_LOGIN)])]
)

AC_CHECK_FUNC(daemon, 
	[AC_DEFINE(HAVE_DAEMON)],
	[AC_CHECK_LIB(bsd, daemon, [LIBS="$LIBS -lbsd"; AC_DEFINE(HAVE_DAEMON)])]
)

AC_CHECK_FUNC(getpagesize, 
	[AC_DEFINE(HAVE_GETPAGESIZE)],
	[AC_CHECK_LIB(ucb, getpagesize, [LIBS="$LIBS -lucb"; AC_DEFINE(HAVE_GETPAGESIZE)])]
)

# Check for broken snprintf
if test "x$ac_cv_func_snprintf" = "xyes" ; then
	AC_MSG_CHECKING([whether snprintf correctly terminates long strings])
	AC_TRY_RUN(
		[
#include <stdio.h>
int main(void){char b[5];snprintf(b,5,"123456789");return(b[4]!='\0');}
		],
		[AC_MSG_RESULT(yes)], 
		[
			AC_MSG_RESULT(no)
			AC_DEFINE(BROKEN_SNPRINTF)
			AC_MSG_WARN([****** Your snprintf() function is broken, complain to your vendor])
		]
	)
fi

PAM_MSG="no"
AC_ARG_WITH(pam,
	[  --without-pam           Disable PAM support ],
	[
		if test "x$withval" = "xno" ; then
			no_pam=1
			AC_DEFINE(DISABLE_PAM)
			PAM_MSG="disabled"
		fi
	]
)
if (test -z "$no_pam" && test "x$ac_cv_header_security_pam_appl_h" = "xyes") ; then
	AC_CHECK_LIB(dl, dlopen, , )
	LIBS="$LIBS -lpam"

	AC_CHECK_FUNCS(pam_getenvlist)

	disable_shadow=yes

	PAM_MSG="yes"

	# Check PAM strerror arguments (old PAM)
	AC_MSG_CHECKING([whether pam_strerror takes only one argument])
	AC_TRY_COMPILE(
		[
#include <stdlib.h>
#include <security/pam_appl.h>
		], 
		[(void)pam_strerror((pam_handle_t *)NULL, -1);], 
		[AC_MSG_RESULT(no)],
		[
			AC_DEFINE(HAVE_OLD_PAM)
			AC_MSG_RESULT(yes)
			PAM_MSG="yes (old library)"
		]
	) 
fi

# The big search for OpenSSL
AC_ARG_WITH(ssl-dir,
	[  --with-ssl-dir=PATH     Specify path to OpenSSL installation ],
	[
		if test "x$withval" != "$xno" ; then
			tryssldir=$withval
		fi
	]
)

saved_LIBS="$LIBS"
saved_LDFLAGS="$LDFLAGS"
saved_CFLAGS="$CFLAGS"
if test "x$prefix" != "xNONE" ; then
	tryssldir="$tryssldir $prefix"
fi
AC_CACHE_CHECK([for OpenSSL directory], ac_cv_openssldir, [

	for ssldir in "" $tryssldir /usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/pkg /opt /opt/openssl ; do
		if test ! -z "$ssldir" ; then
			LDFLAGS="$saved_LDFLAGS -L$ssldir/lib -L$ssldir"
			CFLAGS="$saved_CFLAGS -I$ssldir/include"
			if test ! -z "$need_dash_r" ; then
				LDFLAGS="$LDFLAGS -R$ssldir/lib -R$ssldir"
			fi
		else
			LDFLAGS="$saved_LDFLAGS"
		fi

		LIBS="$saved_LIBS -lcrypto"

		# Basic test to check for compatible version and correct linking
		# *does not* test for RSA - that comes later.
		AC_TRY_RUN(
			[
#include <string.h>
#include <openssl/rand.h>
int main(void) 
{
	char a[2048];
	memset(a, 0, sizeof(a));
	RAND_add(a, sizeof(a), sizeof(a));
	return(RAND_status() <= 0);
}
			],
			[
				found_crypto=1
				break;
			], []
		)

		if test ! -z "$found_crypto" ; then
			break;
		fi
	done

	if test -z "$found_crypto" ; then
		AC_MSG_ERROR([Could not find working SSLeay / OpenSSL libraries, please install])	
	fi
	if test -z "$ssldir" ; then
		ssldir="(system)"
	fi

	ac_cv_openssldir=$ssldir
])

if (test ! -z "$ac_cv_openssldir" && test "x$ac_cv_openssldir" != "x(system)") ; then
	AC_DEFINE(HAVE_OPENSSL)
	dnl Need to recover ssldir - test above runs in subshell
	ssldir=$ac_cv_openssldir
	CFLAGS="$saved_CFLAGS -I$ssldir/include"
	LDFLAGS="$saved_LDFLAGS -L$ssldir/lib -L$ssldir"
	if test ! -z "$need_dash_r" ; then
		LDFLAGS="$LDFLAGS -R$ssldir/lib -R$ssldir"
	fi
	if test ! -z "$blibpath" ; then
		blibpath="$blibpath:$ssldir:$ssldir/lib"
	fi
fi
LIBS="$saved_LIBS -lcrypto"

# Now test RSA support
saved_LIBS="$LIBS"
AC_MSG_CHECKING([for RSA support])
for WANTS_RSAREF in "" 1 ; do
	if test -z "$WANTS_RSAREF" ; then
		LIBS="$saved_LIBS"
	else
		LIBS="$saved_LIBS -lRSAglue -lrsaref"
	fi
	AC_TRY_RUN([
#include <string.h>
#include <openssl/rand.h>
#include <openssl/rsa.h>
#include <openssl/bn.h>
#include <openssl/sha.h>
int main(void) 
{
	int num; RSA *key; static unsigned char p_in[] = "blahblah";
	unsigned char c[256], p[256];
	memset(c, 0, sizeof(c)); RAND_add(c, sizeof(c), sizeof(c));
	if ((key=RSA_generate_key(512, 3, NULL, NULL))==NULL) return(1);
	num = RSA_public_encrypt(sizeof(p_in) - 1, p_in, c, key, RSA_PKCS1_PADDING);
	return(-1 == RSA_private_decrypt(num, c, p, key, RSA_PKCS1_PADDING));
}
	],
	[
		rsa_works=1
		break;
	], [])
done

if test ! -z "$no_rsa" ; then
	AC_MSG_RESULT(disabled)
	RSA_MSG="disabled"
else
	if test -z "$rsa_works" ; then
		AC_MSG_WARN([*** No RSA support found *** ])
		RSA_MSG="no"
	else
		if test -z "$WANTS_RSAREF" ; then
			AC_MSG_RESULT(yes)
			RSA_MSG="yes"
		else
			RSA_MSG="yes (using RSAref)"
			AC_MSG_RESULT(using RSAref)
			LIBS="$saved_LIBS -lcrypto -lRSAglue -lrsaref"
		fi
	fi
fi

# Checks for data types
AC_CHECK_SIZEOF(char, 1)
AC_CHECK_SIZEOF(short int, 2)
AC_CHECK_SIZEOF(int, 4)
AC_CHECK_SIZEOF(long int, 4)
AC_CHECK_SIZEOF(long long int, 8)

# More checks for data types
AC_CACHE_CHECK([for intXX_t types], ac_cv_have_intxx_t, [
	AC_TRY_COMPILE(
		[ #include <sys/types.h> ], 
		[ int8_t a; int16_t b; int32_t c; a = b = c = 1;], 
		[ ac_cv_have_intxx_t="yes" ],
		[ ac_cv_have_intxx_t="no" ]
	)
])
if test "x$ac_cv_have_intxx_t" = "xyes" ; then
	AC_DEFINE(HAVE_INTXX_T)
	have_intxx_t=1
fi
	
AC_CACHE_CHECK([for u_intXX_t types], ac_cv_have_u_intxx_t, [
	AC_TRY_COMPILE(
		[ #include <sys/types.h> ], 
		[ u_int8_t a; u_int16_t b; u_int32_t c; a = b = c = 1;], 
		[ ac_cv_have_u_intxx_t="yes" ],
		[ ac_cv_have_u_intxx_t="no" ]
	)
])
if test "x$ac_cv_have_u_intxx_t" = "xyes" ; then
	AC_DEFINE(HAVE_U_INTXX_T)
	have_u_intxx_t=1
fi


if (test -z "$have_u_intxx_t" || test -z "$have_intxx_t" && \
           test "x$ac_cv_header_sys_bitypes_h" = "xyes")
then
	AC_MSG_CHECKING([for intXX_t and u_intXX_t types in sys/bitypes.h])
	AC_TRY_COMPILE(
		[
#include <sys/bitypes.h>
		], 
		[
			int8_t a; int16_t b; int32_t c;
			u_int8_t e; u_int16_t f; u_int32_t g;
			a = b = c = e = f = g = 1;
		], 
		[
			AC_DEFINE(HAVE_U_INTXX_T)
			AC_DEFINE(HAVE_INTXX_T)
			AC_MSG_RESULT(yes)
		],
		[AC_MSG_RESULT(no)]
	) 
fi

if test -z "$have_u_intxx_t" ; then
	AC_CACHE_CHECK([for uintXX_t types], ac_cv_have_uintxx_t, [
		AC_TRY_COMPILE(
			[
#include <sys/types.h>
			], 
			[ uint8_t a; uint16_t b; uint32_t c; a = b = c = 1; ], 
			[ ac_cv_have_uintxx_t="yes" ],
			[ ac_cv_have_uintxx_t="no" ]
		)
	])
	if test "x$ac_cv_have_uintxx_t" = "xyes" ; then
		AC_DEFINE(HAVE_UINTXX_T)
	fi
fi

AC_CACHE_CHECK([for socklen_t], ac_cv_have_socklen_t, [
	AC_TRY_COMPILE(
		[
#include <sys/types.h>
#include <sys/socket.h>
		],
		[socklen_t foo; foo = 1235;],
		[ ac_cv_have_socklen_t="yes" ],
		[ ac_cv_have_socklen_t="no" ]
	)
])
if test "x$ac_cv_have_socklen_t" = "xyes" ; then
	AC_DEFINE(HAVE_SOCKLEN_T)
fi

AC_CACHE_CHECK([for size_t], ac_cv_have_size_t, [
	AC_TRY_COMPILE(
		[
#include <sys/types.h>
		],
		[ size_t foo; foo = 1235; ],
		[ ac_cv_have_size_t="yes" ],
		[ ac_cv_have_size_t="no" ]
	)
])
if test "x$ac_cv_have_size_t" = "xyes" ; then
	AC_DEFINE(HAVE_SIZE_T)
fi

AC_CACHE_CHECK([for ssize_t], ac_cv_have_ssize_t, [
	AC_TRY_COMPILE(
		[
#include <sys/types.h>
		],
		[ ssize_t foo; foo = 1235; ],
		[ ac_cv_have_ssize_t="yes" ],
		[ ac_cv_have_ssize_t="no" ]
	)
])
if test "x$ac_cv_have_ssize_t" = "xyes" ; then
	AC_DEFINE(HAVE_SSIZE_T)
fi

AC_CACHE_CHECK([for sa_family_t], ac_cv_have_sa_family_t, [
	AC_TRY_COMPILE(
		[
#include <sys/types.h>
#include <sys/socket.h>
		],
		[ sa_family_t foo; foo = 1235; ],
		[ ac_cv_have_sa_family_t="yes" ],
		[ ac_cv_have_sa_family_t="no" ]
	)
])
if test "x$ac_cv_have_sa_family_t" = "xyes" ; then
	AC_DEFINE(HAVE_SA_FAMILY_T)
fi

AC_CACHE_CHECK([for pid_t], ac_cv_have_pid_t, [
	AC_TRY_COMPILE(
		[
#include <sys/types.h>
		],
		[ pid_t foo; foo = 1235; ],
		[ ac_cv_have_pid_t="yes" ],
		[ ac_cv_have_pid_t="no" ]
	)
])
if test "x$ac_cv_have_pid_t" = "xyes" ; then
	AC_DEFINE(HAVE_PID_T)
fi

AC_CACHE_CHECK([for mode_t], ac_cv_have_mode_t, [
	AC_TRY_COMPILE(
		[
#include <sys/types.h>
		],
		[ mode_t foo; foo = 1235; ],
		[ ac_cv_have_mode_t="yes" ],
		[ ac_cv_have_mode_t="no" ]
	)
])
if test "x$ac_cv_have_mode_t" = "xyes" ; then
	AC_DEFINE(HAVE_MODE_T)
fi


AC_CACHE_CHECK([for struct sockaddr_storage], ac_cv_have_struct_sockaddr_storage, [
	AC_TRY_COMPILE(
		[
#include <sys/types.h>
#include <sys/socket.h>
		],
		[ struct sockaddr_storage s; ],
		[ ac_cv_have_struct_sockaddr_storage="yes" ],
		[ ac_cv_have_struct_sockaddr_storage="no" ]
	)
])
if test "x$ac_cv_have_struct_sockaddr_storage" = "xyes" ; then
	AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)
fi

AC_CACHE_CHECK([for struct sockaddr_in6], ac_cv_have_struct_sockaddr_in6, [
	AC_TRY_COMPILE(
		[
#include <sys/types.h>
#include <netinet/in.h>
		],
		[ struct sockaddr_in6 s; s.sin6_family = 0; ],
		[ ac_cv_have_struct_sockaddr_in6="yes" ],
		[ ac_cv_have_struct_sockaddr_in6="no" ]
	)
])
if test "x$ac_cv_have_struct_sockaddr_in6" = "xyes" ; then
	AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)
fi

AC_CACHE_CHECK([for struct in6_addr], ac_cv_have_struct_in6_addr, [
	AC_TRY_COMPILE(
		[
#include <sys/types.h>
#include <netinet/in.h>
		],
		[ struct in6_addr s; s.s6_addr[0] = 0; ],
		[ ac_cv_have_struct_in6_addr="yes" ],
		[ ac_cv_have_struct_in6_addr="no" ]
	)
])
if test "x$ac_cv_have_struct_in6_addr" = "xyes" ; then
	AC_DEFINE(HAVE_STRUCT_IN6_ADDR)
fi

AC_CACHE_CHECK([for struct addrinfo], ac_cv_have_struct_addrinfo, [
	AC_TRY_COMPILE(
		[
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
		],
		[ struct addrinfo s; s.ai_flags = AI_PASSIVE; ],
		[ ac_cv_have_struct_addrinfo="yes" ],
		[ ac_cv_have_struct_addrinfo="no" ]
	)
])
if test "x$ac_cv_have_struct_addrinfo" = "xyes" ; then
	AC_DEFINE(HAVE_STRUCT_ADDRINFO)
fi


# Checks for structure members

OSSH_CHECK_HEADER_FOR_FIELD(ut_host, utmp.h, HAVE_HOST_IN_UTMP)
OSSH_CHECK_HEADER_FOR_FIELD(ut_host, utmpx.h, HAVE_HOST_IN_UTMPX)
OSSH_CHECK_HEADER_FOR_FIELD(syslen, utmpx.h, HAVE_SYSLEN_IN_UTMPX)
OSSH_CHECK_HEADER_FOR_FIELD(ut_pid, utmp.h, HAVE_PID_IN_UTMP)
OSSH_CHECK_HEADER_FOR_FIELD(ut_type, utmp.h, HAVE_TYPE_IN_UTMP)
OSSH_CHECK_HEADER_FOR_FIELD(ut_type, utmpx.h, HAVE_TYPE_IN_UTMPX)
OSSH_CHECK_HEADER_FOR_FIELD(ut_tv, utmp.h, HAVE_TV_IN_UTMP)
OSSH_CHECK_HEADER_FOR_FIELD(ut_id, utmp.h, HAVE_ID_IN_UTMP)
OSSH_CHECK_HEADER_FOR_FIELD(ut_id, utmpx.h, HAVE_ID_IN_UTMPX)
OSSH_CHECK_HEADER_FOR_FIELD(ut_addr, utmp.h, HAVE_ADDR_IN_UTMP)
OSSH_CHECK_HEADER_FOR_FIELD(ut_addr, utmpx.h, HAVE_ADDR_IN_UTMPX)
OSSH_CHECK_HEADER_FOR_FIELD(ut_addr_v6, utmp.h, HAVE_ADDR_V6_IN_UTMP)
OSSH_CHECK_HEADER_FOR_FIELD(ut_addr_v6, utmpx.h, HAVE_ADDR_V6_IN_UTMPX)
OSSH_CHECK_HEADER_FOR_FIELD(ut_exit, utmp.h, HAVE_EXIT_IN_UTMP)
OSSH_CHECK_HEADER_FOR_FIELD(ut_time, utmp.h, HAVE_TIME_IN_UTMP)
OSSH_CHECK_HEADER_FOR_FIELD(ut_time, utmpx.h, HAVE_TIME_IN_UTMPX)
OSSH_CHECK_HEADER_FOR_FIELD(ut_tv, utmpx.h, HAVE_TV_IN_UTMPX)

AC_CACHE_CHECK([for ss_family field in struct sockaddr_storage],
		ac_cv_have_ss_family_in_struct_ss, [
	AC_TRY_COMPILE(
		[
#include <sys/types.h>
#include <sys/socket.h>
		],
		[ struct sockaddr_storage s; s.ss_family = 1; ],
		[ ac_cv_have_ss_family_in_struct_ss="yes" ],
		[ ac_cv_have_ss_family_in_struct_ss="no" ],
	)
])
if test "x$ac_cv_have_ss_family_in_struct_ss" = "xyes" ; then
	AC_DEFINE(HAVE_SS_FAMILY_IN_SS)
fi

AC_CACHE_CHECK([for __ss_family field in struct sockaddr_storage],
		ac_cv_have___ss_family_in_struct_ss, [
	AC_TRY_COMPILE(
		[
#include <sys/types.h>
#include <sys/socket.h>
		],
		[ struct sockaddr_storage s; s.__ss_family = 1; ],
		[ ac_cv_have___ss_family_in_struct_ss="yes" ],
		[ ac_cv_have___ss_family_in_struct_ss="no" ]
	)
])
if test "x$ac_cv_have___ss_family_in_struct_ss" = "xyes" ; then
	AC_DEFINE(HAVE___SS_FAMILY_IN_SS)
fi


AC_CACHE_CHECK([if libc defines __progname], ac_cv_libc_defines___progname, [
	AC_TRY_LINK([], 
		[ extern char *__progname; printf("%s", __progname); ], 
		[ ac_cv_libc_defines___progname="yes" ],
		[ ac_cv_libc_defines___progname="no" ]
	)
])
if test "x$ac_cv_libc_defines___progname" = "xyes" ; then
	AC_DEFINE(HAVE___PROGNAME)
fi


# Looking for programs, paths and files
AC_ARG_WITH(rsh,
	[  --with-rsh=PATH         Specify path to remote shell program ],
	[
		if test "x$withval" != "$no" ; then
			rsh_path=$withval
		fi
	],
	[
		AC_PATH_PROG(rsh_path, rsh)
	]
)

AC_ARG_WITH(xauth,
	[  --with-xauth=PATH       Specify path to xauth program ],
	[
		if test "x$withval" != "$xno" ; then
			xauth_path=$withval
		fi
	],
	[
		AC_PATH_PROG(xauth_path, xauth)
		if (test ! -z "$xauth_path" && test -x "/usr/openwin/bin/xauth") ; then
			xauth_path="/usr/openwin/bin/xauth"
		fi
	]
)

if test ! -z "$xauth_path" ; then
	AC_DEFINE_UNQUOTED(XAUTH_PATH, "$xauth_path")
fi
if test ! -z "$rsh_path" ; then
	AC_DEFINE_UNQUOTED(RSH_PATH, "$rsh_path")
fi

# Check for mail directory (last resort if we cannot get it from headers)
if test ! -z "$MAIL" ; then
	maildir=`dirname $MAIL`
	AC_DEFINE_UNQUOTED(MAIL_DIRECTORY, "$maildir")
fi

if test -z "$no_dev_ptmx" ; then
	AC_CHECK_FILE("/dev/ptmx", 
		[
			AC_DEFINE_UNQUOTED(HAVE_DEV_PTMX)
			have_dev_ptmx=1
		]
	)
fi
AC_CHECK_FILE("/dev/ptc", 
	[
		AC_DEFINE_UNQUOTED(HAVE_DEV_PTS_AND_PTC)
		have_dev_ptc=1
	]
)

# Options from here on. Some of these are preset by platform above

# Check for user-specified random device, otherwise check /dev/urandom
AC_ARG_WITH(random,
	[  --with-random=FILE      read randomness from FILE (default=/dev/urandom)],
	[
		if test "x$withval" != "xno" ; then
			RANDOM_POOL="$withval";
			AC_DEFINE_UNQUOTED(RANDOM_POOL, "$RANDOM_POOL")
		fi
	],
	[
		# Check for random device
		AC_CHECK_FILE("/dev/urandom",
			[
				RANDOM_POOL="/dev/urandom"; 
				AC_SUBST(RANDOM_POOL)
				AC_DEFINE_UNQUOTED(RANDOM_POOL, "$RANDOM_POOL")
			]
		)
	]
)

# Check for EGD pool file
AC_ARG_WITH(egd-pool,
	[  --with-egd-pool=FILE    read randomness from EGD pool FILE (default none)],
	[
		if test "x$withval" != "xno" ; then
			EGD_SOCKET="$withval";
			AC_DEFINE_UNQUOTED(EGD_SOCKET, "$EGD_SOCKET")
		fi
	]
)

# detect pathnames for entropy gathering commands, if we need them
INSTALL_SSH_PRNG_CMDS=""
rm -f prng_commands
if (test -z "$RANDOM_POOL" && test -z "$EGD_SOCKET") ; then
	# Use these commands to collect entropy
	OSSH_PATH_ENTROPY_PROG(PROG_LS, ls)
	OSSH_PATH_ENTROPY_PROG(PROG_NETSTAT, netstat)
	OSSH_PATH_ENTROPY_PROG(PROG_ARP, arp)
	OSSH_PATH_ENTROPY_PROG(PROG_IFCONFIG, ifconfig)
	OSSH_PATH_ENTROPY_PROG(PROG_PS, ps)
	OSSH_PATH_ENTROPY_PROG(PROG_W, w)
	OSSH_PATH_ENTROPY_PROG(PROG_WHO, who)
	OSSH_PATH_ENTROPY_PROG(PROG_LAST, last)
	OSSH_PATH_ENTROPY_PROG(PROG_LASTLOG, lastlog)
	OSSH_PATH_ENTROPY_PROG(PROG_DF, df)
	OSSH_PATH_ENTROPY_PROG(PROG_VMSTAT, vmstat)
	OSSH_PATH_ENTROPY_PROG(PROG_UPTIME, uptime)
	OSSH_PATH_ENTROPY_PROG(PROG_IPCS, ipcs)
	OSSH_PATH_ENTROPY_PROG(PROG_TAIL, tail)
	OSSH_PATH_ENTROPY_PROG(PROG_LS, ls)

	INSTALL_SSH_PRNG_CMDS="yes"
fi
AC_SUBST(INSTALL_SSH_PRNG_CMDS)


AC_ARG_WITH(catman,
	[  --with-catman=man|cat   Install preformatted manpages[no]],
	[
		MANTYPE='$(CATMAN)'
		if test x"$withval" != x"yes" ; then
		   mansubdir=$withval
		else
		   mansubdir=cat
		fi
	], [
		if test -z "$MANTYPE" ; then
			MANTYPE='$(TROFFMAN)'
			mansubdir=man
		fi
	]
)
AC_SUBST(MANTYPE)
AC_SUBST(mansubdir)

# Check whether user wants Kerberos support
KRB4_MSG="no" 
AC_ARG_WITH(kerberos4,
	[  --with-kerberos4=PATH   Enable Kerberos 4 support],
	[
		if test "x$withval" != "xno" ; then
	
			if test "x$withval" != "$xyes" ; then
				CFLAGS="$CFLAGS -I${withval}/include"
				LDFLAGS="$LDFLAGS -L${withval}/lib"
				if test ! -z "$need_dash_r" ; then
					LDFLAGS="$LDFLAGS -R${withval}/lib"
				fi
				if test ! -z "$blibpath" ; then
					blibpath="$blibpath:${withval}/lib"
				fi
			else
				if test -d /usr/include/kerberosIV ; then
					CFLAGS="$CFLAGS -I/usr/include/kerberosIV"
				fi
			fi

			AC_CHECK_HEADERS(krb.h)
			AC_CHECK_LIB(krb, main)
			if test "$ac_cv_header_krb_h" != yes; then
				AC_MSG_WARN([Cannot find krb.h, build may fail])
			fi
			if test "$ac_cv_lib_krb_main" != yes; then
				AC_MSG_WARN([Cannot find libkrb, build may fail])
			fi

			KLIBS="-lkrb -ldes"
			AC_CHECK_LIB(resolv, dn_expand, , )
			KRB4=yes
			KRB4_MSG="yes" 
			AC_DEFINE(KRB4)
		fi
	]
)

# Check whether user wants AFS support
AFS_MSG="no" 
AC_ARG_WITH(afs,
	[  --with-afs=PATH         Enable AFS support],
	[
		if test "x$withval" != "xno" ; then

			if test "x$withval" != "$xyes" ; then
				CFLAGS="$CFLAGS -I${withval}/include"
				LFLAGS="$LFLAGS -L${withval}/lib"
			fi

			if test -z "$KRB4" ; then
				AC_MSG_WARN([AFS requires Kerberos IV support, build may fail])
			fi

			LIBS="$LIBS -lkafs"
			if test ! -z "$AFS_LIBS" ; then
				LIBS="$LIBS $AFS_LIBS"
			fi
			AC_DEFINE(AFS)
			AFS_MSG="yes" 
		fi
	]
)
LIBS="$LIBS $KLIBS"

# Check whether user wants S/Key support
SKEY_MSG="no" 
AC_ARG_WITH(skey,
	[  --with-skey             Enable S/Key support],
	[
		if test "x$withval" != "xno" ; then
			AC_DEFINE(SKEY)
			LIBS="$LIBS -lskey"
			SKEY_MSG="yes" 
		fi
	]
)

# Check whether user wants TCP wrappers support
TCPW_MSG="no" 
AC_ARG_WITH(tcp-wrappers,
	[  --with-tcp-wrappers     Enable tcpwrappers support],
	[
		if test "x$withval" != "xno" ; then
			saved_LIBS="$LIBS"
			LIBS="$LIBS -lwrap"
			AC_MSG_CHECKING(for libwrap)
			AC_TRY_LINK(
				[
#include <tcpd.h>
					int deny_severity = 0, allow_severity = 0;
				],
				[hosts_access(0);],
				[
					AC_MSG_RESULT(yes)
					AC_DEFINE(LIBWRAP)
					TCPW_MSG="yes" 
				],
				[
					AC_MSG_ERROR([*** libwrap missing])
				]
			)
		fi
	]
)

# Check whether to enable MD5 passwords
MD5_MSG="no" 
AC_ARG_WITH(md5-passwords,
	[  --with-md5-passwords    Enable use of MD5 passwords],
	[
		if test "x$withval" != "xno" ; then
			AC_DEFINE(HAVE_MD5_PASSWORDS)
			MD5_MSG="yes" 
		fi
	]
)

# Whether to disable shadow password support
AC_ARG_WITH(shadow,
	[  --without-shadow        Disable shadow password support],
	[
		if test "x$withval" = "xno" ; then	
			AC_DEFINE(DISABLE_SHADOW)
			disable_shadow=yes
		fi
	]
)

if test -z "$disable_shadow" ; then
	AC_MSG_CHECKING([if the systems has expire shadow information])
	AC_TRY_COMPILE(
	[
#include <sys/types.h>
#include <shadow.h>
	struct spwd sp;
	],[ sp.sp_expire = sp.sp_lstchg = sp.sp_inact = 0; ],
	[ sp_expire_available=yes ], []
	)

	if test "x$sp_expire_available" = "xyes" ; then
		AC_MSG_RESULT(yes)
		AC_DEFINE(HAS_SHADOW_EXPIRE)
	else
		AC_MSG_RESULT(no)
	fi
fi

# Use ip address instead of hostname in $DISPLAY
DISPLAY_HACK_MSG="no" 
AC_ARG_WITH(ipaddr-display,
	[  --with-ipaddr-display   Use ip address instead of hostname in \$DISPLAY],
	[
		if test "x$withval" = "xno" ; then	
			AC_DEFINE(IPADDR_IN_DISPLAY)
			DISPLAY_HACK_MSG="yes" 
		fi
	]
)

# Whether to mess with the default path
SERVER_PATH_MSG="(default)" 
AC_ARG_WITH(default-path,
	[  --with-default-path=PATH Specify default \$PATH environment for server],
	[
		if test "x$withval" != "xno" ; then	
			AC_DEFINE_UNQUOTED(USER_PATH, "$withval")
			SERVER_PATH_MSG="$withval" 
		fi
	]
)

# Whether to force IPv4 by default (needed on broken glibc Linux)
IPV4_HACK_MSG="no" 
AC_ARG_WITH(ipv4-default,
	[  --with-ipv4-default     Use IPv4 by connections unless '-6' specified],
	[
		if test "x$withval" != "xno" ; then	
			AC_DEFINE(IPV4_DEFAULT)
			IPV4_HACK_MSG="yes" 
		fi
	]
)

AC_MSG_CHECKING([if we need to convert IPv4 in IPv6-mapped addresses])
IPV4_IN6_HACK_MSG="no" 
AC_ARG_WITH(4in6,
	[  --with-4in6             Check for and convert IPv4 in IPv6 mapped addresses],
	[
		if test "x$withval" != "xno" ; then
			AC_MSG_RESULT(yes)
			AC_DEFINE(IPV4_IN_IPV6)
			IPV4_IN6_HACK_MSG="yes" 
		else
			AC_MSG_RESULT(no)
		fi
	],[
		if test "x$inet6_default_4in6" = "xyes"; then
			AC_MSG_RESULT([yes (default)])
			AC_DEFINE(IPV4_IN_IPV6)
			IPV4_IN6_HACK_MSG="yes" 
		else
			AC_MSG_RESULT([no (default)])
		fi
	]
)

# Where to place sshd.pid
piddir=/var/run
AC_ARG_WITH(pid-dir,
	[  --with-pid-dir=PATH     Specify location of ssh.pid file],
	[
		if test "x$withval" != "xno" ; then	
			piddir=$withval
		fi
	]
)

AC_DEFINE_UNQUOTED(PIDDIR, "$piddir")
AC_SUBST(piddir)

dnl allow user to disable some login recording features
AC_ARG_ENABLE(lastlog,
	[  --disable-lastlog       disable use of lastlog even if detected [no]],
	[ AC_DEFINE(DISABLE_LASTLOG) ]
)
AC_ARG_ENABLE(utmp,
	[  --disable-utmp          disable use of utmp even if detected [no]],
	[ AC_DEFINE(DISABLE_UTMP) ]
)
AC_ARG_ENABLE(utmpx,
	[  --disable-utmpx         disable use of utmpx even if detected [no]],
	[ AC_DEFINE(DISABLE_UTMPX) ]
)
AC_ARG_ENABLE(wtmp,
	[  --disable-wtmp          disable use of wtmp even if detected [no]],
	[ AC_DEFINE(DISABLE_WTMP) ]
)
AC_ARG_ENABLE(wtmpx,
	[  --disable-wtmpx         disable use of wtmpx even if detected [no]],
	[ AC_DEFINE(DISABLE_WTMPX) ]
)
AC_ARG_ENABLE(libutil,
	[  --disable-libutil       disable use of libutil (login() etc.) [no]],
	[ AC_DEFINE(DISABLE_LOGIN) ]
)
AC_ARG_ENABLE(pututline,
	[  --disable-pututline     disable use of pututline() etc. ([uw]tmp) [no]],
	[ AC_DEFINE(DISABLE_PUTUTLINE) ]
)
AC_ARG_ENABLE(pututxline,
	[  --disable-pututxline    disable use of pututxline() etc. ([uw]tmpx) [no]],
	[ AC_DEFINE(DISABLE_PUTUTXLINE) ]
)
AC_ARG_WITH(lastlog,
  [  --with-lastlog=FILE|DIR specify lastlog location [common locations]],
  [ conf_lastlog_location="$withval";  ],)

dnl lastlog, [uw]tmpx? detection
dnl  NOTE: set the paths in the platform section to avoid the
dnl   need for command-line parameters
dnl lastlog and [uw]tmp are subject to a file search if all else fails

dnl lastlog detection
dnl  NOTE: the code itself will detect if lastlog is a directory
AC_MSG_CHECKING([if your system defines LASTLOG_FILE])
AC_TRY_COMPILE([
#include <sys/types.h>
#include <utmp.h>
#ifdef HAVE_LASTLOG_H
#  include <lastlog.h>
#endif
#ifdef HAVE_PATHS_H
#  include <paths.h>
#endif
	],
	[ char *lastlog = LASTLOG_FILE; ],
	[ AC_MSG_RESULT(yes) ],
	[
		AC_MSG_RESULT(no)
		AC_MSG_CHECKING([if your system defines _PATH_LASTLOG])
		AC_TRY_COMPILE([
#include <sys/types.h>
#include <utmp.h>
#ifdef HAVE_LASTLOG_H
#  include <lastlog.h>
#endif
#ifdef HAVE_PATHS_H
#  include <paths.h>
#endif
		],
		[ char *lastlog = _PATH_LASTLOG; ],
		[ AC_MSG_RESULT(yes) ],
		[
			AC_MSG_RESULT(no)
			system_lastlog_path=no
		])
	]
)

if test -z "$conf_lastlog_location"; then
	if test x"$system_lastlog_path" = x"no" ; then
		for f in /var/log/lastlog /usr/adm/lastlog /var/adm/lastlog /etc/security/lastlog ; do
				if (test -d "$f" || test -f "$f") ; then
					conf_lastlog_location=$f
				fi
		done
		if test -z "$conf_lastlog_location"; then
			AC_MSG_WARN([** Cannot find lastlog **])
			dnl Don't define DISABLE_LASTLOG - that means we don't try wtmp/wtmpx
		fi
	fi
fi

if test -n "$conf_lastlog_location"; then
	AC_DEFINE_UNQUOTED(CONF_LASTLOG_FILE, "$conf_lastlog_location")
fi	

dnl utmp detection
AC_MSG_CHECKING([if your system defines UTMP_FILE])
AC_TRY_COMPILE([
#include <sys/types.h>
#include <utmp.h>
#ifdef HAVE_PATHS_H
#  include <paths.h>
#endif
	],
	[ char *utmp = UTMP_FILE; ],
	[ AC_MSG_RESULT(yes) ],
	[ AC_MSG_RESULT(no)
	  system_utmp_path=no ]
)
if test -z "$conf_utmp_location"; then
	if test x"$system_utmp_path" = x"no" ; then
		for f in /etc/utmp /usr/adm/utmp /var/run/utmp; do
			if test -f $f ; then
				conf_utmp_location=$f
			fi
		done
		if test -z "$conf_utmp_location"; then
			AC_DEFINE(DISABLE_UTMP)
		fi
	fi
fi
if test -n "$conf_utmp_location"; then
	AC_DEFINE_UNQUOTED(CONF_UTMP_FILE, "$conf_utmp_location")
fi	

dnl wtmp detection
AC_MSG_CHECKING([if your system defines WTMP_FILE])
AC_TRY_COMPILE([
#include <sys/types.h>
#include <utmp.h>
#ifdef HAVE_PATHS_H
#  include <paths.h>
#endif
	],
	[ char *wtmp = WTMP_FILE; ],
	[ AC_MSG_RESULT(yes) ],
	[ AC_MSG_RESULT(no)
	  system_wtmp_path=no ]
)
if test -z "$conf_wtmp_location"; then
	if test x"$system_wtmp_path" = x"no" ; then
		for f in /usr/adm/wtmp /var/log/wtmp; do
			if test -f $f ; then
				conf_wtmp_location=$f
			fi
		done
		if test -z "$conf_wtmp_location"; then
			AC_DEFINE(DISABLE_WTMP)
		fi
	fi
fi
if test -n "$conf_wtmp_location"; then
	AC_DEFINE_UNQUOTED(CONF_WTMP_FILE, "$conf_wtmp_location")
fi	


dnl utmpx detection - I don't know any system so perverse as to require
dnl  utmpx, but not define UTMPX_FILE (ditto wtmpx.) No doubt it's out
dnl  there, though.
AC_MSG_CHECKING([if your system defines UTMPX_FILE])
AC_TRY_COMPILE([
#include <sys/types.h>
#include <utmp.h>
#ifdef HAVE_UTMPX_H
#include <utmpx.h>
#endif
#ifdef HAVE_PATHS_H
#  include <paths.h>
#endif
	],
	[ char *utmpx = UTMPX_FILE; ],
	[ AC_MSG_RESULT(yes) ],
	[ AC_MSG_RESULT(no)
	  system_utmpx_path=no ]
)
if test -z "$conf_utmpx_location"; then
	if test x"$system_utmpx_path" = x"no" ; then
		AC_DEFINE(DISABLE_UTMPX)
	fi
else
	AC_DEFINE_UNQUOTED(CONF_UTMPX_FILE, "$conf_utmpx_location")
fi	

dnl wtmpx detection
AC_MSG_CHECKING([if your system defines WTMPX_FILE])
AC_TRY_COMPILE([
#include <sys/types.h>
#include <utmp.h>
#ifdef HAVE_UTMPX_H
#include <utmpx.h>
#endif
#ifdef HAVE_PATHS_H
#  include <paths.h>
#endif
	],
	[ char *wtmpx = WTMPX_FILE; ],
	[ AC_MSG_RESULT(yes) ],
	[ AC_MSG_RESULT(no)
	  system_wtmpx_path=no ]
)
if test -z "$conf_wtmpx_location"; then
	if test x"$system_wtmpx_path" = x"no" ; then
		AC_DEFINE(DISABLE_WTMPX)
	fi
else
	AC_DEFINE_UNQUOTED(CONF_WTMPX_FILE, "$conf_wtmpx_location")
fi	


# Change default command timeout for builtin PRNG
entropy_timeout=200
AC_ARG_WITH(entropy-timeout,
	[  --with-entropy-timeout  Specify entropy gathering command timeout (msec)],
	[
		if test "x$withval" != "xno" ; then
			entropy_timeout=$withval
		fi
	]	
)
AC_DEFINE_UNQUOTED(ENTROPY_TIMEOUT_MSEC, $entropy_timeout)


if test ! -z "$blibpath" ; then
	LDFLAGS="$LDFLAGS -blibpath:$blibpath"
	AC_MSG_WARN([Please check and edit -blibpath in LDFLAGS in Makefile])
fi

AC_OUTPUT(Makefile ssh_prng_cmds)

# Print summary of options

if test x$MANTYPE = x'$(CATMAN)' ; then
	MAN_MSG=cat
else 
	MAN_MSG=man
fi
if test ! -z "$RANDOM_POOL" ; then
	RAND_MSG="Device ($RANDOM_POOL)"
else
	if test ! -z "$EGD_SOCKET" ; then
		RAND_MSG="EGD ($EGD_SOCKET)"
	else
		RAND_MSG="Builtin (timeout $entropy_timeout)"
	fi
fi

# Someone please show me a better way :)
A=`eval echo ${prefix}` ; A=`eval echo ${A}`
B=`eval echo ${bindir}` ; B=`eval echo ${B}`
C=`eval echo ${sbindir}` ; C=`eval echo ${C}`
D=`eval echo ${sysconfdir}` ; D=`eval echo ${D}`
E=`eval echo ${libexecdir}/ssh/ssh-askpass` ; E=`eval echo ${E}`
F=`eval echo ${mandir}/${mansubdir}X` ; F=`eval echo ${F}`
G=`eval echo ${piddir}` ; G=`eval echo ${G}`

echo ""
echo "OpenSSH configured has been configured with the following options."
echo "                 User binaries: $B"
echo "               System binaries: $C"
echo "           Configuration files: $D"
echo "               Askpass program: $E"
echo "                  Manual pages: $F"
echo "                      PID file: $G"
echo "      Random number collection: $RAND_MSG"
echo "                Manpage format: $MAN_MSG"
echo "                   PAM support: ${PAM_MSG}"
echo "            KerberosIV support: $KRB4_MSG"
echo "                   AFS support: $AFS_MSG"
echo "                 S/KEY support: $SKEY_MSG"
echo "          TCP Wrappers support: $TCPW_MSG"
echo "          MD5 password support: $MD5_MSG"
echo "   IP address in \$DISPLAY hack: $DISPLAY_HACK_MSG"
echo "      Use IPv4 by default hack: $IPV4_HACK_MSG"
echo "       Translate v4 in v6 hack: $IPV4_IN6_HACK_MSG"

echo ""

echo "Compiler flags: ${CFLAGS}"
echo "Linker flags: ${LDFLAGS}"
echo "Libraries: ${LIBS}"

echo ""

