AC_INIT(ssh.c)

AC_CONFIG_HEADER(config.h)
AC_CANONICAL_HOST

dnl Checks for programs.
AC_PROG_CC
AC_PROG_CPP
AC_PROG_RANLIB
AC_PROG_INSTALL
AC_CHECK_PROG(AR, ar, ar)
AC_PATH_PROG(PERL, perl)
AC_SUBST(PERL)

AC_ARG_WITH(rsh,
	[  --with-rsh=PATH         Specify path to remote shell program ],
	[
		if test "x$withval" != "$xno" ; then
			AC_DEFINE_UNQUOTED(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
			AC_DEFINE_UNQUOTED(XAUTH_PATH, "$withval")
		fi
	],
	[
		AC_PATH_PROG(xauth_path, xauth)
		if test ! -z "$xauth_path" -a -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

dnl Checks for compiler characteristics
if test "$GCC" = "yes"; then CFLAGS="$CFLAGS -Wall"; fi

AC_C_INLINE

dnl Check for some target-specific stuff
case "$host" in
*-*-aix*)
	AFS_LIBS="-lld"
	;;
*-*-hpux10*)
	if test -z "$GCC"; then
		CFLAGS="$CFLAGS -Aa"
	fi
	CFLAGS="$CFLAGS -D_HPUX_SOURCE"
	AC_DEFINE(IPADDR_IN_DISPLAY)
	AC_DEFINE(USE_UTMPX)
	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
	;;
*-*-irix5*)
	no_libsocket=1
	no_libnsl=1
	;;
*-*-irix6*)
	AC_MSG_WARN([*** Irix 6.x is not tested *** ])
	no_libsocket=1
	no_libnsl=1
	;;
*-*-linux*)
	no_dev_ptmx=1
	;;
*-*-solaris*)
	AC_DEFINE(USE_UTMPX)
	;;
*-*-sysv*)
	LIBS="$LIBS -lgen -lsocket"
	;;
esac

dnl Check for OpenSSL/SSLeay directories.
AC_MSG_CHECKING([for OpenSSL/SSLeay directory])
for ssldir in /usr /usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local $prefix /usr/pkg ; do
	if test -f "$ssldir/include/openssl/crypto.h"; then
		AC_DEFINE(HAVE_OPENSSL)
		GOT_SSL="yes"
		break
	fi
	if test -f "$ssldir/include/ssl/crypto.h"; then
		AC_DEFINE(HAVE_SSL)
		GOT_SSL="yes"
		break
	fi
done
if test -z "$GOT_SSL" ; then
	AC_MSG_ERROR([Could not find SSLeay / OpenSSL libraries, please install])	
fi
AC_SUBST(ssldir)
AC_DEFINE_UNQUOTED(ssldir, "$ssldir")
if test "$ssldir" != "/usr"; then
	CFLAGS="$CFLAGS -I$ssldir/include"
	LDFLAGS="$LDFLAGS -L$ssldir/lib"
fi
AC_MSG_RESULT($ssldir)

dnl Check for RSAref library.
AC_MSG_CHECKING([for RSAref library])
saved_LIBS="$LIBS"
LIBS="$saved_LIBS -lRSAglue -lrsaref"
AC_TRY_LINK([], [],
[AC_MSG_RESULT(yes);
 AC_DEFINE(RSAREF)],
[AC_MSG_RESULT(no)]; LIBS="$saved_LIBS")

dnl Checks for libraries.
AC_CHECK_LIB(crypto, CRYPTO_lock, ,AC_MSG_ERROR([*** libcrypto missing - please install first ***]))
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

dnl Checks for header files.
AC_CHECK_HEADERS(bstring.h endian.h lastlog.h login.h maillock.h netdb.h netgroup.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/stropts.h sys/time.h sys/ttcompat.h util.h utmp.h utmpx.h)

dnl Checks for library functions.
AC_CHECK_FUNCS(arc4random bindresvport_af freeaddrinfo gai_strerror getaddrinfo getpagesize getnameinfo innetgr md5_crypt mkdtemp openpty rresvport_af setenv seteuid setlogin setproctitle setreuid snprintf strlcat strlcpy updwtmpx vsnprintf _getpty __snprintf __vsnprintf)

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)])]
)

dnl Checks for data types
AC_CHECK_SIZEOF(short int, 2)
AC_CHECK_SIZEOF(int, 4)
AC_CHECK_SIZEOF(long int, 4)
AC_CHECK_SIZEOF(long long int, 8)

