dnl Process this file with autoconf to produce a configure script.
AC_INIT(lib/dialchk.c)
AM_INIT_AUTOMAKE(shadow, 4.0.3)
AM_CONFIG_HEADER(config.h)

dnl Some hacks...
test "$prefix" = "NONE" && prefix="/usr"
test "$prefix" = "/usr" && exec_prefix=""
test "$CFLAGS" = "" && CFLAGS="-O2 -Wall"
test "$LDFLAGS" = "" && LDFLAGS="-s"

AM_DISABLE_SHARED
AM_ENABLE_STATIC

dnl Checks for programs.
AC_PROG_CC
AC_ISC_POSIX
AC_PROG_LN_S
AC_PROG_YACC
AM_C_PROTOTYPES
AM_PROG_LIBTOOL

dnl Checks for libraries.

dnl Checks for header files.
AC_HEADER_DIRENT
AC_HEADER_STDC
AC_HEADER_SYS_WAIT

AC_CHECK_HEADERS(errno.h fcntl.h limits.h unistd.h sys/time.h utmp.h utmpx.h \
	termios.h termio.h sgtty.h sys/ioctl.h syslog.h paths.h \
	utime.h ulimit.h sys/resource.h gshadow.h shadow.h lastlog.h \
	rpc/key_prot.h)

AC_CHECK_FUNCS(a64l fchmod fchown fsync getgroups gethostname getspnam \
	gettimeofday getusershell getutent initgroups lchown lckpwdf lstat \
	memcpy memset mkstemp setgroups sigaction strchr updwtmp updwtmpx)

dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_TYPE_UID_T
AC_TYPE_OFF_T
AC_TYPE_PID_T
AC_TYPE_MODE_T
AC_STRUCT_ST_RDEV
AC_HEADER_STAT
AC_HEADER_TIME
AC_STRUCT_TM

