AC_DEFUN([IMAP_INC_CHK],[if test -r "$i$1/c-client.h"; then
    AC_DEFINE(HAVE_IMAP2000, 1, [ ])
    IMAP_DIR=$i
    IMAP_INC_DIR=$i$1
    break
  elif test -r "$i$1/rfc822.h"; then
    IMAP_DIR=$i;
    IMAP_INC_DIR=$i$1
    break
])

AC_DEFUN([IMAP_LIB_CHK],[
  str="$IMAP_DIR/$1/lib$lib.*"
  for i in `echo $str`; do
    test -r $i && IMAP_LIBDIR=$IMAP_DIR/$1 && break 2
  done
])

dnl PHP_IMAP_TEST_BUILD(function, action-if-ok, action-if-not-ok, extra-libs, extra-source)
AC_DEFUN([PHP_IMAP_TEST_BUILD], [
  PHP_TEST_BUILD([$1], [$2], [$3], [$4], [$5]
  [
#if defined(__GNUC__) && __GNUC__ >= 4
# define PHP_IMAP_EXPORT __attribute__ ((visibility("default")))
#else
# define PHP_IMAP_EXPORT
#endif

    PHP_IMAP_EXPORT void mm_log(void){}
    PHP_IMAP_EXPORT void mm_dlog(void){}
    PHP_IMAP_EXPORT void mm_flags(void){}
    PHP_IMAP_EXPORT void mm_fatal(void){}
    PHP_IMAP_EXPORT void mm_critical(void){}
    PHP_IMAP_EXPORT void mm_nocritical(void){}
    PHP_IMAP_EXPORT void mm_notify(void){}
    PHP_IMAP_EXPORT void mm_login(void){}
    PHP_IMAP_EXPORT void mm_diskerror(void){}
    PHP_IMAP_EXPORT void mm_status(void){}
    PHP_IMAP_EXPORT void mm_lsub(void){}
    PHP_IMAP_EXPORT void mm_list(void){}
    PHP_IMAP_EXPORT void mm_exists(void){}
    PHP_IMAP_EXPORT void mm_searched(void){}
    PHP_IMAP_EXPORT void mm_expunged(void){}
  ])
])

AC_DEFUN([PHP_IMAP_KRB_CHK], [
  if test "$PHP_KERBEROS" != "no"; then
    PKG_CHECK_MODULES([KERBEROS], [krb5-gssapi krb5])

    PHP_EVAL_INCLINE($KERBEROS_CFLAGS)
    PHP_EVAL_LIBLINE($KERBEROS_LIBS, IMAP_SHARED_LIBADD)

    AC_DEFINE(HAVE_IMAP_KRB, 1, [Whether IMAP extension has Kerberos support])
  else
    AC_EGREP_HEADER(auth_gss, $IMAP_INC_DIR/linkage.h, [
      AC_MSG_ERROR([This c-client library is built with Kerberos support.

      Add --with-kerberos to your configure line. Check config.log for details.
      ])
    ])
  fi
])

AC_DEFUN([PHP_IMAP_SSL_CHK], [
  if test "$PHP_IMAP_SSL" != "no"; then
    if test "$PHP_OPENSSL" = ""; then
      PHP_OPENSSL='no'
    fi
    PHP_SETUP_OPENSSL(IMAP_SHARED_LIBADD,
    [
      AC_DEFINE(HAVE_IMAP_SSL,1,[ ])
    ], [
      AC_MSG_ERROR([OpenSSL libraries not found.

      Check whether openssl is on your PKG_CONFIG_PATH and the output in config.log)
      ])
    ])
  elif test -f "$IMAP_INC_DIR/linkage.c"; then
    AC_EGREP_HEADER(ssl_onceonlyinit, $IMAP_INC_DIR/linkage.c, [
      AC_MSG_ERROR([This c-client library is built with SSL support.

      Add --with-imap-ssl to your configure line. Check config.log for details.
      ])
    ])
  fi
])

PHP_ARG_WITH([imap],
  [for IMAP support],
  [AS_HELP_STRING([[--with-imap[=DIR]]],
    [Include IMAP support. DIR is the c-client install prefix])])

PHP_ARG_WITH([kerberos],
  [for IMAP Kerberos support],
  [AS_HELP_STRING([--with-kerberos],
    [IMAP: Include Kerberos support])],
  [no],
  [no])

