AC_PREREQ(2.50)

dnl Autoconf. ick.
dnl Here's how to rebuild the "configure" script from this source file:
dnl
dnl   cd spamc; autoconf; autoheader

AC_INIT

AC_ARG_ENABLE(ssl,
	AC_HELP_STRING([--enable-ssl],
		[build spamc with ssl support ('yes'/'no', default is 'no')]),
	[sa_ssl_enabled=${enableval:-no}],
	[sa_ssl_enabled=${enableval:-no}])
AC_CONFIG_SRCDIR([Makefile.PL])
AC_CONFIG_HEADER(config.h)

dnl ensure Makefile.PL has been run too
if test -f Makefile.PL -a ! -f Makefile ; then
  perl Makefile.PL || exit 1
fi

AC_PROG_CC

# off: breaks gcc 3.3.x!  doh
# if test "x$GCC" = "xyes" ; then
# CFLAGS="-Wall -Wextra -Wdeclaration-after-statement $CFLAGS"
# fi

AC_EXEEXT

dnl ----------------------------------------------------------------------

AC_HEADER_STDC
AC_CHECK_HEADERS(sys/time.h syslog.h unistd.h errno.h sys/errno.h)
AC_CHECK_HEADERS(time.h sysexits.h sys/socket.h netdb.h netinet/in.h)
AC_CHECK_HEADERS(pwd.h signal.h openssl/crypto.h zlib.h)
dnl AC_CHECK_HEADERS(getopt.h)

AC_C_CONST
AC_TYPE_OFF_T
AC_TYPE_PID_T
AC_TYPE_UID_T
AC_TYPE_SIZE_T

dnl ----------------------------------------------------------------------