AC_CACHE_CHECK(for pw_age in struct passwd,
ac_cv_struct_passwd_pw_age, AC_TRY_COMPILE([#include <pwd.h>],
[ struct passwd pw;  pw.pw_age = ""; ],
ac_cv_struct_passwd_pw_age=yes, ac_cv_struct_passwd_pw_age=no))

if test "$ac_cv_struct_passwd_pw_age" = "yes"; then
	AC_DEFINE(ATT_AGE)
fi

AC_CACHE_CHECK(for pw_comment in struct passwd,
ac_cv_struct_passwd_pw_comment, AC_TRY_COMPILE([#include <pwd.h>],
[ struct passwd pw;  pw.pw_comment = ""; ],
ac_cv_struct_passwd_pw_comment=yes, ac_cv_struct_passwd_pw_comment=no))

if test "$ac_cv_struct_passwd_pw_comment" = "yes"; then
	AC_DEFINE(ATT_COMMENT)
fi

AC_CACHE_CHECK(for pw_quota in struct passwd,
ac_cv_struct_passwd_pw_quota, AC_TRY_COMPILE([#include <pwd.h>],
[ struct passwd pw;  pw.pw_quota = 0; ],
ac_cv_struct_passwd_pw_quota=yes, ac_cv_struct_passwd_pw_quota=no))

if test "$ac_cv_struct_passwd_pw_quota" = "yes"; then
	AC_DEFINE(BSD_QUOTA)
fi

if test "$ac_cv_header_utmp_h" = "yes"; then
	AC_CACHE_CHECK(for ut_host in struct utmp,
	ac_cv_struct_utmp_ut_host, AC_TRY_COMPILE([#include <utmp.h>],
	[ struct utmp ut;  char *cp = ut.ut_host; ],
	ac_cv_struct_utmp_ut_host=yes, ac_cv_struct_utmp_ut_host=no))

	if test "$ac_cv_struct_utmp_ut_host" = "yes"; then
		AC_DEFINE(UT_HOST)
	fi

	AC_CACHE_CHECK(for ut_user in struct utmp,
	ac_cv_struct_utmp_ut_user, AC_TRY_COMPILE([#include <utmp.h>],
	[ struct utmp ut;  char *cp = ut.ut_user; ],
	ac_cv_struct_utmp_ut_user=yes, ac_cv_struct_utmp_ut_user=no))

	if test "$ac_cv_struct_utmp_ut_user" = "no"; then
		AC_DEFINE(ut_user, ut_name)
	fi
fi

if test "$ac_cv_header_lastlog_h" = "yes"; then
	AC_CACHE_CHECK(for ll_host in struct lastlog,
	ac_cv_struct_lastlog_ll_host, AC_TRY_COMPILE([#include <lastlog.h>],
	[ struct lastlog ll;  char *cp = ll.ll_host; ],
	ac_cv_struct_lastlog_ll_host=yes, ac_cv_struct_lastlog_ll_host=no))

	if test "$ac_cv_struct_lastlog_ll_host" = "yes"; then
		AC_DEFINE(HAVE_LL_HOST)
	fi
fi

dnl Checks for library functions.
AC_TYPE_GETGROUPS
AC_PROG_GCC_TRADITIONAL
AC_TYPE_SIGNAL
AC_FUNC_UTIME_NULL
AC_FUNC_STRFTIME
AC_REPLACE_FUNCS(mkdir putgrent putpwent putspent rename rmdir)
AC_REPLACE_FUNCS(sgetgrent sgetpwent sgetspent)
AC_REPLACE_FUNCS(snprintf strcasecmp strdup strerror strstr)

AC_CHECK_FUNC(setpgrp)
AC_FUNC_SETPGRP

if test "$ac_cv_header_shadow_h" = "yes"; then
AC_CACHE_CHECK(for working shadow group support,
ac_cv_libc_shadowgrp, AC_TRY_RUN(
[
#include <shadow.h>
main()
{
	struct sgrp *sg = sgetsgent("test:x::");
	/* NYS libc on Red Hat 3.0.3 has broken shadow group support */
	return !sg || !sg->sg_adm || !sg->sg_mem;
}
],
ac_cv_libc_shadowgrp=yes,ac_cv_libc_shadowgrp=no,ac_cv_libc_shadowgrp=no))

if test "$ac_cv_libc_shadowgrp" = "yes"; then
	AC_DEFINE(HAVE_SHADOWGRP)
fi
fi

AC_MSG_CHECKING(location of shared mail directory)
for maildir in /var/mail /var/spool/mail /usr/spool/mail /usr/mail NONE; do
	if test "$maildir" = "NONE"; then
		AC_MSG_RESULT(None)
	elif test -d $maildir; then
		AC_DEFINE_UNQUOTED(MAIL_SPOOL_DIR, "$maildir")
		AC_MSG_RESULT($maildir)
		break
	fi
done

AC_MSG_CHECKING(location of user mail file)
for mailfile in Mailbox mailbox Mail mail .mail NONE; do
	if test "$mailfile" = "NONE"; then
		AC_MSG_RESULT(None)
	elif test -f $HOME/$mailfile; then
		AC_DEFINE_UNQUOTED(MAIL_SPOOL_FILE, "$mailfile")
		AC_MSG_RESULT($mailfile)
		break
	fi
done

AC_MSG_CHECKING(location of utmp)
for utmpdir in /var/run /var/adm /usr/adm /etc NONE; do
	if test "$utmpdir" = "NONE"; then
		AC_MSG_WARN(utmp file not found)
	elif test -f $utmpdir/utmp; then
		AC_DEFINE_UNQUOTED(_UTMP_FILE, "$utmpdir/utmp")
		AC_MSG_RESULT($utmpdir)
		break
	fi
done

AC_MSG_CHECKING(location of faillog/lastlog/wtmp)
for logdir in /var/log /var/adm /usr/adm /etc; do
	if test -d $logdir; then
		AC_DEFINE_UNQUOTED(_WTMP_FILE, "$logdir/wtmp")
		AC_DEFINE_UNQUOTED(LASTLOG_FILE, "$logdir/lastlog")
		AC_DEFINE_UNQUOTED(FAILLOG_FILE, "$logdir/faillog")
		AC_MSG_RESULT($logdir)
		break
	fi
done

AC_MSG_CHECKING(location of the passwd program)
if test -f /usr/bin/passwd; then
	passwd_dir=/usr/bin
else
	passwd_dir=/bin
fi
AC_DEFINE_UNQUOTED(PASSWD_PROGRAM, "$passwd_dir/passwd")
AC_MSG_RESULT($passwd_dir)

dnl XXX - quick hack, should disappear before anyone notices :).
AC_DEFINE(SHADOWPWD)
AC_DEFINE(USG)
AC_DEFINE(USE_SYSLOG)
AC_DEFINE(RLOGIN)
AC_DEFINE(RUSEROK, 0)

dnl Use our own version of getpass(), which handles long passwords
dnl (unlike many systems which have a limit of 8 characters), and can
dnl be interrupted with Ctrl-C (unlike Linux libc).
AC_DEFINE(getpass, libshadow_getpass)

AC_ARG_ENABLE(desrpc, [  --enable-desrpc         try to use secure RPC in login (default if found)])
AC_ARG_ENABLE(shadowgrp, [  --enable-shadowgrp      enable shadow group support [default=yes]])

AC_ARG_WITH(libcrack, [  --with-libcrack         try to use libcrack (default if found)])
AC_ARG_WITH(libcrypt, [  --with-libcrypt         try to use libcrypt (default if found)])
AC_ARG_WITH(libopie,  [  --with-libopie          use libopie for OPIE support])
AC_ARG_WITH(libpam,   [  --with-libpam           use libpam for PAM support])
AC_ARG_WITH(libskey,  [  --with-libskey          use libskey for S/Key support])
AC_ARG_WITH(libtcfs,  [  --with-libtcfs          use libtcfs for TCFS support])

dnl Check for some functions in libc first, only if not found check for
dnl other libraries.  This should prevent linking libnsl if not really
dnl needed (Linux glibc, Irix), but still link it if needed (Solaris).

AC_CHECK_FUNC(inet_ntoa, [], AC_CHECK_LIB(inet, inet_ntoa))
AC_CHECK_FUNC(socket, [], AC_CHECK_LIB(socket, socket))
AC_CHECK_FUNC(gethostbyname, [], AC_CHECK_LIB(nsl, gethostbyname))

dnl XXX - getsecretkey() causes login to hang for 5 minutes on at least
dnl one RH 4.0 system.  Use --disable-desrpc if you have this problem.
dnl Reported by Mohan Khurana <mohan@stealth.net>.

if test "$enable_desrpc" != "no" -a "$ac_cv_header_rpc_key_prot_h" = "yes" ; then
	AC_CHECK_FUNC(getsecretkey, AC_DEFINE(DES_RPC),
		AC_CHECK_LIB(rpcsvc, getsecretkey, AC_DEFINE(DES_RPC)))
fi

if test "$enable_shadowgrp" != "no"; then
	AC_DEFINE(SHADOWGRP)
fi

AC_SUBST(LIBCRYPT)
if test "$with_libcrypt" != "no"; then
	AC_CHECK_LIB(crypt, crypt, [AC_DEFINE(HAVE_LIBCRYPT) LIBCRYPT=-lcrypt])
fi

AC_SUBST(LIBCRACK)
if test "$with_libcrack" != "no"; then
	echo "checking cracklib flavour, don't be surprised by the results"
	AC_CHECK_LIB(crack, FascistCheck, AC_DEFINE(HAVE_LIBCRACK) LIBCRACK=-lcrack)
	AC_CHECK_LIB(crack, FascistHistory, AC_DEFINE(HAVE_LIBCRACK_HIST))
	AC_CHECK_LIB(crack, FascistHistoryPw, AC_DEFINE(HAVE_LIBCRACK_PW))
fi

AC_SUBST(LIBSKEY)
AC_SUBST(LIBMD)
if test "$with_libskey" = "yes"; then
	AC_CHECK_LIB(md, MD5Init, LIBMD=-lmd)
	AC_CHECK_LIB(skey, skeychallenge, AC_DEFINE(SKEY) LIBSKEY=-lskey, , $LIBMD $LIBCRYPT)
elif test "$with_libopie" = "yes"; then
	AC_CHECK_LIB(opie, opiechallenge, AC_DEFINE(OPIE) LIBSKEY=-lopie, , $LIBCRYPT)
fi

AC_SUBST(LIBTCFS)
if test "$with_libtcfs" = "yes"; then
	AC_CHECK_LIB(tcfs, tcfs_encrypt_key, AC_DEFINE(HAVE_TCFS) AC_DEFINE(TCFS_GDBM_SUPPORT) LIBTCFS="-ltcfs -lgdbm", , -lgdbm)
fi

AC_SUBST(LIBPAM)
if test "$with_libpam" = "yes"; then
	AC_CHECK_LIB(pam, pam_start,
		[AC_DEFINE(USE_PAM)
		LIBPAM="-lpam"
		AC_CHECK_LIB(pam_misc, misc_conv,
			[LIBPAM="$LIBPAM -lpam_misc"],
			AC_MSG_ERROR(libpam_misc is missing),
			-lpam
		)]
		[AC_MSG_CHECKING(use login access checking if PAM not used)
		AC_DEFINE(LOGIN_ACCESS)
		AC_MSG_RESULT(yes)]
	)
	AC_MSG_CHECKING(use login and su access checking if PAM not used)
	AC_MSG_RESULT(no)
else
	AC_MSG_CHECKING(use login and su access checking if PAM not used)
	AC_DEFINE(LOGIN_ACCESS)
	AC_DEFINE(SU_ACCESS)
	AC_MSG_RESULT(yes)
fi

ALL_LINGUAS="cs de el fr ja ko pl sv uk"
AM_GNU_GETTEXT

AC_OUTPUT([
	Makefile
	intl/Makefile
	po/Makefile.in
	doc/Makefile
	man/Makefile
	man/cs/Makefile
	man/de/Makefile
	man/fr/Makefile
	man/hu/Makefile
	man/id/Makefile
	man/it/Makefile
	man/ja/Makefile
	man/ko/Makefile
	man/pl/Makefile
	man/pt_BR/Makefile
	libmisc/Makefile
	lib/Makefile
	src/Makefile
	contrib/Makefile
	etc/Makefile
	etc/pam.d/Makefile
	shadow.spec])