PHP_ARG_WITH([imap-ssl],
  [for IMAP SSL support],
  [AS_HELP_STRING([[--with-imap-ssl]],
    [IMAP: Include SSL support])],
  [no],
  [no])

if test "$PHP_IMAP" != "no"; then
    PHP_SUBST(IMAP_SHARED_LIBADD)
    PHP_NEW_EXTENSION(imap, php_imap.c, $ext_shared,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)
    AC_DEFINE(HAVE_IMAP,1,[ ])

    for i in $PHP_IMAP /usr/local /usr; do
      IMAP_INC_CHK()
      el[]IMAP_INC_CHK(/include/c-client)
      el[]IMAP_INC_CHK(/include/imap)
      el[]IMAP_INC_CHK(/include)
      el[]IMAP_INC_CHK(/imap)
      el[]IMAP_INC_CHK(/c-client)
      fi
    done

    dnl Check for c-client version 2004
    AC_EGREP_HEADER(mail_fetch_overview_sequence, $IMAP_INC_DIR/mail.h, [
      AC_DEFINE(HAVE_IMAP2004,1,[ ])
    ])

    dnl Check for new version of the utf8_mime2text() function
    old_CFLAGS=$CFLAGS
    CFLAGS="-I$IMAP_INC_DIR"
    AC_CACHE_CHECK(for utf8_mime2text signature, ac_cv_utf8_mime2text,
      AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <stdio.h>
#include <c-client.h>
      ]],[[
        SIZEDTEXT *src, *dst;
        utf8_mime2text(src, dst);
      ]])],[
        ac_cv_utf8_mime2text=old
      ],[
        ac_cv_utf8_mime2text=new
      ])
    )
    if test "$ac_cv_utf8_mime2text" = "new"; then
      AC_DEFINE(HAVE_NEW_MIME2TEXT, 1, [Whether utf8_mime2text() has new signature])
    fi
    CFLAGS=$old_CFLAGS

    old_CFLAGS=$CFLAGS
    CFLAGS="-I$IMAP_INC_DIR"
    AC_CACHE_CHECK(for U8T_DECOMPOSE, ac_cv_u8t_decompose,
      AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <c-client.h>
      ]],[[
         int i = U8T_CANONICAL;
      ]])],[
         ac_cv_u8t_decompose=yes
      ],[
         ac_cv_u8t_decompose=no
      ])
    )
    CFLAGS=$old_CFLAGS

    if test "$ac_cv_u8t_decompose" = "no" && test "$ac_cv_utf8_mime2text" = "new"; then
		AC_MSG_ERROR([utf8_mime2text() has new signature, but U8T_CANONICAL is missing. This should not happen. Check config.log for additional information.])
    fi
    if test "$ac_cv_u8t_decompose" = "yes" && test "$ac_cv_utf8_mime2text" = "old"; then
		AC_MSG_ERROR([utf8_mime2text() has old signature, but U8T_CANONICAL is present. This should not happen. Check config.log for additional information.])
    fi

    dnl Check for c-client version 2001
    old_CPPFLAGS=$CPPFLAGS
    CPPFLAGS=-I$IMAP_INC_DIR
    AC_EGREP_CPP(this_is_true, [
#include "imap4r1.h"
#if defined(IMAPSSLPORT)
      this_is_true
#endif
    ],[
      AC_DEFINE(HAVE_IMAP2001, 1, [ ])
    ],[])
    CPPFLAGS=$old_CPPFLAGS

    PHP_CHECK_LIBRARY(pam, pam_start,
    [
      PHP_ADD_LIBRARY(pam,, IMAP_SHARED_LIBADD)
      AC_DEFINE(HAVE_LIBPAM,1,[ ])
    ])

    PHP_CHECK_LIBRARY(crypt, crypt,
    [
      PHP_ADD_LIBRARY(crypt,, IMAP_SHARED_LIBADD)
      AC_DEFINE(HAVE_LIBCRYPT,1,[ ])
    ])

    PHP_EXPAND_PATH($IMAP_DIR, IMAP_DIR)

    if test -z "$IMAP_DIR"; then
      AC_MSG_ERROR(Cannot find rfc822.h. Please check your c-client installation.)
    fi

    if test ! -r "$IMAP_DIR/c-client/libc-client.a" && test -r "$IMAP_DIR/c-client/c-client.a" ; then
      ln -s "$IMAP_DIR/c-client/c-client.a" "$IMAP_DIR/c-client/libc-client.a" >/dev/null 2>&1
    elif test ! -r "$IMAP_DIR/$PHP_LIBDIR/libc-client.a" && test -r "$IMAP_DIR/$PHP_LIBDIR/c-client.a"; then
      ln -s "$IMAP_DIR/$PHP_LIBDIR/c-client.a" "$IMAP_DIR/$PHP_LIBDIR/libc-client.a" >/dev/null 2>&1
    fi

    for lib in c-client4 c-client imap; do
      IMAP_LIB=$lib
      IMAP_LIB_CHK($PHP_LIBDIR)
      IMAP_LIB_CHK(c-client)
    done

    if test -z "$IMAP_LIBDIR"; then
      AC_MSG_ERROR(Cannot find imap library (libc-client.a). Please check your c-client installation.)
    fi

    PHP_ADD_INCLUDE($IMAP_INC_DIR)
    PHP_ADD_LIBRARY_DEFER($IMAP_LIB,, IMAP_SHARED_LIBADD)
    PHP_ADD_LIBPATH($IMAP_LIBDIR, IMAP_SHARED_LIBADD)
    PHP_IMAP_KRB_CHK
    PHP_IMAP_SSL_CHK

    dnl Test the build in the end
    TST_LIBS="$DLIBS $IMAP_SHARED_LIBADD"

    dnl Check if auth_gss exists
    PHP_IMAP_TEST_BUILD(auth_gssapi_valid, [
      AC_DEFINE(HAVE_IMAP_AUTH_GSS, 1, [ ])
    ], [], $TST_LIBS)

    dnl Check if utf8_to_mutf7 exists. We need to do some gymnastics because
    dnl utf8_to_mutf7 takes an argument and will segfault without it. We
    dnl therefore test another function utf8_to_mutf7_php() which calls
    dnl the utf8_to_mutf7() function with the empty string as an argument.
    PHP_IMAP_TEST_BUILD(utf8_to_mutf7_php, [
      AC_DEFINE(HAVE_IMAP_MUTF7, 1, [ ])
    ], [], $TST_LIBS, [
      char utf8_to_mutf7_php(){ return utf8_to_mutf7(""); }
    ])

    AC_MSG_CHECKING(whether rfc822_output_address_list function present)
    PHP_TEST_BUILD(foobar, [
      AC_MSG_RESULT(yes)
      AC_DEFINE(HAVE_RFC822_OUTPUT_ADDRESS_LIST, 1, [ ])
    ], [
      AC_MSG_RESULT(no)
	], [
      $TST_LIBS
    ], [
#if defined(__GNUC__) && __GNUC__ >= 4
# define PHP_IMAP_EXPORT __attribute__ ((visibility("default")))
#else
# define PHP_IMAP_EXPORT
#endif

      PHP_IMAP_EXPORT void mm_log(void){}
      PHP_IMAP_EXPORT void mm_dlog(void){}
      PHP_IMAP_EXPORT void mm_flags(void){}
      PHP_IMAP_EXPORT void mm_fatal(void){}
      PHP_IMAP_EXPORT void mm_critical(void){}
      PHP_IMAP_EXPORT void mm_nocritical(void){}
      PHP_IMAP_EXPORT void mm_notify(void){}
      PHP_IMAP_EXPORT void mm_login(void){}
      PHP_IMAP_EXPORT void mm_diskerror(void){}
      PHP_IMAP_EXPORT void mm_status(void){}
      PHP_IMAP_EXPORT void mm_lsub(void){}
      PHP_IMAP_EXPORT void mm_list(void){}
      PHP_IMAP_EXPORT void mm_exists(void){}
      PHP_IMAP_EXPORT void mm_searched(void){}
      PHP_IMAP_EXPORT void mm_expunged(void){}
      void rfc822_output_address_list(void);
      void (*f)(void);
      char foobar () {f = rfc822_output_address_list;}
    ])

    AC_MSG_CHECKING(whether build with IMAP works)
    PHP_IMAP_TEST_BUILD(mail_newbody, [
      AC_MSG_RESULT(yes)
    ], [
      AC_MSG_RESULT(no)
      AC_MSG_ERROR([build test failed. Please check the config.log for details.])
    ], $TST_LIBS)
fi