dnl More checks for data types
AC_MSG_CHECKING([for intXX_t types])
AC_TRY_COMPILE(
	[#include <sys/types.h>], 
	[int16_t a; int32_t b; a = 1235; b = 1235;], 
	[
		AC_DEFINE(HAVE_INTXX_T)
		AC_MSG_RESULT(yes)
		have_intxx_t=1
	],
	[AC_MSG_RESULT(no)]
) 

AC_MSG_CHECKING([for u_intXX_t types])
AC_TRY_COMPILE(
	[#include <sys/types.h>], 
	[u_int16_t c; u_int32_t d; c = 1235; d = 1235;], 
	[
		AC_DEFINE(HAVE_U_INTXX_T)
		AC_MSG_RESULT(yes)
		have_u_intxx_t=1
	],
	[AC_MSG_RESULT(no)]
) 

if test -z "$have_u_intxx_t" -a -z "$have_intxx_t" -a \
           "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>], 
		[
			u_int16_t c; u_int32_t d; 
			int16_t e; int32_t f;
			c = 1235; d = 1235;
			e = 1235; f = 1235;
		], 
		[
			AC_DEFINE(HAVE_U_INTXX_T)
			AC_DEFINE(HAVE_INTXX_T)
			AC_MSG_RESULT(yes)
		],
		[AC_MSG_RESULT(no)]
	) 
fi

AC_MSG_CHECKING([for uintXX_t types])
AC_TRY_COMPILE(
	[#include <sys/types.h>], 
	[uint16_t c; uint32_t d; c = 1235; d = 1235;], 
	[
		AC_DEFINE(HAVE_UINTXX_T)
		AC_MSG_RESULT(yes)
	],
	[AC_MSG_RESULT(no)]
) 

AC_MSG_CHECKING([for socklen_t])
AC_TRY_COMPILE(
	[
		#include <sys/types.h>
		#include <sys/socket.h>
	],
	[socklen_t foo; foo = 1235;],
	[
		AC_DEFINE(HAVE_SOCKLEN_T)
		AC_MSG_RESULT(yes)
	],
	[AC_MSG_RESULT(no)]
)

AC_MSG_CHECKING([for size_t])
AC_TRY_COMPILE(
	[#include <sys/types.h>],
	[size_t foo; foo = 1235;],
	[
		AC_DEFINE(HAVE_SIZE_T)
		AC_MSG_RESULT(yes)
	],
	[AC_MSG_RESULT(no)]
)

AC_MSG_CHECKING([for struct sockaddr_storage])
AC_TRY_COMPILE(
	[#include <sys/socket.h>],
	[struct sockaddr_storage s;],
	[
		AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE)
		AC_MSG_RESULT(yes)
	],
	[AC_MSG_RESULT(no)]
)

AC_MSG_CHECKING([for struct sockaddr_in6])
AC_TRY_COMPILE(
	[#include <netinet/in.h>],
	[struct sockaddr_in6 s; s.sin6_family = 0;],
	[
		AC_DEFINE(HAVE_STRUCT_SOCKADDR_IN6)
		AC_MSG_RESULT(yes)
	],
	[AC_MSG_RESULT(no)]
)

AC_MSG_CHECKING([for struct in6_addr])
AC_TRY_COMPILE(
	[#include <netinet/in.h>],
	[struct in6_addr s; s.s6_addr[0] = 0;],
	[
		AC_DEFINE(HAVE_STRUCT_IN6_ADDR)
		AC_MSG_RESULT(yes)
	],
	[AC_MSG_RESULT(no)]
)

AC_MSG_CHECKING([for struct addrinfo])
AC_TRY_COMPILE(
	[
		#include <sys/socket.h>
		#include <netdb.h>
	],
	[struct addrinfo s; s.ai_flags = AI_PASSIVE;],
	[
		AC_DEFINE(HAVE_STRUCT_ADDRINFO)
		AC_MSG_RESULT(yes)
	],
	[AC_MSG_RESULT(no)]
)

AC_ARG_WITH(pam,
	[  --without-pam           Disable PAM support ],
	[
		if test "x$withval" = "xno" ; then
			no_pam=1
			AC_DEFINE(DISABLE_PAM)
		fi
	]
)

if test -z "$no_pam" -a "x$ac_cv_header_security_pam_appl_h" = "xyes" ; then
	AC_CHECK_LIB(dl, dlopen, , )
	LIBS="$LIBS -lpam"
	dnl Check PAM strerror arguments
	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)
		]
	) 
fi

AC_MSG_CHECKING([whether to build GNOME ssh-askpass])
dnl Check whether user wants GNOME ssh-askpass
AC_ARG_WITH(gnome-askpass,
	[  --with-gnome-askpass    Build the GNOME passphrase requester (default=no)],
	[
		if test x$withval = xno ; then
			GNOME_ASKPASS="";
		else
			GNOME_ASKPASS="gnome-ssh-askpass";
		fi
	])
AC_SUBST(GNOME_ASKPASS)

if test -z "$GNOME_ASKPASS" ; then
	AC_MSG_RESULT(no)
else
	AC_MSG_RESULT(yes)
fi

dnl Check for user-specified random device
AC_ARG_WITH(random,
	[  --with-random=FILE      read randomness from FILE (default=/dev/urandom)],
	[
		RANDOM_POOL="$withval";
		AC_DEFINE_UNQUOTED(RANDOM_POOL, "$RANDOM_POOL")
	],
	[
		dnl Check for random device
		AC_CHECK_FILE("/dev/urandom",
			[
				RANDOM_POOL="/dev/urandom"; 
				AC_SUBST(RANDOM_POOL)
				AC_DEFINE_UNQUOTED(RANDOM_POOL, "$RANDOM_POOL")
			]
		)
	]
)

dnl Check for EGD pool file
AC_ARG_WITH(egd-pool,
	[  --with-egd-pool=FILE    read randomness from EGD pool FILE (default none)],
	[
		RANDOM_POOL="$withval";
		AC_DEFINE(HAVE_EGD)
		AC_SUBST(RANDOM_POOL)
		AC_DEFINE_UNQUOTED(RANDOM_POOL, "$RANDOM_POOL")
	]
)

dnl Make sure we have random number support
if test -z "$RANDOM_POOL" -a -z "$EGD_POOL"; then
	AC_MSG_ERROR([No random device found, and no EGD random pool specified])
fi

AC_MSG_CHECKING([whether utmp.h has ut_host field])
AC_EGREP_HEADER(ut_host, utmp.h, 
	[AC_DEFINE(HAVE_HOST_IN_UTMP) AC_MSG_RESULT(yes); ], 
	[AC_MSG_RESULT(no)]
)
AC_MSG_CHECKING([whether utmpx.h has ut_host field])
AC_EGREP_HEADER(ut_host, utmpx.h, 
	[AC_DEFINE(HAVE_HOST_IN_UTMPX) AC_MSG_RESULT(yes); ], 
	[AC_MSG_RESULT(no)]
)
AC_MSG_CHECKING([whether utmpx.h has syslen field])
AC_EGREP_HEADER(syslen, utmpx.h, 
	[AC_DEFINE(HAVE_SYSLEN_IN_UTMPX) AC_MSG_RESULT(yes); ], 
	[AC_MSG_RESULT(no)]
)
AC_MSG_CHECKING([whether utmp.h has ut_pid field])
AC_EGREP_HEADER(ut_pid, utmp.h, 
	[AC_DEFINE(HAVE_PID_IN_UTMP) AC_MSG_RESULT(yes); ], 
	[AC_MSG_RESULT(no)]
)
AC_MSG_CHECKING([whether utmp.h has ut_type field])
AC_EGREP_HEADER(ut_type, utmp.h, 
	[AC_DEFINE(HAVE_TYPE_IN_UTMP) AC_MSG_RESULT(yes); ], 
	[AC_MSG_RESULT(no)]
)
AC_MSG_CHECKING([whether utmp.h has ut_tv field])
AC_EGREP_HEADER(ut_tv, utmp.h, 
	[AC_DEFINE(HAVE_TV_IN_UTMP) AC_MSG_RESULT(yes); ], 
	[AC_MSG_RESULT(no)]
)
AC_MSG_CHECKING([whether utmp.h has ut_id field])
AC_EGREP_HEADER(ut_id, utmp.h, 
	[AC_DEFINE(HAVE_ID_IN_UTMP) AC_MSG_RESULT(yes); ], 
	[AC_MSG_RESULT(no)]
)
AC_MSG_CHECKING([whether utmp.h has ut_addr field])
AC_EGREP_HEADER(ut_addr, utmp.h, 
	[AC_DEFINE(HAVE_ADDR_IN_UTMP) AC_MSG_RESULT(yes); ], 
	[AC_MSG_RESULT(no)]
)
AC_MSG_CHECKING([whether utmpx.h has ut_addr field])
AC_EGREP_HEADER(ut_addr, utmpx.h, 
	[AC_DEFINE(HAVE_ADDR_IN_UTMPX) AC_MSG_RESULT(yes); ], 
	[AC_MSG_RESULT(no)]
)
AC_MSG_CHECKING([whether utmp.h has ut_addr_v6 field])
AC_EGREP_HEADER(ut_addr_v6, utmp.h, 
	[AC_DEFINE(HAVE_ADDR_V6_IN_UTMP) AC_MSG_RESULT(yes); ], 
	[AC_MSG_RESULT(no)]
)
AC_MSG_CHECKING([whether utmpx.h has ut_addr_v6 field])
AC_EGREP_HEADER(ut_addr_v6, utmpx.h, 
	[AC_DEFINE(HAVE_ADDR_V6_IN_UTMPX) AC_MSG_RESULT(yes); ], 
	[AC_MSG_RESULT(no)]
)

AC_MSG_CHECKING([whether struct sockaddr_storage has ss_family field])
AC_TRY_COMPILE(
	[#include <sys/socket.h>],
	[struct sockaddr_storage s; s.ss_family = 1;],
	[
		AC_DEFINE(HAVE_SS_FAMILY_IN_SS)
		AC_MSG_RESULT(yes)
	],
	[AC_MSG_RESULT(no)]
)
AC_MSG_CHECKING([whether struct sockaddr_storage has __ss_family field])
AC_TRY_COMPILE(
	[#include <sys/socket.h>],
	[struct sockaddr_storage s; s.__ss_family = 1;],
	[
		AC_DEFINE(HAVE___SS_FAMILY_IN_SS)
		AC_MSG_RESULT(yes)
	],
	[AC_MSG_RESULT(no)]
)

dnl Look for lastlog location
AC_ARG_WITH(lastlog,
	[  --with-lastlog=FILE     Location of lastlog file],
	[
		if test "x$withval" = "xno" ; then
			AC_DEFINE(DISABLE_LASTLOG)
		else
			AC_DEFINE_UNQUOTED(LASTLOG_LOCATION, "$withval")
		fi
	],
	[
		AC_MSG_CHECKING([location of lastlog file])
		for lastlog in /var/log/lastlog /var/adm/lastlog /etc/security/lastlog ; do
			if test -f $lastlog ; then
				gotlastlog="file"
				break
			fi
			if test -d $lastlog ; then
				gotlastlog="dir"
				break
			fi
		done
		if test -z "$gotlastlog" ; then
			AC_MSG_RESULT(not found)
			nolastlog=1
		else
			if test "x$gotlastlog" = "xdir" ; then
				AC_MSG_RESULT(${lastlog}/)
				AC_DEFINE(LASTLOG_IS_DIR)
			else
				AC_MSG_RESULT($lastlog)
				AC_DEFINE_UNQUOTED(LASTLOG_LOCATION, "$lastlog")
			fi
		fi	
	]
)

if test ! -z "$nolastlog" ; then
	AC_MSG_WARN([*** Disabling lastlog support *** ])
	AC_DEFINE(DISABLE_LASTLOG)
fi

dnl Compile with dante SOCKS library
AC_ARG_WITH(dante,
	[  --with-dante=DIR        Use Dante SOCKS lib (default is system library path)],
	[
		AC_DEFINE(HAVE_DANTE)
		if test "x$withval" != "xno" ; then
			if test -n $withval ; then
				LIBS="$LIBS -L$withval"
			fi
			LIBS="$LIBS -lsocks"
		fi
	]
)

if test ! -z "$no_dev_ptmx" ; then
	AC_CHECK_FILE("/dev/ptmx", AC_DEFINE_UNQUOTED(HAVE_DEV_PTMX))
fi
AC_CHECK_FILE("/dev/ptc", AC_DEFINE_UNQUOTED(HAVE_DEV_PTS_AND_PTC))

AC_MSG_CHECKING([whether libc defines __progname])
AC_TRY_LINK([], 
	[extern char *__progname; printf("%s", __progname);], 
	[
		AC_DEFINE(HAVE___PROGNAME)
		AC_MSG_RESULT(yes)
	], 
	[
		AC_MSG_RESULT(no)
	]
)

dnl Check whether user wants Kerberos support
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"
			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

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

dnl Check whether user wants AFS support
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)
		fi
	]
)

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

dnl Check whether user wants TCP wrappers support
AC_ARG_WITH(tcp-wrappers,
	[  --with-tcp-wrappers     Enable tcpwrappers support],
	[
		if test "x$withval" != "$xno" ; then
			AC_DEFINE(LIBWRAP)
			LIBS="$LIBS -lwrap"
		fi
	]
)

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

dnl Check whether to enable utmpx support
AC_ARG_WITH(utmpx,
	[  --with-utmpx            Enable utmpx support],
	[
		if test "x$withval" != "xno" ; then
			AC_DEFINE(USE_UTMPX)
		fi
	]
)

dnl 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)
		fi
	]
)

dnl Use ip address instead of hostname in $DISPLAY
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)
		fi
	]
)

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")
		fi
	]
)

AC_ARG_WITH(pid-dir,
	[  --with-pid-dir=PATH     Specify location of ssh.pid file],
	[
		if test "x$withval" != "xno" ; then	
			AC_DEFINE_UNQUOTED(PID_DIR, "$withval")
		fi
	]
)

dnl 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

AC_OUTPUT(Makefile)
