xref: /freebsd/contrib/unbound/acx_nlnetlabs.m4 (revision 4abd7edcbde21ba7a089c7d1a0bba8f87ebece06)
1# acx_nlnetlabs.m4 - common macros for configure checks
2# Copyright 2009, Wouter Wijngaards, NLnet Labs.
3# BSD licensed.
4#
5# Version 21
6# 2012-02-09 Fix AHX_MEMCMP_BROKEN with undef in compat/memcmp.h.
7# 2012-01-20 Fix COMPILER_FLAGS_UNBOUND for gcc 4.6.2 assigned-not-used-warns.
8# 2011-12-05 Fix getaddrinfowithincludes on windows with fedora16 mingw32-gcc.
9# 	     Fix ACX_MALLOC for redefined malloc error.
10# 	     Fix GETADDRINFO_WITH_INCLUDES to add -lws2_32
11# 2011-11-10 Fix FLTO test to not drop a.out in current directory.
12# 2011-11-01 Fix FLTO test for llvm on Lion.
13# 2011-08-01 Fix nonblock test (broken at v13).
14# 2011-08-01 Fix autoconf 2.68 warnings
15# 2011-06-23 Add ACX_CHECK_FLTO to check -flto.
16# 2010-08-16 Fix FLAG_OMITTED for AS_TR_CPP changes in autoconf-2.66.
17# 2010-07-02 Add check for ss_family (for minix).
18# 2010-04-26 Fix to use CPPFLAGS for CHECK_COMPILER_FLAGS.
19# 2010-03-01 Fix RPATH using CONFIG_COMMANDS to run at the very end.
20# 2010-02-18 WITH_SSL outputs the LIBSSL_LDFLAGS, LIBS, CPPFLAGS seperate, -ldl
21# 2010-02-01 added ACX_CHECK_MEMCMP_SIGNED, AHX_MEMCMP_BROKEN
22# 2010-01-20 added AHX_COONFIG_STRLCAT
23# 2009-07-14 U_CHAR detection improved for windows crosscompile.
24#            added ACX_FUNC_MALLOC
25#            fixup some #if to #ifdef
26#            NONBLOCKING test for mingw crosscompile.
27# 2009-07-13 added ACX_WITH_SSL_OPTIONAL
28# 2009-07-03 fixup LDFLAGS for empty ssl dir.
29#
30# Automates some of the checking constructs.  Aims at portability for POSIX.
31# Documentation for functions is below.
32#
33# the following macro's are provided in this file:
34# (see below for details on each macro).
35#
36# ACX_ESCAPE_BACKSLASH		- escape backslashes in var for C-preproc.
37# ACX_RSRC_VERSION		- create windows resource version number.
38# ACX_CHECK_COMPILER_FLAG	- see if cc supports a flag.
39# ACX_CHECK_ERROR_FLAGS		- see which flag is -werror (used below).
40# ACX_CHECK_COMPILER_FLAG_NEEDED - see if flags make the code compile cleanly.
41# ACX_DEPFLAG			- find cc dependency flags.
42# ACX_DETERMINE_EXT_FLAGS_UNBOUND - find out which flags enable BSD and POSIX.
43# ACX_CHECK_FORMAT_ATTRIBUTE	- find cc printf format syntax.
44# ACX_CHECK_UNUSED_ATTRIBUTE	- find cc variable unused syntax.
45# ACX_CHECK_FLTO		- see if cc supports -flto and use it if so.
46# ACX_LIBTOOL_C_ONLY		- create libtool for C only, improved.
47# ACX_TYPE_U_CHAR		- u_char type.
48# ACX_TYPE_RLIM_T		- rlim_t type.
49# ACX_TYPE_SOCKLEN_T		- socklen_t type.
50# ACX_TYPE_IN_ADDR_T		- in_addr_t type.
51# ACX_TYPE_IN_PORT_T		- in_port_t type.
52# ACX_ARG_RPATH			- add --disable-rpath option.
53# ACX_WITH_SSL			- add --with-ssl option, link -lcrypto.
54# ACX_WITH_SSL_OPTIONAL		- add --with-ssl option, link -lcrypto,
55#				  where --without-ssl is also accepted
56# ACX_LIB_SSL			- setup to link -lssl.
57# ACX_SYS_LARGEFILE		- improved sys_largefile, fseeko, >2G files.
58# ACX_CHECK_GETADDRINFO_WITH_INCLUDES - find getaddrinfo, portably.
59# ACX_FUNC_DEPRECATED		- see if func is deprecated.
60# ACX_CHECK_NONBLOCKING_BROKEN	- see if nonblocking sockets really work.
61# ACX_MKDIR_ONE_ARG		- determine mkdir(2) number of arguments.
62# ACX_FUNC_IOCTLSOCKET		- find ioctlsocket, portably.
63# ACX_FUNC_MALLOC		- check malloc, define replacement .
64# AHX_CONFIG_FORMAT_ATTRIBUTE	- config.h text for format.
65# AHX_CONFIG_UNUSED_ATTRIBUTE	- config.h text for unused.
66# AHX_CONFIG_FSEEKO		- define fseeko, ftello fallback.
67# AHX_CONFIG_RAND_MAX		- define RAND_MAX if needed.
68# AHX_CONFIG_MAXHOSTNAMELEN	- define MAXHOSTNAMELEN if needed.
69# AHX_CONFIG_IPV6_MIN_MTU	- define IPV6_MIN_MTU if needed.
70# AHX_CONFIG_SNPRINTF		- snprintf compat prototype
71# AHX_CONFIG_INET_PTON		- inet_pton compat prototype
72# AHX_CONFIG_INET_NTOP		- inet_ntop compat prototype
73# AHX_CONFIG_INET_ATON		- inet_aton compat prototype
74# AHX_CONFIG_MEMMOVE		- memmove compat prototype
75# AHX_CONFIG_STRLCAT		- strlcat compat prototype
76# AHX_CONFIG_STRLCPY		- strlcpy compat prototype
77# AHX_CONFIG_GMTIME_R		- gmtime_r compat prototype
78# AHX_CONFIG_W32_SLEEP		- w32 compat for sleep
79# AHX_CONFIG_W32_USLEEP		- w32 compat for usleep
80# AHX_CONFIG_W32_RANDOM		- w32 compat for random
81# AHX_CONFIG_W32_SRANDOM	- w32 compat for srandom
82# AHX_CONFIG_W32_FD_SET_T	- w32 detection of FD_SET_T.
83# ACX_CFLAGS_STRIP		- strip one flag from CFLAGS
84# ACX_STRIP_EXT_FLAGS		- strip extension flags from CFLAGS
85# AHX_CONFIG_FLAG_OMITTED	- define omitted flag
86# AHX_CONFIG_FLAG_EXT		- define omitted extension flag
87# AHX_CONFIG_EXT_FLAGS		- define the stripped extension flags
88# ACX_CHECK_MEMCMP_SIGNED	- check if memcmp uses signed characters.
89# AHX_MEMCMP_BROKEN		- replace memcmp func for CHECK_MEMCMP_SIGNED.
90# ACX_CHECK_SS_FAMILY           - check for sockaddr_storage.ss_family
91#
92
93dnl Escape backslashes as \\, for C:\ paths, for the C preprocessor defines.
94dnl for example, ACX_ESCAPE_BACKSLASH($from_var, to_var)
95dnl $1: the text to change.
96dnl $2: the result.
97AC_DEFUN([ACX_ESCAPE_BACKSLASH], [$2="`echo $1 | sed -e 's/\\\\/\\\\\\\\/g'`"
98])
99
100dnl Calculate comma separated windows-resource numbers from package version.
101dnl Picks the first three(,0) or four numbers out of the name.
102dnl $1: variable for the result
103AC_DEFUN([ACX_RSRC_VERSION],
104[$1=[`echo $PACKAGE_VERSION | sed -e 's/^[^0-9]*\([0-9]\)[^0-9]*\([0-9]\)[^0-9]*\([0-9]\)[^0-9]*\([0-9]\).*$/\1,\2,\3,\4/' -e 's/^[^0-9]*\([0-9]\)[^0-9]*\([0-9]\)[^0-9]*\([0-9]\)[^0-9]*$/\1,\2,\3,0/' `]
105])
106
107dnl Routine to help check for compiler flags.
108dnl Checks if the compiler will accept the flag.
109dnl $1: the flag without a - in front, so g to check -g.
110dnl $2: executed if yes
111dnl $3: executed if no
112AC_DEFUN([ACX_CHECK_COMPILER_FLAG],
113[
114AC_REQUIRE([AC_PROG_CC])
115AC_MSG_CHECKING(whether $CC supports -$1)
116cache=`echo $1 | sed 'y%.=/+-%___p_%'`
117AC_CACHE_VAL(cv_prog_cc_flag_$cache,
118[
119echo 'void f(){}' >conftest.c
120if test -z "`$CC $CPPFLAGS $CFLAGS -$1 -c conftest.c 2>&1`"; then
121eval "cv_prog_cc_flag_$cache=yes"
122else
123eval "cv_prog_cc_flag_$cache=no"
124fi
125rm -f conftest conftest.o conftest.c
126])
127if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then
128AC_MSG_RESULT(yes)
129:
130$2
131else
132AC_MSG_RESULT(no)
133:
134$3
135fi
136])
137
138dnl setup flags for ACX_CHECK_COMPILER_FLAG_NEEDED
139dnl ERRFLAG: result, compiler flag to turn warnings into errors
140AC_DEFUN([ACX_CHECK_ERROR_FLAGS],
141[
142ACX_CHECK_COMPILER_FLAG(Werror, [ERRFLAG="-Werror"], [ERRFLAG="-errwarn"])
143ACX_CHECK_COMPILER_FLAG(Wall, [ERRFLAG="$ERRFLAG -Wall"],
144                        	[ERRFLAG="$ERRFLAG -errfmt"])
145])
146
147dnl Routine to help check for needed compiler flags.
148dnl $1: flags for CC
149dnl $2: the includes and code
150dnl $3: if the given code only compiles with the flag, execute argument 3
151dnl $4: if the given code compiles without the flag, execute argument 4
152dnl $5: with and without flag the compile fails, execute argument 5.
153AC_DEFUN([ACX_CHECK_COMPILER_FLAG_NEEDED],
154[
155AC_REQUIRE([AC_PROG_CC])
156AC_REQUIRE([ACX_CHECK_ERROR_FLAGS])
157AC_MSG_CHECKING(whether we need $1 as a flag for $CC)
158cache=AS_TR_SH($1)
159dnl cache=`echo $1 | sed 'y%.=/+- %___p__%'`
160AC_CACHE_VAL(cv_prog_cc_flag_needed_$cache,
161[
162echo '$2' > conftest.c
163echo 'void f(){}' >>conftest.c
164if test -z "`$CC $CPPFLAGS $CFLAGS $ERRFLAG -c conftest.c 2>&1`"; then
165eval "cv_prog_cc_flag_needed_$cache=no"
166else
167[
168if test -z "`$CC $CPPFLAGS $CFLAGS $1 $ERRFLAG -c conftest.c 2>&1`"; then
169eval "cv_prog_cc_flag_needed_$cache=yes"
170else
171eval "cv_prog_cc_flag_needed_$cache=fail"
172#echo 'Test with flag fails too!'
173#cat conftest.c
174#echo "$CC $CPPFLAGS $CFLAGS $1 $ERRFLAG -c conftest.c 2>&1"
175#echo `$CC $CPPFLAGS $CFLAGS $1 $ERRFLAG -c conftest.c 2>&1`
176#exit 1
177fi
178]
179fi
180rm -f conftest conftest.c conftest.o
181])
182if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = yes"; then
183AC_MSG_RESULT(yes)
184:
185$3
186else
187if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = no"; then
188AC_MSG_RESULT(no)
189#echo 'Test with flag is no!'
190#cat conftest.c
191#echo "$CC $CPPFLAGS $CFLAGS $1 $ERRFLAG -c conftest.c 2>&1"
192#echo `$CC $CPPFLAGS $CFLAGS $1 $ERRFLAG -c conftest.c 2>&1`
193#exit 1
194:
195$4
196else
197AC_MSG_RESULT(failed)
198:
199$5
200fi
201fi
202])
203
204dnl Check for CC dependency flag
205dnl DEPFLAG: set to flag that generates dependencies.
206AC_DEFUN([ACX_DEPFLAG],
207[
208AC_MSG_CHECKING([$CC dependency flag])
209echo 'void f(){}' >conftest.c
210if test "`$CC -MM conftest.c 2>&1`" = "conftest.o: conftest.c"; then
211	DEPFLAG="-MM"
212else
213  if test "`$CC -xM1 conftest.c 2>&1`" = "conftest.o: conftest.c"; then
214	DEPFLAG="-xM1"
215  else
216	DEPFLAG="-MM"  # dunno do something
217  fi
218fi
219AC_MSG_RESULT($DEPFLAG)
220rm -f conftest.c
221AC_SUBST(DEPFLAG)
222])
223
224dnl Determine flags that gives POSIX and BSD functionality.
225dnl CFLAGS is modified for the result.
226AC_DEFUN([ACX_DETERMINE_EXT_FLAGS_UNBOUND],
227[
228ACX_CHECK_COMPILER_FLAG(std=c99, [C99FLAG="-std=c99"])
229ACX_CHECK_COMPILER_FLAG(xc99, [C99FLAG="-xc99"])
230
231AC_CHECK_HEADERS([getopt.h time.h],,, [AC_INCLUDES_DEFAULT])
232
233ACX_CHECK_COMPILER_FLAG_NEEDED($C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED=1 -D_ALL_SOURCE,
234[
235#include "confdefs.h"
236#include <stdlib.h>
237#include <ctype.h>
238#include <sys/time.h>
239#ifdef HAVE_TIME_H
240#include <time.h>
241#endif
242#include <unistd.h>
243#include <netdb.h>
244#ifdef HAVE_GETOPT_H
245#include <getopt.h>
246#endif
247
248int test() {
249	int a;
250	char **opts = NULL;
251	struct timeval tv;
252	char *t;
253	time_t time = 0;
254	char *buf = NULL;
255	const char* str = NULL;
256	struct msghdr msg;
257	msg.msg_control = 0;
258	t = ctime_r(&time, buf);
259	tv.tv_usec = 10;
260	srandom(32);
261	a = getopt(2, opts, "a");
262	a = isascii(32);
263	str = gai_strerror(0);
264	if(str && t && tv.tv_usec && msg.msg_control)
265		a = 0;
266	return a;
267}
268], [CFLAGS="$CFLAGS $C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED=1 -D_ALL_SOURCE"])
269
270ACX_CHECK_COMPILER_FLAG_NEEDED($C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_ALL_SOURCE,
271[
272#include "confdefs.h"
273#include <stdlib.h>
274#include <ctype.h>
275#include <sys/time.h>
276#ifdef HAVE_TIME_H
277#include <time.h>
278#endif
279#include <unistd.h>
280#include <netdb.h>
281#ifdef HAVE_GETOPT_H
282#include <getopt.h>
283#endif
284
285int test() {
286	int a;
287	char **opts = NULL;
288	struct timeval tv;
289	char *t;
290	time_t time = 0;
291	char *buf = NULL;
292	const char* str = NULL;
293	struct msghdr msg;
294	msg.msg_control = 0;
295	t = ctime_r(&time, buf);
296	tv.tv_usec = 10;
297	srandom(32);
298	a = getopt(2, opts, "a");
299	a = isascii(32);
300	str = gai_strerror(0);
301	if(str && t && tv.tv_usec && msg.msg_control)
302		a = 0;
303	return a;
304}
305], [CFLAGS="$CFLAGS $C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_ALL_SOURCE"])
306
307ACX_CHECK_COMPILER_FLAG_NEEDED($C99FLAG,
308[
309#include <stdbool.h>
310#include <ctype.h>
311int test() {
312        int a = 0;
313        return a;
314}
315], [CFLAGS="$CFLAGS $C99FLAG"])
316
317ACX_CHECK_COMPILER_FLAG_NEEDED(-D_BSD_SOURCE,
318[
319#include <ctype.h>
320
321int test() {
322        int a;
323        a = isascii(32);
324        return a;
325}
326], [CFLAGS="$CFLAGS -D_BSD_SOURCE"])
327
328ACX_CHECK_COMPILER_FLAG_NEEDED(-D_GNU_SOURCE,
329[
330#include <netinet/in.h>
331
332int test() {
333        struct in6_pktinfo inf;
334	int a = (int)sizeof(inf);
335        return a;
336}
337], [CFLAGS="$CFLAGS -D_GNU_SOURCE"])
338
339# check again for GNU_SOURCE for setresgid. May fail if setresgid
340# is not available at all. -D_FRSRESGID is to make this check unique.
341# otherwise we would get the previous cached result.
342ACX_CHECK_COMPILER_FLAG_NEEDED(-D_GNU_SOURCE -D_FRSRESGID,
343[
344#include <unistd.h>
345
346int test() {
347	int a = setresgid(0,0,0);
348	a = setresuid(0,0,0);
349        return a;
350}
351], [CFLAGS="$CFLAGS -D_GNU_SOURCE"])
352
353ACX_CHECK_COMPILER_FLAG_NEEDED(-D_POSIX_C_SOURCE=200112,
354[
355#include "confdefs.h"
356#ifdef HAVE_TIME_H
357#include <time.h>
358#endif
359#include <netdb.h>
360
361int test() {
362        int a = 0;
363        char *t;
364        time_t time = 0;
365        char *buf = NULL;
366	const char* str = NULL;
367        t = ctime_r(&time, buf);
368	str = gai_strerror(0);
369	if(t && str)
370		a = 0;
371        return a;
372}
373], [CFLAGS="$CFLAGS -D_POSIX_C_SOURCE=200112"])
374
375ACX_CHECK_COMPILER_FLAG_NEEDED(-D__EXTENSIONS__,
376[
377#include "confdefs.h"
378#include <stdlib.h>
379#include <ctype.h>
380#include <sys/time.h>
381#ifdef HAVE_TIME_H
382#include <time.h>
383#endif
384#include <unistd.h>
385#ifdef HAVE_GETOPT_H
386#include <getopt.h>
387#endif
388
389int test() {
390        int a;
391        char **opts = NULL;
392        struct timeval tv;
393        tv.tv_usec = 10;
394        srandom(32);
395        a = getopt(2, opts, "a");
396        a = isascii(32);
397	if(tv.tv_usec)
398		a = 0;
399        return a;
400}
401], [CFLAGS="$CFLAGS -D__EXTENSIONS__"])
402
403])dnl End of ACX_DETERMINE_EXT_FLAGS_UNBOUND
404
405dnl Check if CC supports -flto.
406dnl in a way that supports clang and suncc (that flag does something else,
407dnl but fails to link).  It sets it in CFLAGS if it works.
408AC_DEFUN([ACX_CHECK_FLTO],
409[AC_MSG_CHECKING([if $CC supports -flto])
410BAKCFLAGS="$CFLAGS"
411CFLAGS="$CFLAGS -flto"
412AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], [
413    if $CC $CFLAGS -o conftest conftest.c 2>&1 | grep "warning: no debug symbols in executable" >/dev/null; then
414	CFLAGS="$BAKCFLAGS"
415	AC_MSG_RESULT(no)
416    else
417	AC_MSG_RESULT(yes)
418    fi
419    rm -f conftest conftest.c conftest.o
420], [CFLAGS="$BAKCFLAGS" ; AC_MSG_RESULT(no)])
421])
422
423dnl Check the printf-format attribute (if any)
424dnl result in HAVE_ATTR_FORMAT.
425dnl Make sure you also include the AHX_CONFIG_FORMAT_ATTRIBUTE.
426AC_DEFUN([ACX_CHECK_FORMAT_ATTRIBUTE],
427[AC_REQUIRE([AC_PROG_CC])
428AC_MSG_CHECKING(whether the C compiler (${CC-cc}) accepts the "format" attribute)
429AC_CACHE_VAL(ac_cv_c_format_attribute,
430[ac_cv_c_format_attribute=no
431AC_TRY_COMPILE(
432[#include <stdio.h>
433void f (char *format, ...) __attribute__ ((format (printf, 1, 2)));
434void (*pf) (char *format, ...) __attribute__ ((format (printf, 1, 2)));
435], [
436   f ("%s", "str");
437],
438[ac_cv_c_format_attribute="yes"],
439[ac_cv_c_format_attribute="no"])
440])
441
442AC_MSG_RESULT($ac_cv_c_format_attribute)
443if test $ac_cv_c_format_attribute = yes; then
444  AC_DEFINE(HAVE_ATTR_FORMAT, 1, [Whether the C compiler accepts the "format" attribute])
445fi
446])dnl End of ACX_CHECK_FORMAT_ATTRIBUTE
447
448dnl Setup ATTR_FORMAT config.h parts.
449dnl make sure you call ACX_CHECK_FORMAT_ATTRIBUTE also.
450AC_DEFUN([AHX_CONFIG_FORMAT_ATTRIBUTE],
451[
452#ifdef HAVE_ATTR_FORMAT
453#  define ATTR_FORMAT(archetype, string_index, first_to_check) \
454    __attribute__ ((format (archetype, string_index, first_to_check)))
455#else /* !HAVE_ATTR_FORMAT */
456#  define ATTR_FORMAT(archetype, string_index, first_to_check) /* empty */
457#endif /* !HAVE_ATTR_FORMAT */
458])
459
460dnl Check how to mark function arguments as unused.
461dnl result in HAVE_ATTR_UNUSED.
462dnl Make sure you include AHX_CONFIG_UNUSED_ATTRIBUTE also.
463AC_DEFUN([ACX_CHECK_UNUSED_ATTRIBUTE],
464[AC_REQUIRE([AC_PROG_CC])
465AC_MSG_CHECKING(whether the C compiler (${CC-cc}) accepts the "unused" attribute)
466AC_CACHE_VAL(ac_cv_c_unused_attribute,
467[ac_cv_c_unused_attribute=no
468AC_TRY_COMPILE(
469[#include <stdio.h>
470void f (char *u __attribute__((unused)));
471], [
472   f ("x");
473],
474[ac_cv_c_unused_attribute="yes"],
475[ac_cv_c_unused_attribute="no"])
476])
477
478dnl Setup ATTR_UNUSED config.h parts.
479dnl make sure you call ACX_CHECK_UNUSED_ATTRIBUTE also.
480AC_DEFUN([AHX_CONFIG_UNUSED_ATTRIBUTE],
481[
482#if defined(DOXYGEN)
483#  define ATTR_UNUSED(x)  x
484#elif defined(__cplusplus)
485#  define ATTR_UNUSED(x)
486#elif defined(HAVE_ATTR_UNUSED)
487#  define ATTR_UNUSED(x)  x __attribute__((unused))
488#else /* !HAVE_ATTR_UNUSED */
489#  define ATTR_UNUSED(x)  x
490#endif /* !HAVE_ATTR_UNUSED */
491])
492
493AC_MSG_RESULT($ac_cv_c_unused_attribute)
494if test $ac_cv_c_unused_attribute = yes; then
495  AC_DEFINE(HAVE_ATTR_UNUSED, 1, [Whether the C compiler accepts the "unused" attribute])
496fi
497])dnl
498
499dnl Pre-fun for ACX_LIBTOOL_C_ONLY
500AC_DEFUN([ACX_LIBTOOL_C_PRE], [
501# skip these tests, we do not need them.
502AC_DEFUN([AC_PROG_F77], [:])
503AC_DEFUN([AC_PROG_FC], [:])
504AC_DEFUN([AC_PROG_CXX], [:])
505AC_DEFUN([AC_PROG_CXXCPP], [:])
506AC_DEFUN([AC_PROG_OBJC], [:])
507AC_DEFUN([AC_PROG_OBJCCPP], [:])
508AC_DEFUN([AC_LIBTOOL_CXX], [:])
509AC_DEFUN([AC_LIBTOOL_F77], [:])
510# always use ./libtool unless override from commandline (libtool=mylibtool)
511if test -z "$libtool"; then
512	libtool="./libtool"
513fi
514AC_SUBST(libtool)
515# avoid libtool max commandline length test on systems that fork slowly.
516AC_CANONICAL_HOST
517if echo "$host_os" | grep "sunos4" >/dev/null; then
518	lt_cv_sys_max_cmd_len=32750;
519fi
520AC_PATH_TOOL(AR, ar, [false])
521if test $AR = false; then
522	AC_MSG_ERROR([Cannot find 'ar', please extend PATH to include it])
523fi
524])
525
526dnl Perform libtool check, portably, only for C
527AC_DEFUN([ACX_LIBTOOL_C_ONLY], [
528dnl as a requirement so that is gets called before LIBTOOL
529dnl because libtools 'AC_REQUIRE' names are right after this one, before
530dnl this function contents.
531AC_REQUIRE([ACX_LIBTOOL_C_PRE])
532AC_PROG_LIBTOOL
533])
534
535dnl Detect if u_char type is defined, otherwise define it.
536AC_DEFUN([ACX_TYPE_U_CHAR],
537[AC_CHECK_TYPE([u_char], ,
538	[AC_DEFINE([u_char], [unsigned char], [Define to 'unsigned char if not defined])], [
539AC_INCLUDES_DEFAULT
540#ifdef HAVE_WINSOCK2_H
541#  include <winsock2.h>
542#endif
543]) ])
544
545dnl Detect if rlim_t type is defined, otherwise define it.
546AC_DEFUN([ACX_TYPE_RLIM_T],
547[AC_CHECK_TYPE(rlim_t, ,
548	[AC_DEFINE([rlim_t], [unsigned long], [Define to 'int' if not defined])], [
549AC_INCLUDES_DEFAULT
550#ifdef HAVE_SYS_RESOURCE_H
551#  include <sys/resource.h>
552#endif
553]) ])
554
555dnl Detect if socklen_t type is defined, otherwise define it.
556AC_DEFUN([ACX_TYPE_SOCKLEN_T],
557[
558AC_CHECK_TYPE(socklen_t, ,
559	[AC_DEFINE([socklen_t], [int], [Define to 'int' if not defined])], [
560AC_INCLUDES_DEFAULT
561#ifdef HAVE_SYS_SOCKET_H
562#  include <sys/socket.h>
563#endif
564#ifdef HAVE_WS2TCPIP_H
565#  include <ws2tcpip.h>
566#endif
567]) ])
568
569dnl Detect if in_addr_t type is defined, otherwise define it.
570AC_DEFUN([ACX_TYPE_IN_ADDR_T],
571[ AC_CHECK_TYPE(in_addr_t, [], [AC_DEFINE([in_addr_t], [uint32_t], [in_addr_t])], [
572AC_INCLUDES_DEFAULT
573#ifdef HAVE_SYS_TYPES_H
574# include <sys/types.h>
575#endif
576#ifdef HAVE_NETINET_IN_H
577# include <netinet/in.h>
578#endif
579]) ])
580
581dnl Detect if in_port_t type is defined, otherwise define it.
582AC_DEFUN([ACX_TYPE_IN_PORT_T],
583[ AC_CHECK_TYPE(in_port_t, [], [AC_DEFINE([in_port_t], [uint16_t], [in_port_t])], [
584AC_INCLUDES_DEFAULT
585#ifdef HAVE_SYS_TYPES_H
586# include <sys/types.h>
587#endif
588#ifdef HAVE_NETINET_IN_H
589# include <netinet/in.h>
590#endif
591]) ])
592
593dnl Add option to disable the evil rpath. Check whether to use rpath or not.
594dnl Adds the --disable-rpath option. Uses trick to edit the ./libtool.
595AC_DEFUN([ACX_ARG_RPATH],
596[
597AC_ARG_ENABLE(rpath,
598        [  --disable-rpath         disable hardcoded rpath (default=enabled)],
599	enable_rpath=$enableval, enable_rpath=yes)
600if test "x$enable_rpath" = xno; then
601	dnl AC_MSG_RESULT([Fixing libtool for -rpath problems.])
602	AC_CONFIG_COMMANDS([disable-rpath], [
603	sed < libtool > libtool-2 \
604	's/^hardcode_libdir_flag_spec.*$'/'hardcode_libdir_flag_spec=" -D__LIBTOOL_RPATH_SED__ "/'
605	mv libtool-2 libtool
606	chmod 755 libtool
607	libtool="./libtool"
608	])
609fi
610])
611
612dnl Add a -R to the RUNTIME_PATH.  Only if rpath is enabled and it is
613dnl an absolute path.
614dnl $1: the pathname to add.
615AC_DEFUN([ACX_RUNTIME_PATH_ADD], [
616	if test "x$enable_rpath" = xyes; then
617		if echo "$1" | grep "^/" >/dev/null; then
618			RUNTIME_PATH="$RUNTIME_PATH -R$1"
619		fi
620	fi
621])
622
623dnl Common code for both ACX_WITH_SSL and ACX_WITH_SSL_OPTIONAL
624dnl Takes one argument; the withval checked in those 2 functions
625dnl sets up the environment for the given openssl path
626AC_DEFUN([ACX_SSL_CHECKS], [
627    withval=$1
628    if test x_$withval != x_no; then
629        AC_MSG_CHECKING(for SSL)
630        if test x_$withval = x_ -o x_$withval = x_yes; then
631            withval="/usr/local/ssl /usr/lib/ssl /usr/ssl /usr/pkg /usr/local /opt/local /usr/sfw /usr"
632        fi
633        for dir in $withval; do
634            ssldir="$dir"
635            if test -f "$dir/include/openssl/ssl.h"; then
636                found_ssl="yes"
637                AC_DEFINE_UNQUOTED([HAVE_SSL], [], [Define if you have the SSL libraries installed.])
638                dnl assume /usr/include is already in the include-path.
639                if test "$ssldir" != "/usr"; then
640                        CPPFLAGS="$CPPFLAGS -I$ssldir/include"
641                        LIBSSL_CPPFLAGS="$LIBSSL_CPPFLAGS -I$ssldir/include"
642                fi
643                break;
644            fi
645        done
646        if test x_$found_ssl != x_yes; then
647            AC_MSG_ERROR(Cannot find the SSL libraries in $withval)
648        else
649            AC_MSG_RESULT(found in $ssldir)
650            HAVE_SSL=yes
651            dnl assume /usr is already in the lib and dynlib paths.
652            if test "$ssldir" != "/usr" -a "$ssldir" != ""; then
653                LDFLAGS="$LDFLAGS -L$ssldir/lib"
654                LIBSSL_LDFLAGS="$LIBSSL_LDFLAGS -L$ssldir/lib"
655                ACX_RUNTIME_PATH_ADD([$ssldir/lib])
656            fi
657
658            AC_MSG_CHECKING([for HMAC_CTX_init in -lcrypto])
659            LIBS="$LIBS -lcrypto"
660            LIBSSL_LIBS="$LIBSSL_LIBS -lcrypto"
661            AC_TRY_LINK(, [
662                int HMAC_CTX_init(void);
663                (void)HMAC_CTX_init();
664              ], [
665                AC_MSG_RESULT(yes)
666                AC_DEFINE([HAVE_HMAC_CTX_INIT], 1,
667                          [If you have HMAC_CTX_init])
668              ], [
669                AC_MSG_RESULT(no)
670                # check if -lwsock32 or -lgdi32 are needed.
671                BAKLIBS="$LIBS"
672                BAKSSLLIBS="$LIBSSL_LIBS"
673                LIBS="$LIBS -lgdi32"
674                LIBSSL_LIBS="$LIBSSL_LIBS -lgdi32"
675                AC_MSG_CHECKING([if -lcrypto needs -lgdi32])
676                AC_TRY_LINK([], [
677                    int HMAC_CTX_init(void);
678                    (void)HMAC_CTX_init();
679                  ],[
680                    AC_DEFINE([HAVE_HMAC_CTX_INIT], 1,
681                        [If you have HMAC_CTX_init])
682                    AC_MSG_RESULT(yes)
683                  ],[
684                    AC_MSG_RESULT(no)
685                    LIBS="$BAKLIBS"
686                    LIBSSL_LIBS="$BAKSSLLIBS"
687                    LIBS="$LIBS -ldl"
688                    LIBSSL_LIBS="$LIBSSL_LIBS -ldl"
689                    AC_MSG_CHECKING([if -lcrypto needs -ldl])
690                    AC_TRY_LINK([], [
691                        int HMAC_CTX_init(void);
692                        (void)HMAC_CTX_init();
693                      ],[
694                        AC_DEFINE([HAVE_HMAC_CTX_INIT], 1,
695                            [If you have HMAC_CTX_init])
696                        AC_MSG_RESULT(yes)
697                      ],[
698                        AC_MSG_RESULT(no)
699                    AC_MSG_ERROR([OpenSSL found in $ssldir, but version 0.9.7 or higher is required])
700                    ])
701                ])
702            ])
703        fi
704        AC_SUBST(HAVE_SSL)
705        AC_SUBST(RUNTIME_PATH)
706	# openssl engine functionality needs dlopen().
707	BAKLIBS="$LIBS"
708	AC_SEARCH_LIBS([dlopen], [dl])
709	if test "$LIBS" != "$BAKLIBS"; then
710		LIBSSL_LIBS="$LIBSSL_LIBS -ldl"
711	fi
712    fi
713AC_CHECK_HEADERS([openssl/ssl.h],,, [AC_INCLUDES_DEFAULT])
714AC_CHECK_HEADERS([openssl/err.h],,, [AC_INCLUDES_DEFAULT])
715AC_CHECK_HEADERS([openssl/rand.h],,, [AC_INCLUDES_DEFAULT])
716])dnl End of ACX_SSL_CHECKS
717
718dnl Check for SSL, where SSL is mandatory
719dnl Adds --with-ssl option, searches for openssl and defines HAVE_SSL if found
720dnl Setup of CPPFLAGS, CFLAGS.  Adds -lcrypto to LIBS.
721dnl Checks main header files of SSL.
722dnl
723AC_DEFUN([ACX_WITH_SSL],
724[
725AC_ARG_WITH(ssl, AC_HELP_STRING([--with-ssl=pathname],
726                                    [enable SSL (will check /usr/local/ssl
727                            /usr/lib/ssl /usr/ssl /usr/pkg /usr/local /opt/local /usr/sfw /usr)]),[
728        ],[
729            withval="yes"
730        ])
731    if test x_$withval = x_no; then
732	AC_MSG_ERROR([Need SSL library to do digital signature cryptography])
733    fi
734    ACX_SSL_CHECKS($withval)
735])dnl End of ACX_WITH_SSL
736
737dnl Check for SSL, where ssl is optional (--without-ssl is allowed)
738dnl Adds --with-ssl option, searches for openssl and defines HAVE_SSL if found
739dnl Setup of CPPFLAGS, CFLAGS.  Adds -lcrypto to LIBS.
740dnl Checks main header files of SSL.
741dnl
742AC_DEFUN([ACX_WITH_SSL_OPTIONAL],
743[
744AC_ARG_WITH(ssl, AC_HELP_STRING([--with-ssl=pathname],
745                                [enable SSL (will check /usr/local/ssl
746                                /usr/lib/ssl /usr/ssl /usr/pkg /usr/local /opt/local /usr/sfw /usr)]),[
747        ],[
748            withval="yes"
749        ])
750    ACX_SSL_CHECKS($withval)
751])dnl End of ACX_WITH_SSL_OPTIONAL
752
753dnl Setup to use -lssl
754dnl To use -lcrypto, use the ACX_WITH_SSL setup (before this one).
755AC_DEFUN([ACX_LIB_SSL],
756[
757# check if libssl needs libdl
758BAKLIBS="$LIBS"
759LIBS="-lssl $LIBS"
760AC_MSG_CHECKING([if libssl needs libdl])
761AC_TRY_LINK_FUNC([SSL_CTX_new], [
762	AC_MSG_RESULT([no])
763	LIBS="$BAKLIBS"
764] , [
765	AC_MSG_RESULT([yes])
766	LIBS="$BAKLIBS"
767	AC_SEARCH_LIBS([dlopen], [dl])
768]) ])dnl End of ACX_LIB_SSL
769
770dnl Setup to use very large files (>2Gb).
771dnl setups fseeko and its own
772AC_DEFUN([ACX_SYS_LARGEFILE],
773[
774AC_SYS_LARGEFILE
775dnl try to see if an additional _LARGEFILE_SOURCE 1 is needed to get fseeko
776ACX_CHECK_COMPILER_FLAG_NEEDED(-D_LARGEFILE_SOURCE=1,
777[
778#include <stdio.h>
779int test() {
780        int a = fseeko(stdin, 0, 0);
781        return a;
782}
783], [CFLAGS="$CFLAGS -D_LARGEFILE_SOURCE=1"])
784])
785
786dnl Check getaddrinfo.
787dnl Works on linux, solaris, bsd and windows(links winsock).
788dnl defines HAVE_GETADDRINFO, USE_WINSOCK.
789AC_DEFUN([ACX_CHECK_GETADDRINFO_WITH_INCLUDES],
790[AC_REQUIRE([AC_PROG_CC])
791AC_MSG_CHECKING(for getaddrinfo)
792ac_cv_func_getaddrinfo=no
793AC_LINK_IFELSE(
794[AC_LANG_SOURCE([[
795#ifdef __cplusplus
796extern "C"
797{
798#endif
799char* getaddrinfo();
800char* (*f) () = getaddrinfo;
801#ifdef __cplusplus
802}
803#endif
804int main() {
805        ;
806        return 0;
807}
808]])],
809dnl this case on linux, solaris, bsd
810[ac_cv_func_getaddrinfo="yes"
811dnl see if on windows
812if test "$ac_cv_header_windows_h" = "yes"; then
813	AC_DEFINE(USE_WINSOCK, 1, [Whether the windows socket API is used])
814	USE_WINSOCK="1"
815	LIBS="$LIBS -lws2_32"
816fi
817],
818dnl no quick getaddrinfo, try mingw32 and winsock2 library.
819ORIGLIBS="$LIBS"
820LIBS="$LIBS -lws2_32"
821AC_LINK_IFELSE(
822[AC_LANG_PROGRAM(
823[
824#ifdef HAVE_WS2TCPIP_H
825#include <ws2tcpip.h>
826#endif
827],
828[
829        (void)getaddrinfo(NULL, NULL, NULL, NULL);
830]
831)],
832[
833ac_cv_func_getaddrinfo="yes"
834dnl already: LIBS="$LIBS -lws2_32"
835AC_DEFINE(USE_WINSOCK, 1, [Whether the windows socket API is used])
836USE_WINSOCK="1"
837],
838[
839ac_cv_func_getaddrinfo="no"
840LIBS="$ORIGLIBS"
841])
842)
843
844AC_MSG_RESULT($ac_cv_func_getaddrinfo)
845if test $ac_cv_func_getaddrinfo = yes; then
846  AC_DEFINE(HAVE_GETADDRINFO, 1, [Whether getaddrinfo is available])
847fi
848])dnl Endof AC_CHECK_GETADDRINFO_WITH_INCLUDES
849
850dnl check if a function is deprecated. defines DEPRECATED_func in config.h.
851dnl $1: function name
852dnl $2: C-statement that calls the function.
853dnl $3: includes for the program.
854dnl $4: executes if yes
855dnl $5: executes if no
856AC_DEFUN([ACX_FUNC_DEPRECATED],
857[
858AC_REQUIRE([AC_PROG_CC])
859AC_MSG_CHECKING(if $1 is deprecated)
860cache=`echo $1 | sed 'y%.=/+-%___p_%'`
861AC_CACHE_VAL(cv_cc_deprecated_$cache,
862[
863echo '$3' >conftest.c
864echo 'void f(){ $2 }' >>conftest.c
865if test -z "`$CC -c conftest.c 2>&1 | grep deprecated`"; then
866eval "cv_cc_deprecated_$cache=no"
867else
868eval "cv_cc_deprecated_$cache=yes"
869fi
870rm -f conftest conftest.o conftest.c
871])
872if eval "test \"`echo '$cv_cc_deprecated_'$cache`\" = yes"; then
873AC_MSG_RESULT(yes)
874AC_DEFINE_UNQUOTED(AS_TR_CPP([DEPRECATED_$1]), 1, [Whether $1 is deprecated])
875:
876$4
877else
878AC_MSG_RESULT(no)
879:
880$5
881fi
882])dnl end of ACX_FUNC_DEPRECATED
883
884dnl check if select and nonblocking sockets actually work.
885dnl Needs fork(2) and select(2).
886dnl defines NONBLOCKING_IS_BROKEN, and if that is true multiple reads from
887dnl a nonblocking socket do not work, a new call to select is necessary.
888AC_DEFUN([ACX_CHECK_NONBLOCKING_BROKEN],
889[
890AC_MSG_CHECKING([if nonblocking sockets work])
891if echo $target | grep mingw32 >/dev/null; then
892	AC_MSG_RESULT([no (windows)])
893	AC_DEFINE([NONBLOCKING_IS_BROKEN], 1, [Define if the network stack does not fully support nonblocking io (causes lower performance).])
894else
895AC_RUN_IFELSE([
896AC_LANG_SOURCE([[
897#include <stdio.h>
898#include <string.h>
899#include <stdlib.h>
900#include <fcntl.h>
901#include <errno.h>
902#ifdef HAVE_SYS_TYPES_H
903#include <sys/types.h>
904#endif
905#ifdef HAVE_SYS_SOCKET_H
906#include <sys/socket.h>
907#endif
908#ifdef HAVE_NETINET_IN_H
909#include <netinet/in.h>
910#endif
911#ifdef HAVE_ARPA_INET_H
912#include <arpa/inet.h>
913#endif
914#ifdef HAVE_UNISTD_H
915#include <unistd.h>
916#endif
917#ifdef HAVE_TIME_H
918#include <time.h>
919#endif
920
921int main(void)
922{
923	int port;
924	int sfd, cfd;
925	int num = 10;
926	int i, p;
927	struct sockaddr_in a;
928	/* test if select and nonblocking reads work well together */
929	/* open port.
930	   fork child to send 10 messages.
931	   select to read.
932	   then try to nonblocking read the 10 messages
933	   then, nonblocking read must give EAGAIN
934	*/
935
936	port = 12345 + (time(0)%32);
937	sfd = socket(PF_INET, SOCK_DGRAM, 0);
938	if(sfd == -1) {
939		perror("socket");
940		return 1;
941	}
942	memset(&a, 0, sizeof(a));
943	a.sin_family = AF_INET;
944	a.sin_port = htons(port);
945	a.sin_addr.s_addr = inet_addr("127.0.0.1");
946	if(bind(sfd, (struct sockaddr*)&a, sizeof(a)) < 0) {
947		perror("bind");
948		return 1;
949	}
950	if(fcntl(sfd, F_SETFL, O_NONBLOCK) == -1) {
951		perror("fcntl");
952		return 1;
953	}
954
955	cfd = socket(PF_INET, SOCK_DGRAM, 0);
956	if(cfd == -1) {
957		perror("client socket");
958		return 1;
959	}
960	a.sin_port = 0;
961	if(bind(cfd, (struct sockaddr*)&a, sizeof(a)) < 0) {
962		perror("client bind");
963		return 1;
964	}
965	a.sin_port = htons(port);
966
967	/* no handler, causes exit in 10 seconds */
968	alarm(10);
969
970	/* send and receive on the socket */
971	if((p=fork()) == 0) {
972		for(i=0; i<num; i++) {
973			if(sendto(cfd, &i, sizeof(i), 0,
974				(struct sockaddr*)&a, sizeof(a)) < 0) {
975				perror("sendto");
976				return 1;
977			}
978		}
979	} else {
980		/* parent */
981		fd_set rset;
982		int x;
983		if(p == -1) {
984			perror("fork");
985			return 1;
986		}
987		FD_ZERO(&rset);
988		FD_SET(sfd, &rset);
989		if(select(sfd+1, &rset, NULL, NULL, NULL) < 1) {
990			perror("select");
991			return 1;
992		}
993		i = 0;
994		while(i < num) {
995			if(recv(sfd, &x, sizeof(x), 0) != sizeof(x)) {
996				if(errno == EAGAIN)
997					continue;
998				perror("recv");
999				return 1;
1000			}
1001			i++;
1002		}
1003		/* now we want to get EAGAIN: nonblocking goodness */
1004		errno = 0;
1005		recv(sfd, &x, sizeof(x), 0);
1006		if(errno != EAGAIN) {
1007			perror("trying to recv again");
1008			return 1;
1009		}
1010		/* EAGAIN encountered */
1011	}
1012
1013	close(sfd);
1014	close(cfd);
1015	return 0;
1016}
1017]])], [
1018	AC_MSG_RESULT([yes])
1019], [
1020	AC_MSG_RESULT([no])
1021	AC_DEFINE([NONBLOCKING_IS_BROKEN], 1, [Define if the network stack does not fully support nonblocking io (causes lower performance).])
1022], [
1023	AC_MSG_RESULT([crosscompile(yes)])
1024])
1025fi
1026])dnl End of ACX_CHECK_NONBLOCKING_BROKEN
1027
1028dnl Check if mkdir has one or two arguments.
1029dnl defines MKDIR_HAS_ONE_ARG
1030AC_DEFUN([ACX_MKDIR_ONE_ARG],
1031[
1032AC_MSG_CHECKING([whether mkdir has one arg])
1033AC_TRY_COMPILE([
1034#include <stdio.h>
1035#include <unistd.h>
1036#ifdef HAVE_WINSOCK2_H
1037#include <winsock2.h>
1038#endif
1039#ifdef HAVE_SYS_STAT_H
1040#include <sys/stat.h>
1041#endif
1042], [
1043	(void)mkdir("directory");
1044],
1045AC_MSG_RESULT(yes)
1046AC_DEFINE(MKDIR_HAS_ONE_ARG, 1, [Define if mkdir has one argument.])
1047,
1048AC_MSG_RESULT(no)
1049)
1050])dnl end of ACX_MKDIR_ONE_ARG
1051
1052dnl Check for ioctlsocket function. works on mingw32 too.
1053AC_DEFUN([ACX_FUNC_IOCTLSOCKET],
1054[
1055# check ioctlsocket
1056AC_MSG_CHECKING(for ioctlsocket)
1057AC_LINK_IFELSE([AC_LANG_PROGRAM([
1058#ifdef HAVE_WINSOCK2_H
1059#include <winsock2.h>
1060#endif
1061], [
1062	(void)ioctlsocket(0, 0, NULL);
1063])], [
1064AC_MSG_RESULT(yes)
1065AC_DEFINE(HAVE_IOCTLSOCKET, 1, [if the function 'ioctlsocket' is available])
1066],[AC_MSG_RESULT(no)])
1067])dnl end of ACX_FUNC_IOCTLSOCKET
1068
1069dnl detect malloc and provide malloc compat prototype.
1070dnl $1: unique name for compat code
1071AC_DEFUN([ACX_FUNC_MALLOC],
1072[
1073	AC_MSG_CHECKING([for GNU libc compatible malloc])
1074	AC_RUN_IFELSE([AC_LANG_PROGRAM(
1075[[#if defined STDC_HEADERS || defined HAVE_STDLIB_H
1076#include <stdlib.h>
1077#else
1078char *malloc ();
1079#endif
1080]], [ if(malloc(0) != 0) return 1;])
1081],
1082	[AC_MSG_RESULT([no])
1083	AC_LIBOBJ(malloc)
1084	AC_DEFINE_UNQUOTED([malloc], [rpl_malloc_$1], [Define if  replacement function should be used.])] ,
1085	[AC_MSG_RESULT([yes])
1086	AC_DEFINE([HAVE_MALLOC], 1, [If have GNU libc compatible malloc])],
1087	[AC_MSG_RESULT([no (crosscompile)])
1088	AC_LIBOBJ(malloc)
1089	AC_DEFINE_UNQUOTED([malloc], [rpl_malloc_$1], [Define if  replacement function should be used.])] )
1090])
1091
1092dnl Define fallback for fseeko and ftello if needed.
1093AC_DEFUN([AHX_CONFIG_FSEEKO],
1094[
1095#ifndef HAVE_FSEEKO
1096#define fseeko fseek
1097#define ftello ftell
1098#endif /* HAVE_FSEEKO */
1099])
1100
1101dnl Define RAND_MAX if not defined
1102AC_DEFUN([AHX_CONFIG_RAND_MAX],
1103[
1104#ifndef RAND_MAX
1105#define RAND_MAX	2147483647
1106#endif
1107])
1108
1109dnl Define MAXHOSTNAMELEN if not defined
1110AC_DEFUN([AHX_CONFIG_MAXHOSTNAMELEN],
1111[
1112#ifndef MAXHOSTNAMELEN
1113#define MAXHOSTNAMELEN 256
1114#endif
1115])
1116
1117dnl Define IPV6_MIN_MTU if not defined
1118AC_DEFUN([AHX_CONFIG_IPV6_MIN_MTU],
1119[
1120#ifndef IPV6_MIN_MTU
1121#define IPV6_MIN_MTU 1280
1122#endif /* IPV6_MIN_MTU */
1123])
1124
1125dnl provide snprintf, vsnprintf compat prototype
1126dnl $1: unique name for compat code
1127AC_DEFUN([AHX_CONFIG_SNPRINTF],
1128[
1129#ifndef HAVE_SNPRINTF
1130#define snprintf snprintf_$1
1131#define vsnprintf vsnprintf_$1
1132#include <stdarg.h>
1133int snprintf (char *str, size_t count, const char *fmt, ...);
1134int vsnprintf (char *str, size_t count, const char *fmt, va_list arg);
1135#endif /* HAVE_SNPRINTF */
1136])
1137
1138dnl provide inet_pton compat prototype.
1139dnl $1: unique name for compat code
1140AC_DEFUN([AHX_CONFIG_INET_PTON],
1141[
1142#ifndef HAVE_INET_PTON
1143#define inet_pton inet_pton_$1
1144int inet_pton(int af, const char* src, void* dst);
1145#endif /* HAVE_INET_PTON */
1146])
1147
1148dnl provide inet_ntop compat prototype.
1149dnl $1: unique name for compat code
1150AC_DEFUN([AHX_CONFIG_INET_NTOP],
1151[
1152#ifndef HAVE_INET_NTOP
1153#define inet_ntop inet_ntop_$1
1154const char *inet_ntop(int af, const void *src, char *dst, size_t size);
1155#endif
1156])
1157
1158dnl provide inet_aton compat prototype.
1159dnl $1: unique name for compat code
1160AC_DEFUN([AHX_CONFIG_INET_ATON],
1161[
1162#ifndef HAVE_INET_ATON
1163#define inet_aton inet_aton_$1
1164int inet_aton(const char *cp, struct in_addr *addr);
1165#endif
1166])
1167
1168dnl provide memmove compat prototype.
1169dnl $1: unique name for compat code
1170AC_DEFUN([AHX_CONFIG_MEMMOVE],
1171[
1172#ifndef HAVE_MEMMOVE
1173#define memmove memmove_$1
1174void *memmove(void *dest, const void *src, size_t n);
1175#endif
1176])
1177
1178dnl provide strlcat compat prototype.
1179dnl $1: unique name for compat code
1180AC_DEFUN([AHX_CONFIG_STRLCAT],
1181[
1182#ifndef HAVE_STRLCAT
1183#define strlcat strlcat_$1
1184size_t strlcat(char *dst, const char *src, size_t siz);
1185#endif
1186])
1187
1188dnl provide strlcpy compat prototype.
1189dnl $1: unique name for compat code
1190AC_DEFUN([AHX_CONFIG_STRLCPY],
1191[
1192#ifndef HAVE_STRLCPY
1193#define strlcpy strlcpy_$1
1194size_t strlcpy(char *dst, const char *src, size_t siz);
1195#endif
1196])
1197
1198dnl provide gmtime_r compat prototype.
1199dnl $1: unique name for compat code
1200AC_DEFUN([AHX_CONFIG_GMTIME_R],
1201[
1202#ifndef HAVE_GMTIME_R
1203#define gmtime_r gmtime_r_$1
1204struct tm *gmtime_r(const time_t *timep, struct tm *result);
1205#endif
1206])
1207
1208dnl provide w32 compat definition for sleep
1209AC_DEFUN([AHX_CONFIG_W32_SLEEP],
1210[
1211#ifndef HAVE_SLEEP
1212#define sleep(x) Sleep((x)*1000) /* on win32 */
1213#endif /* HAVE_SLEEP */
1214])
1215
1216dnl provide w32 compat definition for usleep
1217AC_DEFUN([AHX_CONFIG_W32_USLEEP],
1218[
1219#ifndef HAVE_USLEEP
1220#define usleep(x) Sleep((x)/1000 + 1) /* on win32 */
1221#endif /* HAVE_USLEEP */
1222])
1223
1224dnl provide w32 compat definition for random
1225AC_DEFUN([AHX_CONFIG_W32_RANDOM],
1226[
1227#ifndef HAVE_RANDOM
1228#define random rand /* on win32, for tests only (bad random) */
1229#endif /* HAVE_RANDOM */
1230])
1231
1232dnl provide w32 compat definition for srandom
1233AC_DEFUN([AHX_CONFIG_W32_SRANDOM],
1234[
1235#ifndef HAVE_SRANDOM
1236#define srandom(x) srand(x) /* on win32, for tests only (bad random) */
1237#endif /* HAVE_SRANDOM */
1238])
1239
1240dnl provide w32 compat definition for FD_SET_T
1241AC_DEFUN([AHX_CONFIG_W32_FD_SET_T],
1242[
1243/* detect if we need to cast to unsigned int for FD_SET to avoid warnings */
1244#ifdef HAVE_WINSOCK2_H
1245#define FD_SET_T (u_int)
1246#else
1247#define FD_SET_T
1248#endif
1249])
1250
1251dnl Remove an extension flag from CFLAGS, define replacement to be made.
1252dnl Used by ACX_STRIP_EXT_FLAGS.
1253dnl $1: the name of the flag, for example -D_GNU_SOURCE.
1254AC_DEFUN([ACX_CFLAGS_STRIP],
1255[
1256  if echo $CFLAGS | grep " $1" >/dev/null 2>&1; then
1257    CFLAGS="`echo $CFLAGS | sed -e 's/ $1//g'`"
1258    AC_DEFINE(m4_bpatsubst(OMITTED_$1,[[-=]],_), 1, Put $1 define in config.h)
1259  fi
1260])
1261
1262dnl Remove EXT flags from the CFLAGS and set them to be defined in config.h
1263dnl use with ACX_DETERMINE_EXT_FLAGS.
1264AC_DEFUN([ACX_STRIP_EXT_FLAGS],
1265[
1266  AC_MSG_NOTICE([Stripping extension flags...])
1267  ACX_CFLAGS_STRIP(-D_GNU_SOURCE)
1268  ACX_CFLAGS_STRIP(-D_BSD_SOURCE)
1269  ACX_CFLAGS_STRIP(-D__EXTENSIONS__)
1270  ACX_CFLAGS_STRIP(-D_POSIX_C_SOURCE=200112)
1271  ACX_CFLAGS_STRIP(-D_XOPEN_SOURCE=600)
1272  ACX_CFLAGS_STRIP(-D_XOPEN_SOURCE_EXTENDED=1)
1273  ACX_CFLAGS_STRIP(-D_ALL_SOURCE)
1274  ACX_CFLAGS_STRIP(-D_LARGEFILE_SOURCE=1)
1275]) dnl End of ACX_STRIP_EXT_FLAGS
1276
1277dnl define one omitted flag for config.h
1278dnl $1: flag name. -D_GNU_SOURCE
1279dnl $2: replacement define. _GNU_SOURCE
1280dnl $3: define value, 1
1281AC_DEFUN([AHX_CONFIG_FLAG_OMITTED],
1282[#if defined($1) && !defined($2)
1283#define $2 $3
1284[#]endif ])
1285
1286dnl Wrapper for AHX_CONFIG_FLAG_OMITTED for -D style flags
1287dnl $1: the -DNAME or -DNAME=value string.
1288AC_DEFUN([AHX_CONFIG_FLAG_EXT],
1289[AHX_CONFIG_FLAG_OMITTED(m4_bpatsubst(OMITTED_$1,[[-=]],_),m4_bpatsubst(m4_bpatsubst($1,-D,),=.*$,),m4_if(m4_bregexp($1,=),-1,1,m4_bpatsubst($1,^.*=,)))
1290])
1291
1292dnl config.h part to define omitted cflags, use with ACX_STRIP_EXT_FLAGS.
1293AC_DEFUN([AHX_CONFIG_EXT_FLAGS],
1294[AHX_CONFIG_FLAG_EXT(-D_GNU_SOURCE)
1295AHX_CONFIG_FLAG_EXT(-D_BSD_SOURCE)
1296AHX_CONFIG_FLAG_EXT(-D__EXTENSIONS__)
1297AHX_CONFIG_FLAG_EXT(-D_POSIX_C_SOURCE=200112)
1298AHX_CONFIG_FLAG_EXT(-D_XOPEN_SOURCE=600)
1299AHX_CONFIG_FLAG_EXT(-D_XOPEN_SOURCE_EXTENDED=1)
1300AHX_CONFIG_FLAG_EXT(-D_ALL_SOURCE)
1301AHX_CONFIG_FLAG_EXT(-D_LARGEFILE_SOURCE=1)
1302])
1303
1304dnl check if memcmp is using signed characters and replace if so.
1305AC_DEFUN([ACX_CHECK_MEMCMP_SIGNED],
1306[AC_MSG_CHECKING([if memcmp compares unsigned])
1307AC_RUN_IFELSE([AC_LANG_SOURCE([[
1308#include <stdio.h>
1309#include <stdlib.h>
1310#include <string.h>
1311int main(void)
1312{
1313	char a = 255, b = 0;
1314	if(memcmp(&a, &b, 1) < 0)
1315		return 1;
1316	return 0;
1317}
1318]])], [AC_MSG_RESULT([yes]) ],
1319[ AC_MSG_RESULT([no])
1320  AC_DEFINE([MEMCMP_IS_BROKEN], [1], [Define if memcmp() does not compare unsigned bytes])
1321  AC_LIBOBJ([memcmp])
1322], [ AC_MSG_RESULT([cross-compile no])
1323  AC_DEFINE([MEMCMP_IS_BROKEN], [1], [Define if memcmp() does not compare unsigned bytes])
1324  AC_LIBOBJ([memcmp])
1325]) ])
1326
1327dnl define memcmp to its replacement, pass unique id for program as arg
1328AC_DEFUN([AHX_MEMCMP_BROKEN], [
1329#ifdef MEMCMP_IS_BROKEN
1330#include "compat/memcmp.h"
1331#define memcmp memcmp_$1
1332int memcmp(const void *x, const void *y, size_t n);
1333#endif
1334])
1335
1336dnl ACX_CHECK_SS_FAMILY           - check for sockaddr_storage.ss_family
1337AC_DEFUN([ACX_CHECK_SS_FAMILY],
1338[AC_CHECK_MEMBER([struct sockaddr_storage.ss_family], [], [
1339        AC_CHECK_MEMBER([struct sockaddr_storage.__ss_family], [
1340                AC_DEFINE([ss_family], [__ss_family], [Fallback member name for socket family in struct sockaddr_storage])
1341        ],, [AC_INCLUDES_DEFAULT
1342#ifdef HAVE_NETINET_IN_H
1343#include <netinet/in.h>
1344#endif
1345#ifdef HAVE_SYS_SOCKET_H
1346#include <sys/socket.h>
1347#endif
1348#ifdef HAVE_NETDB_H
1349#include <netdb.h>
1350#endif
1351#ifdef HAVE_ARPA_INET_H
1352#include <arpa/inet.h>
1353#endif
1354    ])
1355], [AC_INCLUDES_DEFAULT
1356#ifdef HAVE_NETINET_IN_H
1357#include <netinet/in.h>
1358#endif
1359#ifdef HAVE_SYS_SOCKET_H
1360#include <sys/socket.h>
1361#endif
1362#ifdef HAVE_NETDB_H
1363#include <netdb.h>
1364#endif
1365#ifdef HAVE_ARPA_INET_H
1366#include <arpa/inet.h>
1367#endif
1368]) ])
1369
1370dnl End of file
1371