xref: /freebsd/contrib/ntp/sntp/m4/ntp_ipv6.m4 (revision 1c05a6ea6b849ff95e539c31adea887c644a6a01)
1dnl ######################################################################
2dnl Common IPv6 detection for NTP configure.ac files
3AC_DEFUN([NTP_IPV6], [
4
5AC_CACHE_CHECK(
6    [for struct sockaddr_storage],
7    [ntp_cv_sockaddr_storage],
8    [AC_COMPILE_IFELSE(
9	[AC_LANG_PROGRAM(
10	    [[
11		#ifdef HAVE_SYS_TYPES_H
12		# include <sys/types.h>
13		#endif
14		#ifdef HAVE_SYS_SOCKET_H
15		# include <sys/socket.h>
16		#endif
17		#ifdef HAVE_NETINET_IN_H
18		# include <netinet/in.h>
19		#endif
20	    ]],
21	    [[
22		struct sockaddr_storage n;
23	    ]]
24	)],
25	[ntp_cv_sockaddr_storage=yes],
26	[ntp_cv_sockaddr_storage=no]
27    )]
28)
29case "$ntp_cv_sockaddr_storage" in
30 yes)
31    AC_DEFINE([HAVE_STRUCT_SOCKADDR_STORAGE], [1],
32	[Does a system header define struct sockaddr_storage?])
33    AC_CACHE_CHECK(
34	[for sockaddr_storage.__ss_family],
35	[ntp_cv_have___ss_family],
36	[AC_COMPILE_IFELSE(
37	    [AC_LANG_PROGRAM(
38		[[
39		    #ifdef HAVE_SYS_TYPES_H
40		    # include <sys/types.h>
41		    #endif
42		    #ifdef HAVE_SYS_SOCKET_H
43		    # include <sys/socket.h>
44		    #endif
45		    #ifdef HAVE_NETINET_IN_H
46		    # include <netinet/in.h>
47		    #endif
48		]],
49		[[
50		    struct sockaddr_storage s;
51		    s.__ss_family = 1;
52		]]
53	    )],
54	    [ntp_cv_have___ss_family=yes],
55	    [ntp_cv_have___ss_family=no]
56	)]
57    )
58    case "$ntp_cv_have___ss_family" in
59     yes)
60	AC_DEFINE([HAVE___SS_FAMILY_IN_SS], [1],
61		  [Does struct sockaddr_storage have __ss_family?])
62    esac
63    AH_VERBATIM(
64	[HAVE___SS_FAMILY_IN_SS_VERBATIM],
65	[
66	    /* Handle sockaddr_storage.__ss_family */
67	    #ifdef HAVE___SS_FAMILY_IN_SS
68	    # define ss_family __ss_family
69	    #endif /* HAVE___SS_FAMILY_IN_SS */
70	]
71    )
72esac
73
74
75#
76# Look for in_port_t.
77#
78AC_CACHE_CHECK(
79    [for in_port_t],
80    [isc_cv_have_in_port_t],
81    [AC_COMPILE_IFELSE(
82	[AC_LANG_PROGRAM(
83	    [[
84		#include <sys/types.h>
85		#include <netinet/in.h>
86	    ]],
87	    [[
88		in_port_t port = 25;
89		return (0);
90	    ]]
91	)],
92	[isc_cv_have_in_port_t=yes],
93	[isc_cv_have_in_port_t=no]
94    )]
95)
96case "$isc_cv_have_in_port_t" in
97 no)
98	AC_DEFINE([ISC_PLATFORM_NEEDPORTT], [1],
99	    [Declare in_port_t?])
100esac
101
102AC_CACHE_CHECK(
103    [type of socklen arg for getsockname()],
104    [ntp_cv_getsockname_socklen_type],
105    [
106    getsockname_socklen_type_found=no
107    for getsockname_arg2 in 'struct sockaddr *' 'void *'; do
108	for ntp_cv_getsockname_socklen_type in 'socklen_t' 'size_t' 'unsigned int' 'int'; do
109	    AC_COMPILE_IFELSE(
110		[AC_LANG_PROGRAM(
111		    [[
112			#ifdef HAVE_SYS_TYPES_H
113			# include <sys/types.h>
114			#endif
115			#ifdef HAVE_SYS_SOCKET_H
116			# include <sys/socket.h>
117			#endif
118		    ]], [[
119			extern
120			getsockname(int, $getsockname_arg2,
121				$ntp_cv_getsockname_socklen_type *);
122		    ]]
123		)],
124		[getsockname_socklen_type_found=yes ; break 2],
125		[]
126	    )
127	done
128    done
129    case "$getsockname_socklen_type_found" in
130     no)
131	ntp_cv_getsockname_socklen_type='socklen_t'
132    esac
133    AS_UNSET([getsockname_arg2])
134    AS_UNSET([getsockname_socklen_type_found])
135    ]
136)
137AC_DEFINE_UNQUOTED([GETSOCKNAME_SOCKLEN_TYPE],
138		   [$ntp_cv_getsockname_socklen_type],
139		   [What is getsockname()'s socklen type?])
140
141AC_CACHE_CHECK(
142    [struct sockaddr for sa_len],
143    [isc_cv_platform_havesalen],
144    [AC_COMPILE_IFELSE(
145	[AC_LANG_PROGRAM(
146	    [[
147		#include <sys/types.h>
148		#include <sys/socket.h>
149	    ]],
150	    [[
151		extern struct sockaddr *ps;
152		return ps->sa_len;
153	    ]]
154	)],
155	[isc_cv_platform_havesalen=yes],
156	[isc_cv_platform_havesalen=no]
157    )]
158)
159case "$isc_cv_platform_havesalen" in
160 yes)
161    AC_DEFINE([ISC_PLATFORM_HAVESALEN], [1],
162	 [struct sockaddr has sa_len?])
163esac
164
165AC_ARG_ENABLE(
166    [ipv6],
167    [AS_HELP_STRING(
168	[--enable-ipv6],
169	[s use IPv6?]
170    )]
171)
172
173case "$enable_ipv6" in
174 yes|''|autodetect)
175    case "$host" in
176     powerpc-ibm-aix4*)
177	;;
178     *)
179	AC_DEFINE([WANT_IPV6], [1], [configure --enable-ipv6])
180	;;
181    esac
182    ;;
183 no)
184    ;;
185esac
186
187
188dnl [Bug 1984] ntp/libisc fails to compile on OS X 10.7 (Lion)
189case "$host" in
190 *-*-darwin*)
191    AC_DEFINE([__APPLE_USE_RFC_3542], [1], [Are we _special_?])
192esac
193
194
195AC_CACHE_CHECK(
196    [for IPv6 structures],
197    [isc_cv_found_ipv6],
198    [AC_COMPILE_IFELSE(
199	[AC_LANG_PROGRAM(
200	    [[
201		#include <sys/types.h>
202		#include <sys/socket.h>
203		#include <netinet/in.h>
204	    ]],
205	    [[
206		struct sockaddr_in6 sin6;
207	    ]]
208	)],
209	[isc_cv_found_ipv6=yes],
210	[isc_cv_found_ipv6=no]
211    )]
212)
213
214#
215# See whether IPv6 support is provided via a Kame add-on.
216# This is done before other IPv6 linking tests so LIBS is properly set.
217#
218AC_MSG_CHECKING([for Kame IPv6 support])
219AC_ARG_WITH(
220    [kame],
221    [AS_HELP_STRING(
222	[--with-kame],
223	[- =/usr/local/v6]
224    )],
225    [use_kame="$withval"],
226    [use_kame="no"]
227)
228case "$use_kame" in
229 no)
230    ;;
231 yes)
232    kame_path=/usr/local/v6
233    ;;
234 *)
235    kame_path="$use_kame"
236    ;;
237esac
238case "$use_kame" in
239 no)
240    AC_MSG_RESULT([no])
241    ;;
242 *)
243    if test -f $kame_path/lib/libinet6.a; then
244	AC_MSG_RESULT([$kame_path/lib/libinet6.a])
245	LIBS="-L$kame_path/lib -linet6 $LIBS"
246    else
247	AC_MSG_ERROR([$kame_path/lib/libinet6.a not found.
248
249Please choose the proper path with the following command:
250
251    configure --with-kame=PATH
252])
253    fi
254    ;;
255esac
256
257#
258# Whether netinet6/in6.h is needed has to be defined in isc/platform.h.
259# Including it on Kame-using platforms is very bad, though, because
260# Kame uses #error against direct inclusion.   So include it on only
261# the platform that is otherwise broken without it -- BSD/OS 4.0 through 4.1.
262# This is done before the in6_pktinfo check because that's what
263# netinet6/in6.h is needed for.
264#
265case "$host" in
266 *-bsdi4.[[01]]*)
267    AC_DEFINE([ISC_PLATFORM_NEEDNETINET6IN6H], [1],
268	[Do we need netinet6/in6.h?])
269    isc_netinet6in6_hack="#include <netinet6/in6.h>"
270    ;;
271 *)
272    isc_netinet6in6_hack=""
273    ;;
274esac
275
276#
277# This is similar to the netinet6/in6.h issue.
278#
279case "$host" in
280 *-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*)
281    AC_DEFINE([ISC_PLATFORM_FIXIN6ISADDR], [1],
282	[Do we need to fix in6isaddr?])
283    isc_netinetin6_hack="#include <netinet/in6.h>"
284    ;;
285 *)
286    isc_netinetin6_hack=""
287    ;;
288esac
289
290
291case "$isc_cv_found_ipv6" in
292 yes)
293    AC_DEFINE([ISC_PLATFORM_HAVEIPV6], [1], [have IPv6?])
294    AC_CACHE_CHECK(
295	[for in6_pktinfo],
296	[isc_cv_have_in6_pktinfo],
297	[AC_COMPILE_IFELSE(
298	    [AC_LANG_PROGRAM(
299		[[
300		    #include <sys/types.h>
301		    #include <sys/socket.h>
302		    #include <netinet/in.h>
303		    $isc_netinetin6_hack
304		    $isc_netinet6in6_hack
305		]],
306		[[
307		    struct in6_pktinfo xyzzy;
308		]]
309	    )],
310	    [isc_cv_have_in6_pktinfo=yes],
311	    [isc_cv_have_in6_pktinfo=no]
312	)]
313    )
314    case "$isc_cv_have_in6_pktinfo" in
315     yes)
316	AC_DEFINE([ISC_PLATFORM_HAVEIN6PKTINFO], [1],
317		[have struct in6_pktinfo?])
318    esac
319
320
321    # HMS: Use HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID instead?
322    AC_CACHE_CHECK(
323	[for sockaddr_in6.sin6_scope_id],
324	[isc_cv_have_sin6_scope_id],
325	[AC_COMPILE_IFELSE(
326	    [AC_LANG_PROGRAM(
327		[[
328		    #include <sys/types.h>
329		    #include <sys/socket.h>
330		    #include <netinet/in.h>
331		    $isc_netinetin6_hack
332		    $isc_netinet6in6_hack
333		]],
334		[[
335		    struct sockaddr_in6 xyzzy;
336		    xyzzy.sin6_scope_id = 0;
337		]]
338	    )],
339	    [isc_cv_have_sin6_scope_id=yes],
340	    [isc_cv_have_sin6_scope_id=no]
341	)]
342    )
343
344    case "$isc_cv_have_sin6_scope_id" in
345     yes)
346	AC_DEFINE([ISC_PLATFORM_HAVESCOPEID], [1], [sin6_scope_id?])
347    esac
348esac
349
350
351# We need this check run even without isc_cv_found_ipv6=yes
352
353AC_CACHE_CHECK(
354    [for in6addr_any],
355    [isc_cv_in6addr_any_links],
356    [
357	SAVED_LIBS="$LIBS"
358	LIBS="$LDADD_LIBNTP $LIBS"
359	AC_LINK_IFELSE(
360	    [AC_LANG_PROGRAM(
361		AC_INCLUDES_DEFAULT [[
362		    #include <sys/socket.h>
363		    #include <netinet/in.h>
364		    $isc_netinetin6_hack
365		    $isc_netinet6in6_hack
366		]],
367		[[
368		    printf("%x", in6addr_any.s6_addr[15]);
369		]]
370	    )],
371	    [isc_cv_in6addr_any_links=yes],
372	    [isc_cv_in6addr_any_links=no]
373	)
374	LIBS="$SAVED_LIBS"
375	AS_UNSET([SAVED_LIBS])
376    ]
377)
378
379case "$isc_cv_in6addr_any_links" in
380 no)
381    AC_DEFINE([ISC_PLATFORM_NEEDIN6ADDRANY], [1], [missing in6addr_any?])
382esac
383
384
385AC_CACHE_CHECK(
386    [for struct if_laddrconf],
387    [isc_cv_struct_if_laddrconf],
388    [AC_COMPILE_IFELSE(
389	[AC_LANG_PROGRAM(
390	    [[
391		#include <sys/types.h>
392		#include <net/if6.h>
393	    ]],
394	    [[
395		struct if_laddrconf a;
396	    ]]
397	)],
398	[isc_cv_struct_if_laddrconf=yes],
399	[isc_cv_struct_if_laddrconf=no]
400    )]
401)
402
403case "$isc_cv_struct_if_laddrconf" in
404 yes)
405    AC_DEFINE([ISC_PLATFORM_HAVEIF_LADDRCONF], [1],
406	[have struct if_laddrconf?])
407esac
408
409AC_CACHE_CHECK(
410    [for struct if_laddrreq],
411    isc_cv_struct_if_laddrreq,
412    [AC_COMPILE_IFELSE(
413	[AC_LANG_PROGRAM(
414	    [[
415		#include <sys/types.h>
416		#include <net/if6.h>
417	    ]],
418	    [[
419		struct if_laddrreq a;
420	    ]]
421	)],
422	[isc_cv_struct_if_laddrreq=yes],
423	[isc_cv_struct_if_laddrreq=no]
424    )]
425)
426
427case "$isc_cv_struct_if_laddrreq" in
428 yes)
429    AC_DEFINE([ISC_PLATFORM_HAVEIF_LADDRREQ], [1],
430	[have struct if_laddrreq?])
431esac
432
433AC_CACHE_CHECK(
434    [for multicast IP support],
435    [ntp_cv_multicast],
436    [
437	ntp_cv_multicast=no
438	case "$host" in
439	 i386-sequent-sysv4)
440	    ;;
441	 *)
442	    AC_COMPILE_IFELSE(
443		[AC_LANG_PROGRAM(
444		    [[
445			#ifdef HAVE_NETINET_IN_H
446			# include <netinet/in.h>
447			#endif
448		    ]],
449		    [[
450			struct ip_mreq ipmr;
451			ipmr.imr_interface.s_addr = 0;
452		    ]]
453		)],
454		[ntp_cv_multicast=yes],
455		[]
456	    )
457	    ;;
458	esac
459    ]
460)
461case "$ntp_cv_multicast" in
462 yes)
463    AC_DEFINE([MCAST], [1], [Does the target support multicast IP?])
464    AC_CACHE_CHECK(
465	[arg type needed for setsockopt() IP*_MULTICAST_LOOP],
466	[ntp_cv_typeof_ip_multicast_loop],
467	[
468	    case "$host" in
469	     *-*-netbsd*|*-*-*linux*)
470		ntp_cv_typeof_ip_multicast_loop=u_int
471		;;
472	     *)
473		ntp_cv_typeof_ip_multicast_loop=u_char
474		;;
475	    esac
476	]
477    )
478    AC_DEFINE_UNQUOTED([TYPEOF_IP_MULTICAST_LOOP],
479	[$ntp_cv_typeof_ip_multicast_loop],
480	[What type to use for setsockopt])
481esac
482
483AC_ARG_ENABLE(
484    [getifaddrs],
485    [AS_HELP_STRING(
486	[--enable-getifaddrs],
487	[+ Enable the use of getifaddrs() [[yes|no]].]
488    )],
489    [want_getifaddrs="$enableval"],
490    [want_getifaddrs="yes"]
491)
492
493case $want_getifaddrs in
494 glibc)
495    AC_MSG_WARN([--enable-getifaddrs=glibc is no longer required])
496esac
497case $want_getifaddrs in
498 no)
499    ;;
500 *)
501    SAVED_LIBS="$LIBS"
502    LIBS="$LDADD_LIBNTP $LIBS"
503    AC_CHECK_FUNCS([getifaddrs])
504    LIBS="$SAVED_LIBS"
505    AS_UNSET([SAVED_LIBS])
506    ;;
507esac
508
509#
510# Check for if_nametoindex() for IPv6 scoped addresses support
511#
512case "$host" in
513 *-hp-hpux*)
514    AC_SEARCH_LIBS([if_nametoindex], [ipv6])
515esac
516SAVED_LIBS="$LIBS"
517LIBS="$LDADD_LIBNTP $LIBS"
518AC_CHECK_FUNCS([if_nametoindex])
519LIBS="$SAVED_LIBS"
520AS_UNSET([SAVED_LIBS])
521case "$ac_cv_func_if_nametoindex" in
522 yes)
523	AC_DEFINE([ISC_PLATFORM_HAVEIFNAMETOINDEX], [1],
524	    [ISC: do we have if_nametoindex()?])
525esac
526
527])dnl
528dnl ======================================================================
529