1dnl Process this file with autoconf to produce a configure script.
2dnl
3dnl Copyright 1998 - 2008 Double Precision, Inc.  See COPYING for
4dnl distribution information.
5
6AC_INIT(couriertcpd, 0.11, [courier-users@lists.sourceforge.net])
7
8>confdefs.h  # Kill PACKAGE_ macros
9
10AC_CONFIG_SRCDIR(tcpd.c)
11AC_CONFIG_AUX_DIR(../..)
12AM_INIT_AUTOMAKE([foreign no-define])
13LPATH="$PATH:/usr/local/bin"
14AC_CONFIG_HEADERS(config.h)
15
16dnl Checks for programs.
17AC_PROG_CC
18AC_PROG_CC_C99
19AC_PROG_INSTALL
20AC_PROG_LN_S
21AC_LIBTOOL_DLOPEN
22AM_PROG_LIBTOOL
23
24SPATH="$LPATH:/usr/kerberos/bin"
25
26AC_PATH_PROG(SED, sed, sed, $SPATH)
27if test "$SED" = "sed"
28then
29	AC_MSG_ERROR(sed not found.)
30fi
31AC_SUBST(SED)
32
33AC_PATH_PROG(SETENV, env, env, $SPATH)
34if test "$SETENV" = "env"
35then
36	AC_MSG_ERROR(env not found.)
37fi
38AC_SUBST(SETENV)
39
40AC_PATH_PROG(PKGCONFIG, pkg-config, [], $SPATH)
41
42if test x$GCC = xyes
43then
44	CFLAGS="-Wall $CFLAGS"
45fi
46if test x$GXX = xyes
47then
48	CXXFLAGS="-Wall $CXXFLAGS"
49fi
50
51CFLAGS="-I$srcdir/.. -I.. -I$srcdir/../.. -I../.. $CFLAGS"
52CXXFLAGS="-I$srcdir/.. -I.. -I$srcdir/../.. -I../.. $CXXFLAGS"
53
54AC_PATH_PROG(KRB5CONFIG, krb5-config, krb5-config, $SPATH)
55
56#
57#
58# We may need libdl for later, not just shared check.
59#
60
61saveLIBS="$LIBS"
62AC_CHECK_LIB(dl, dlopen, [ LIBDL="-ldl" ])
63LIBS="$saveLIBS"
64
65PKG_CHECK_MODULES(LIBIDN, libidn >= 0.0.0, [libidn=yes], [libidn=no])
66if test "$libidn" != "yes"
67then
68	AC_MSG_ERROR([libidn not found])
69fi
70
71dnl Determine whether transport libraries are created static or shared
72
73AC_SUBST(LIBDL)
74
75. ../../dbobj.config
76if test "$dblibrary" != ""
77then
78	dblibrary="../../$dblibrary"
79fi
80AC_SUBST(dblibrary)
81
82COURIERTCPD=""
83if test "$dblibrary" != ""
84then
85	COURIERTCPD=couriertcpd$EXEEXT
86fi
87
88AC_SUBST(COURIERTCPD)
89
90LIBS="$saveLIBS"
91
92USENSL=no
93saveLIBS="$LIBS"
94AC_CHECK_LIB(socket,socket,result=yes,result=no)
95if test $result = yes; then
96        NETLIBS="-lsocket"
97else
98        AC_CHECK_LIB(socket,socket,result=yes,result=no,-lnsl)
99        if test $result = yes; then
100                NETLIBS = "-lsocket -lnsl"
101                USENSL=yes
102        else
103                AC_CHECK_LIB(socket,connect,result=yes,result=no)
104                if test $result = yes; then
105                        NETLIBS="-lsocket"
106                else
107                        AC_CHECK_LIB(socket,connect,result=yes,result=no,-lnsl)
108                        if test $result = yes; then
109                                NETLIBS="-lsocket -lnsl"
110                                USENSL=yes
111                        fi
112                fi
113        fi
114fi
115
116if test $USENSL != yes; then
117	LIBS="$LIBS $NETLIBS"
118	AC_TRY_LINK_FUNC(inet_addr, [ : ],
119	[
120	        AC_CHECK_LIB(nsl,inet_addr,result=yes,result=no)
121	        if test $result = yes; then
122	                NETLIBS="$NETLIBS -lnsl"
123	        fi
124	])
125fi
126
127AC_SUBST(NETLIBS)
128
129dnl Checks for header files.
130AC_HEADER_STDC
131AC_HEADER_DIRENT
132AC_CHECK_HEADERS(sys/types.h sys/time.h sys/stat.h sys/wait.h sys/select.h unistd.h fcntl.h sys/ioctl.h)
133AC_HEADER_TIME
134
135dnl Checks for typedefs, structures, and compiler characteristics.
136
137AC_PID_T
138AC_TYPE_UID_T
139AC_TYPE_SIGNAL
140AC_SYS_LARGEFILE
141
142AC_CACHE_CHECK([for socklen_t],
143	tcpd_cv_hassocklen_t,
144
145AC_COMPILE_IFELSE([
146AC_LANG_SOURCE( [
147#include <sys/types.h>
148#include <sys/socket.h>
149
150socklen_t sl_t;
151],[
152	accept(0, 0, &sl_t);
153])],
154	tcpd_cv_hassocklen_t=yes,
155	tcpd_cv_hassocklen_t=no)
156)
157
158socklen_t="int"
159
160if test $tcpd_cv_hassocklen_t = yes
161then
162	:
163else
164	AC_DEFINE_UNQUOTED(socklen_t, int, [ Default definition for socklen_t ])
165fi
166
167dnl Checks for library functions.
168
169PKG_CHECK_MODULES(LIBIDN, libidn >= 0.0.0, [libidn=yes], [libidn=no])
170
171if test "$libidn" != "yes"
172then
173	AC_MSG_ERROR([libidn not found])
174fi
175
176AC_CHECK_FUNCS(setpgrp setpgid)
177AC_CHECK_FUNC(setpgrp,
178	[
179	AC_FUNC_SETPGRP
180	]
181)
182
183AC_ARG_WITH(tcpddns, [  --without-tcpddns       Use resolver instead of DNS lookups in couriertcpd ], tcpddns="$withval", tcpddns="Y")
184
185case "$tcpddns" in
186n*|N*|0*)
187	;;
188*)
189	AC_DEFINE_UNQUOTED(TCPDUSERFC1035,1,
190	[ Whether to use librfc1035.a to resolve via DNS ])
191	;;
192esac
193
194saveLIBS="$LIBS"
195LIBS="$LIBS $NETLIBS"
196AC_CHECK_FUNC(socketpair, have_socketpair=yes, have_socketpair=no)
197
198AC_ARG_WITH(spipe,
199[  --with-spipe=socketpair Create stream pipes as BSD socketpairs
200  --with-spipe=streams    Create stream pipes as SVR3 streams
201  --with-spipe=pipe       Create stream pipes as SVR4 streams],
202spipe="$withval", spipe="")
203
204AC_CACHE_CHECK([for SVR3 stream pipes],tcpd_cv_svr3,
205AC_TRY_COMPILE( [
206#include <sys/types.h>
207#include <sys/stream.h>
208#include <stropts.h>
209#include <fcntl.h>
210],[ {
211        struct strfdinsert      ins;
212        queue_t                 *pointer;
213	int i=I_FDINSERT;
214}
215], tcpd_cv_svr3=yes, tcpd_cv_svr3=no))
216
217AC_CACHE_CHECK( [for SVR4 stream pipes],tcpd_cv_svr4,
218
219AC_TRY_RUN(
220[
221
222changequote(<<,>>)
223
224#include	<stdio.h>
225#include	<unistd.h>
226
227int main(int argc, char **argv)
228{
229int	pipefd[2];
230char	c;
231
232	c=0;
233	if (pipe(pipefd) == 0 && write(pipefd[0], &c, 1) == 1 &&
234		read(pipefd[1], &c, 1) == 1 &&
235		write(pipefd[1], &c, 1) == 1 &&
236		read(pipefd[0], &c, 1) == 1)
237	{
238		exit (0);
239	}
240	exit (1);
241	return (1);
242}
243changequote([,])
244]
245,
246tcpd_cv_svr4=yes,
247tcpd_cv_svr4=no,
248tcpd_cv_svr4="n/a")
249
250)
251
252LIBS="$saveLIBS"
253
254if test "$spipe" = ""
255then
256	if test "$have_socketpair" = "yes"
257	then
258		spipe="socketpair"
259	fi
260fi
261
262if test "$spipe" = ""
263then
264	if test "$tcpd_cv_svr3" = "yes"
265	then
266		spipe="streams"
267	fi
268fi
269
270if test "$spipe" = ""
271then
272	if test "$tcpd_cv_svr4" = "yes"
273	then
274		spipe="pipe"
275	fi
276fi
277
278case "$spipe" in
279socketpair)
280		AC_DEFINE_UNQUOTED(HAVE_SPIPE_SOCKETPAIR, 1,
281		[ Whether to use socketpair() to create a bidirectional pipe ])
282		;;
283streams)
284		AC_DEFINE_UNQUOTED(HAVE_SPIPE_SVR3, 1,
285		[ Whether to use streams to create a vidirectional pipe ])
286		;;
287pipe)
288		AC_DEFINE_UNQUOTED(HAVE_SPIPE_SVR4, 1,
289		[ Whether pipe() is SvR4-style that's a bidirectional pipe ])
290		;;
291*)
292	AC_MSG_ERROR(Cannot determine stream pipe support.  If cross-compiling use --with-spipe=pipe to get SVR4 stream pipes.)
293		;;
294esac
295
296
297AC_MSG_CHECKING([for stream pipes])
298AC_MSG_RESULT($spipe)
299
300AC_CHECK_HEADER(openssl/ssl.h,have_ssl_h=yes,have_ssl_h=no)
301AC_CHECK_LIB(ssl, SSL_load_error_strings, have_ssl=yes, have_ssl=no,
302	-lcrypto)
303AC_CHECK_LIB(ssl, SSL_library_init, have_ssl=yes)
304AC_CHECK_LIB(ssl, OPENSSL_init_ssl, have_ssl=yes)
305
306if test "$have_ssl" = "yes"
307then
308	if test "$have_ssl_h" = "no"
309	then
310		AC_MSG_WARN(OpenSSL runtime libraries installed but the header files are missing)
311		AC_MSG_WARN(disabling OpenSSL support.)
312		have_ssl="no"
313	fi
314fi
315
316KRBFLAGS=""
317if test "$have_ssl" = "yes"
318then
319	LIBCOURIERTLSOPENSSL=libcouriertlsopenssl.la
320
321	if test "$KRB5CONFIG" != "krb5-config"
322	then
323		AC_MSG_CHECKING(whether OpenSSL requires Kerberos)
324		AC_TRY_COMPILE( [
325#include <openssl/ssl.h>
326], [ int x=1; ], :,
327		 [
328			KRBFLAGS=`$KRB5CONFIG --cflags`
329			CFLAGS="$CFLAGS $KRBFLAGS"
330
331
332			AC_TRY_COMPILE( [
333#include <openssl/ssl.h>
334], [ int x=1; ], [ KRBLIBS="`$KRB5CONFIG --libs`" ],
335   AC_MSG_ERROR(OpenSSL test build failed) )
336			]
337)
338
339		if test "$KRBLIBS" = ""
340		then
341			AC_MSG_RESULT(no)
342		else
343			AC_MSG_RESULT(yes)
344		fi
345	fi
346	openssldep="-lssl -lcrypto $KRBLIBS $NETLIBS ../random128/librandom128.la"
347fi
348
349# GnuTLS
350
351have_gnutls=no
352
353AC_MSG_CHECKING([for GnuTLS])
354
355if test "$PKGCONFIG" != ""
356then
357	if $PKGCONFIG --modversion gnutls >/dev/null 2>&1
358	then
359		save_CPPFLAGS="$CPPFLAGS"
360		CPPFLAGS="$CPPFLAGS `$PKGCONFIG --cflags gnutls`"
361
362		AC_TRY_COMPILE( [
363#include <gnutls/gnutls.h>
364],
365	[
366	],
367		[ have_gnutls=yes
368		],
369
370		[
371			have_gnutls="no: \#include <gnutls/gnutls.h> failed"
372		])
373
374		CPPFLAGS="$save_CPPFLAGS"
375	else
376		have_gnutls="no: pkgconfig --modversion gnutls failed"
377	fi
378else
379	have_gnutls="no: pkg-config not found"
380fi
381
382AC_MSG_RESULT($have_gnutls)
383
384if test "$have_gnutls" = "yes"
385then
386	LIBCOURIERTLSGNUTLS="libcouriertlsgnutls.la"
387	CPPFLAGS="$CPPFLAGS `$PKGCONFIG --cflags gnutls`"
388	have_gnutls3=no
389	PKG_CHECK_EXISTS([gnutls >= 3.0], [have_gnutls3=yes])
390	if test "x$have_gnutls3" = "xno"
391	then
392		gnutlsdep="`$PKGCONFIG --libs gnutls` -lgnutls-extra"
393	else
394		gnutlsdep="`$PKGCONFIG --libs gnutls`"
395		AC_DEFINE([HAVE_GNUTLS3], [1], [Use GnuTLS3])
396	fi
397fi
398
399AC_CHECK_SIZEOF(gnutls_transport_ptr_t,0, [
400AC_INCLUDES_DEFAULT
401#include <gnutls/gnutls.h>
402])
403
404AC_CHECK_SIZEOF(long,0)
405
406cast_to_ptr_t=""
407
408if test "$gnutls_transport_ptr_t_SIZEOF" = "$long_SIZEOF"
409then
410	if test "$gnutls_transport_ptr_t_SIZEOF" != 0
411	then
412		cast_to_ptr_t="(long)"
413	fi
414fi
415
416AC_DEFINE_UNQUOTED(GNUTLS_CAST_PTR_T, $cast_to_ptr_t,[How to cast a file descriptor to gnutls_transport_ptr_t])
417
418echo "cppflags='$KRBFLAGS'" >couriertls.config
419
420AC_SUBST(openssldep)
421AC_SUBST(gnutlsdep)
422
423soxdep="`cat ../soxwrap/soxlibs.dep`"
424AC_SUBST(soxdep)
425
426
427# Choose GnuTLS or OpenSSL
428
429AC_ARG_WITH(gnutls, [ --with-gnutls     Use GnuTLS even if OpenSSL is available],
430		    [
431
432if test "$withval" = "yes"
433then
434	if test "$have_gnutls" = "yes"
435	then
436		have_ssl="no"
437	else
438		AC_MSG_ERROR(Cannot find GnuTLS)
439	fi
440else
441	have_gnutls="no"
442fi
443],
444	[
445
446	if test "$have_ssl" = "yes"
447	then
448		have_gnutls="no"
449	fi
450])
451
452if test "$have_gnutls" = "yes"
453then
454	TLSLIBRARY="$LIBCOURIERTLSGNUTLS"
455	STARTTLS=couriertls$EXEEXT
456	BUILDLIBCOURIERTLS=libcouriertls.la
457
458	CRYPTLIBS=""
459
460	AC_MSG_CHECKING([for libgcrypt])
461
462	save_LIBS="$LIBS"
463	LIBS="$LIBS -lgcrypt"
464	AC_TRY_LINK( [
465#include <gcrypt.h>
466
467], [
468	gcry_cipher_open(NULL, 0, 0, 0);
469], [
470	AC_MSG_RESULT(yes)
471	AC_DEFINE_UNQUOTED(HAVE_GCRYPT, 1,
472				[ Whether libgcrypt is installed ])
473	CRYPTLIBS="$CRYPTLIBS -lgcrypt"
474], [
475AC_MSG_RESULT(no)
476have_gcrypt="no"
477])
478
479	if test "$have_gcrypt" = "no"
480	then
481		AC_MSG_ERROR(gcrypt header file is required for GNUTLS)
482	fi
483	AC_MSG_CHECKING([for libgpg-error])
484	LIBS="$LIBS -lgpg-error"
485	AC_TRY_LINK( [
486#include <gcrypt.h>
487
488], [
489	gpg_err_code_from_errno(0);
490], [
491	AC_MSG_RESULT(yes)
492	CRYPTLIBS="$CRYPTLIBS -lgpg-error"
493], [
494AC_MSG_RESULT(no)
495])
496
497	LIBS="$save_LIBS"
498
499	echo "ssllib=gnutls" >>couriertls.config
500else
501	if test "$have_ssl" = "yes"
502	then
503
504		save_LIBS="$LIBS"
505		LIBS="-lcrypto $KRBLIBS $LIBS"
506
507		AC_MSG_CHECKING(for OpenSSL 0.9.7)
508		AC_TRY_LINK( [
509#include <openssl/evp.h>
510#include <openssl/rand.h>
511],
512[
513EVP_CIPHER_CTX ctx;
514char dummy[1];
515unsigned char a[1], b[1];
516
517EVP_CIPHER_CTX_init(&ctx);
518EVP_EncryptInit_ex(&ctx, EVP_des_cbc(), NULL, a, b);
519RAND_pseudo_bytes(dummy, 1);
520
521], [
522   CRYPTLIBS="-lcrypto $KRBLIBS"
523   AC_MSG_RESULT(yes)
524   AC_DEFINE_UNQUOTED(HAVE_OPENSSL097, 1,
525				       [ Whether OpenSSL 0.9.7 is installed ])
526], [
527   AC_MSG_RESULT(no)
528
529
530
531		AC_MSG_CHECKING(for OpenSSL 1.1.0)
532		AC_TRY_LINK( [
533#include <openssl/evp.h>
534#include <openssl/rand.h>
535],
536[
537char dummy[1];
538unsigned char a[1], b[1];
539
540EVP_CIPHER_CTX *ctx=EVP_CIPHER_CTX_new();
541EVP_EncryptInit_ex(ctx, EVP_des_cbc(), NULL, a, b);
542RAND_bytes(dummy, 1);
543
544], [
545   CRYPTLIBS="-lcrypto $KRBLIBS"
546   AC_MSG_RESULT(yes)
547   AC_DEFINE_UNQUOTED(HAVE_OPENSSL110, 1,
548				       [ Whether OpenSSL 1.1.0 is installed ])
549], [
550   AC_MSG_RESULT(no)
551])
552
553]
554)
555		LIBS="-lssl $LIBS"
556		AC_CHECK_FUNCS(TLSv1_1_method TLSv1_2_method X509_VERIFY_PARAM_set1_host)
557		LIBS="$save_LIBS"
558
559		AC_TRY_COMPILE( [
560#include <openssl/ssl.h>
561],
562[
563SSL_get_servername((SSL *)0, TLSEXT_NAMETYPE_host_name);
564], [
565                AC_DEFINE_UNQUOTED(HAVE_OPENSSL_SNI,1,[ When OpenSSL supports SNI ])
566		])
567
568		TLSLIBRARY="$LIBCOURIERTLSOPENSSL"
569		STARTTLS=couriertls$EXEEXT
570		BUILDLIBCOURIERTLS=libcouriertls.la
571		echo "ssllib=openssl" >>couriertls.config
572	fi
573fi
574echo "couriertls=$STARTTLS" >>couriertls.config
575echo "cryptlibs=\"`echo $CRYPTLIBS`\"" >>couriertls.config
576
577# Do not built the other SSL library.  ... Except if I'm the maintainer
578
579if test ! -d "$srcdir/CVS"
580then
581	if test "$have_ssl" = "yes"
582	then
583		LIBCOURIERTLSGNUTLS=""
584		fi
585
586	if test "$have_gnutls" = "yes"
587	then
588		LIBCOURIERTLSOPENSSL=""
589	fi
590fi
591
592AC_SUBST(LIBCOURIERTLSOPENSSL)
593AC_SUBST(LIBCOURIERTLSGNUTLS)
594
595AC_SUBST(CRYPTLIBS)
596AC_SUBST(STARTTLS)
597AC_SUBST(BUILDLIBCOURIERTLS)
598AC_SUBST(TLSLIBRARY)
599
600AM_CONDITIONAL(HAVE_SGML, test -d ${srcdir}/../docbook)
601AC_OUTPUT(Makefile)
602