AC_CACHE_CHECK([for SHUT_RD],
       shutrd, [
                AC_TRY_COMPILE([#include <sys/types.h>
#include <sys/socket.h>],
                        [printf ("%d", SHUT_RD); return 0;],
                                        [shutrd=yes],
                                        [shutrd=no]),
       ])
if test $shutrd = yes ; then
  AC_DEFINE(HAVE_SHUT_RD)
fi

dnl ----------------------------------------------------------------------

AC_CHECK_LIB(socket, socket)

SSLLIBS=""
SSLCFLAGS=""
if test yes = "$sa_ssl_enabled"; then
	AC_CHECK_LIB(crypto, CRYPTO_malloc,[SSLLIBS="-lcrypto $SSLLIBS"])
	AC_CHECK_LIB(ssl, SSL_CTX_free,[SSLLIBS="-lssl $SSLLIBS"],,-lcrypto)

	# before defining SPAMC_SSL check that all its requirements are
	# actually available
	if test yes = "$ac_cv_header_openssl_crypto_h" && \
	   test yes = "$ac_cv_lib_crypto_CRYPTO_malloc" && \
	   test yes = "$ac_cv_lib_ssl_SSL_CTX_free"; then
		SSLCFLAGS="-DSPAMC_SSL"
	else
		AC_MSG_ERROR([Cannot use SSL; libraries or header files are missing.
You may try using 'configure --disable-ssl'.])
	fi
fi
AC_CHECK_LIB(inet, connect)
AC_CHECK_LIB(nsl, t_accept)
AC_CHECK_LIB(z, deflate)
AC_CHECK_LIB(dl, dlopen)

AC_CHECK_FUNCS(socket strdup strtod strtol snprintf shutdown)

dnl ----------------------------------------------------------------------

AC_CACHE_CHECK([for h_errno],
        herrno, [
                AC_TRY_COMPILE([#include <netdb.h>],
                        [printf ("%d", h_errno); return 0;],
                                        [herrno=yes],
                                        [herrno=no]),
        ])
if test $herrno = yes ; then
  AC_DEFINE(HAVE_H_ERRNO)
fi

dnl ----------------------------------------------------------------------

dnl AC_CACHE_CHECK([for optarg],
dnl         haveoptarg, [
dnl                 AC_TRY_COMPILE([#include <getopt.h>],
dnl                         [if (optarg == (char *) 0L) { return 0; } return 1;],
dnl                                         [haveoptarg=yes],
dnl                                         [haveoptarg=no]),
dnl         ])
dnl if test $haveoptarg = yes ; then
dnl   AC_DEFINE(HAVE_OPTARG)
dnl fi

dnl ----------------------------------------------------------------------

AC_CACHE_CHECK([for in_addr_t],
        inaddrt, [
                AC_TRY_COMPILE([#include <sys/types.h>
#include <netinet/in.h>],
                        [in_addr_t foo; return 0;],
                                        [inaddrt=yes],
                                        [inaddrt=no]),
        ])
if test $inaddrt = no ; then
  AC_CHECK_TYPE(in_addr_t, unsigned long)
fi

dnl ----------------------------------------------------------------------

AC_CACHE_CHECK([for INADDR_NONE],
        haveinaddrnone, [
                AC_TRY_COMPILE([#include <sys/types.h>
#include <netinet/in.h>],
                        [in_addr_t foo = INADDR_NONE; return 0;],
                                        [haveinaddrnone=yes],
                                        [haveinaddrnone=no]),
        ])
if test $haveinaddrnone = yes ; then
  AC_DEFINE(HAVE_INADDR_NONE)
fi

dnl ----------------------------------------------------------------------

AC_CACHE_CHECK([for EX__MAX],
        haveexmax, [
                AC_TRY_COMPILE([#ifdef HAVE_SYSEXITS_H
#include <sysexits.h>
#endif
#include <errno.h>],
                        [int foo = EX__MAX; return 0;],
                                        [haveexmax=yes],
                                        [haveexmax=no]),
        ])
if test $haveexmax = yes ; then
  AC_DEFINE(HAVE_EX__MAX)
fi

dnl ----------------------------------------------------------------------

AC_CACHE_CHECK([for EAI_ADDRFAMILY],
        haveitem, [
                AC_TRY_COMPILE([#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>],
                        [int foo = EAI_ADDRFAMILY; return 0;],
                                        [haveitem=yes],
                                        [haveitem=no]),
        ])
if test $haveitem = yes ; then
  AC_DEFINE(HAVE_EAI_ADDRFAMILY, 1, [Define if EAI_ADDRFAMILY is valid.])
fi

AC_CACHE_CHECK([for EAI_SYSTEM],
        haveitem, [
                AC_TRY_COMPILE([#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>],
                        [int foo = EAI_SYSTEM; return 0;],
                                        [haveitem=yes],
                                        [haveitem=no]),
        ])
if test $haveitem = yes ; then
  AC_DEFINE(HAVE_EAI_SYSTEM, 1, [Define if EAI_SYSTEM is valid.])
fi

AC_CACHE_CHECK([for EAI_NODATA],
        haveitem, [
                AC_TRY_COMPILE([#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>],
                        [int foo = EAI_NODATA; return 0;],
                                        [haveitem=yes],
                                        [haveitem=no]),
        ])
if test $haveitem = yes ; then
  AC_DEFINE(HAVE_EAI_NODATA, 1, [Define if EAI_NODATA is valid.])
fi

dnl ----------------------------------------------------------------------

# we cheat, since we *know* we have Perl installed ;)
CCCDLFLAGS=`perl -e 'use Config; print $Config::Config{cccdlflags}'`
LDDLFLAGS=`perl -e 'use Config; print $Config::Config{lddlflags}'`
AC_SUBST([SSLLIBS])
AC_SUBST([SSLCFLAGS])
AC_SUBST(CCCDLFLAGS)
AC_SUBST(LDDLFLAGS)
AC_SUBST(HAVE_SHUT_RD)

AC_CONFIG_FILES([Makefile])
AC_CONFIG_FILES([spamc.h])
AC_OUTPUT
