1275970Scydnl ######################################################################
2275970Scydnl Common IPv6 detection for NTP configure.ac files
3275970ScyAC_DEFUN([NTP_IPV6], [
4275970Scy
5275970ScyAC_CACHE_CHECK(
6275970Scy    [for struct sockaddr_storage],
7275970Scy    [ntp_cv_sockaddr_storage],
8275970Scy    [AC_COMPILE_IFELSE(
9275970Scy	[AC_LANG_PROGRAM(
10275970Scy	    [[
11275970Scy		#ifdef HAVE_SYS_TYPES_H
12275970Scy		# include <sys/types.h>
13275970Scy		#endif
14275970Scy		#ifdef HAVE_SYS_SOCKET_H
15275970Scy		# include <sys/socket.h>
16275970Scy		#endif
17275970Scy		#ifdef HAVE_NETINET_IN_H
18275970Scy		# include <netinet/in.h>
19275970Scy		#endif
20275970Scy	    ]],
21275970Scy	    [[
22275970Scy		struct sockaddr_storage n;
23275970Scy	    ]]
24275970Scy	)],
25275970Scy	[ntp_cv_sockaddr_storage=yes],
26275970Scy	[ntp_cv_sockaddr_storage=no]
27275970Scy    )]
28275970Scy)
29275970Scycase "$ntp_cv_sockaddr_storage" in
30275970Scy yes)
31275970Scy    AC_DEFINE([HAVE_STRUCT_SOCKADDR_STORAGE], [1],
32275970Scy	[Does a system header define struct sockaddr_storage?])
33275970Scy    AC_CACHE_CHECK(
34275970Scy	[for sockaddr_storage.__ss_family],
35275970Scy	[ntp_cv_have___ss_family],
36275970Scy	[AC_COMPILE_IFELSE(
37275970Scy	    [AC_LANG_PROGRAM(
38275970Scy		[[
39275970Scy		    #ifdef HAVE_SYS_TYPES_H
40275970Scy		    # include <sys/types.h>
41275970Scy		    #endif
42275970Scy		    #ifdef HAVE_SYS_SOCKET_H
43275970Scy		    # include <sys/socket.h>
44275970Scy		    #endif
45275970Scy		    #ifdef HAVE_NETINET_IN_H
46275970Scy		    # include <netinet/in.h>
47275970Scy		    #endif
48275970Scy		]],
49275970Scy		[[
50275970Scy		    struct sockaddr_storage s;
51275970Scy		    s.__ss_family = 1;
52275970Scy		]]
53275970Scy	    )],
54275970Scy	    [ntp_cv_have___ss_family=yes],
55275970Scy	    [ntp_cv_have___ss_family=no]
56275970Scy	)]
57275970Scy    )
58275970Scy    case "$ntp_cv_have___ss_family" in
59275970Scy     yes)
60275970Scy	AC_DEFINE([HAVE___SS_FAMILY_IN_SS], [1],
61275970Scy		  [Does struct sockaddr_storage have __ss_family?])
62275970Scy    esac
63275970Scy    AH_VERBATIM(
64275970Scy	[HAVE___SS_FAMILY_IN_SS_VERBATIM],
65275970Scy	[
66275970Scy	    /* Handle sockaddr_storage.__ss_family */
67275970Scy	    #ifdef HAVE___SS_FAMILY_IN_SS
68275970Scy	    # define ss_family __ss_family
69275970Scy	    #endif /* HAVE___SS_FAMILY_IN_SS */
70275970Scy	]
71275970Scy    )
72275970Scyesac
73275970Scy
74275970Scy
75275970Scy#
76275970Scy# Look for in_port_t.
77275970Scy#
78275970ScyAC_CACHE_CHECK(
79275970Scy    [for in_port_t],
80275970Scy    [isc_cv_have_in_port_t],
81275970Scy    [AC_COMPILE_IFELSE(
82275970Scy	[AC_LANG_PROGRAM(
83275970Scy	    [[
84275970Scy		#include <sys/types.h>
85275970Scy		#include <netinet/in.h>
86275970Scy	    ]],
87275970Scy	    [[
88275970Scy		in_port_t port = 25; 
89275970Scy		return (0);
90275970Scy	    ]]
91275970Scy	)],
92275970Scy	[isc_cv_have_in_port_t=yes],
93275970Scy	[isc_cv_have_in_port_t=no]
94275970Scy    )]
95275970Scy)
96275970Scycase "$isc_cv_have_in_port_t" in
97275970Scy no)
98275970Scy	AC_DEFINE([ISC_PLATFORM_NEEDPORTT], [1],
99275970Scy	    [Declare in_port_t?])
100275970Scyesac
101275970Scy
102275970ScyAC_CACHE_CHECK(
103275970Scy    [type of socklen arg for getsockname()],
104275970Scy    [ntp_cv_getsockname_socklen_type],
105275970Scy    [
106275970Scy    getsockname_socklen_type_found=no
107275970Scy    for getsockname_arg2 in 'struct sockaddr *' 'void *'; do
108275970Scy	for ntp_cv_getsockname_socklen_type in 'socklen_t' 'size_t' 'unsigned int' 'int'; do
109275970Scy	    AC_COMPILE_IFELSE(
110275970Scy		[AC_LANG_PROGRAM(
111275970Scy		    [[
112275970Scy			#ifdef HAVE_SYS_TYPES_H
113275970Scy			# include <sys/types.h>
114275970Scy			#endif
115275970Scy			#ifdef HAVE_SYS_SOCKET_H
116275970Scy			# include <sys/socket.h>
117275970Scy			#endif
118275970Scy		    ]], [[
119275970Scy			extern
120275970Scy			getsockname(int, $getsockname_arg2, 
121275970Scy				$ntp_cv_getsockname_socklen_type *);
122275970Scy		    ]]
123275970Scy		)],
124275970Scy		[getsockname_socklen_type_found=yes ; break 2],
125275970Scy		[]
126275970Scy	    )
127275970Scy	done
128275970Scy    done
129275970Scy    case "$getsockname_socklen_type_found" in
130275970Scy     no)
131275970Scy	ntp_cv_getsockname_socklen_type='socklen_t'
132275970Scy    esac
133275970Scy    AS_UNSET([getsockname_arg2])
134275970Scy    AS_UNSET([getsockname_socklen_type_found])
135275970Scy    ]
136275970Scy)
137275970ScyAC_DEFINE_UNQUOTED([GETSOCKNAME_SOCKLEN_TYPE],
138275970Scy		   [$ntp_cv_getsockname_socklen_type],
139275970Scy		   [What is getsockname()'s socklen type?])
140275970Scy
141275970ScyAC_CACHE_CHECK(
142275970Scy    [struct sockaddr for sa_len],
143275970Scy    [isc_cv_platform_havesalen],
144275970Scy    [AC_COMPILE_IFELSE(
145275970Scy	[AC_LANG_PROGRAM(
146275970Scy	    [[
147275970Scy		#include <sys/types.h>
148275970Scy		#include <sys/socket.h>
149275970Scy	    ]],
150275970Scy	    [[
151275970Scy		extern struct sockaddr *ps;
152275970Scy		return ps->sa_len;
153275970Scy	    ]]
154275970Scy	)],
155275970Scy	[isc_cv_platform_havesalen=yes],
156275970Scy	[isc_cv_platform_havesalen=no]
157275970Scy    )]
158275970Scy)
159275970Scycase "$isc_cv_platform_havesalen" in
160275970Scy yes)
161275970Scy    AC_DEFINE([ISC_PLATFORM_HAVESALEN], [1],
162275970Scy	 [struct sockaddr has sa_len?])
163275970Scyesac
164275970Scy
165275970ScyAC_ARG_ENABLE(
166275970Scy    [ipv6],
167275970Scy    [AS_HELP_STRING(
168275970Scy	[--enable-ipv6],
169275970Scy	[s use IPv6?]
170275970Scy    )]
171275970Scy)
172275970Scy
173275970Scycase "$enable_ipv6" in
174275970Scy yes|''|autodetect)
175275970Scy    case "$host" in
176275970Scy     powerpc-ibm-aix4*)
177275970Scy	;;
178275970Scy     *)
179275970Scy	AC_DEFINE([WANT_IPV6], [1], [configure --enable-ipv6])
180275970Scy	;;
181275970Scy    esac
182275970Scy    ;;
183275970Scy no)
184275970Scy    ;;
185275970Scyesac
186275970Scy
187275970Scy
188275970Scydnl [Bug 1984] ntp/libisc fails to compile on OS X 10.7 (Lion)
189275970Scycase "$host" in
190275970Scy *-*-darwin*)
191275970Scy    AC_DEFINE([__APPLE_USE_RFC_3542], [1], [Are we _special_?])
192275970Scyesac
193275970Scy
194275970Scy
195275970ScyAC_CACHE_CHECK(
196275970Scy    [for IPv6 structures],
197275970Scy    [isc_cv_found_ipv6],
198275970Scy    [AC_COMPILE_IFELSE(
199275970Scy	[AC_LANG_PROGRAM(
200275970Scy	    [[
201275970Scy		#include <sys/types.h>
202275970Scy		#include <sys/socket.h>
203275970Scy		#include <netinet/in.h>
204275970Scy	    ]],
205275970Scy	    [[
206275970Scy		struct sockaddr_in6 sin6;
207275970Scy	    ]]
208275970Scy	)],
209275970Scy	[isc_cv_found_ipv6=yes],
210275970Scy	[isc_cv_found_ipv6=no]
211275970Scy    )]
212275970Scy)
213275970Scy
214275970Scy#
215275970Scy# See whether IPv6 support is provided via a Kame add-on.
216275970Scy# This is done before other IPv6 linking tests so LIBS is properly set.
217275970Scy#
218275970ScyAC_MSG_CHECKING([for Kame IPv6 support])
219275970ScyAC_ARG_WITH(
220275970Scy    [kame],
221275970Scy    [AS_HELP_STRING(
222275970Scy	[--with-kame],
223275970Scy	[- =/usr/local/v6]
224275970Scy    )],
225275970Scy    [use_kame="$withval"],
226275970Scy    [use_kame="no"]
227275970Scy)
228275970Scycase "$use_kame" in
229275970Scy no)
230275970Scy    ;;
231275970Scy yes)
232275970Scy    kame_path=/usr/local/v6
233275970Scy    ;;
234275970Scy *)
235275970Scy    kame_path="$use_kame"
236275970Scy    ;;
237275970Scyesac
238275970Scycase "$use_kame" in
239275970Scy no)
240275970Scy    AC_MSG_RESULT([no])
241275970Scy    ;;
242275970Scy *)
243275970Scy    if test -f $kame_path/lib/libinet6.a; then
244275970Scy	AC_MSG_RESULT([$kame_path/lib/libinet6.a])
245275970Scy	LIBS="-L$kame_path/lib -linet6 $LIBS"
246275970Scy    else
247275970Scy	AC_MSG_ERROR([$kame_path/lib/libinet6.a not found.
248275970Scy
249275970ScyPlease choose the proper path with the following command:
250275970Scy
251275970Scy    configure --with-kame=PATH
252275970Scy])
253275970Scy    fi
254275970Scy    ;;
255275970Scyesac
256275970Scy
257275970Scy#
258275970Scy# Whether netinet6/in6.h is needed has to be defined in isc/platform.h.
259275970Scy# Including it on Kame-using platforms is very bad, though, because
260275970Scy# Kame uses #error against direct inclusion.   So include it on only
261275970Scy# the platform that is otherwise broken without it -- BSD/OS 4.0 through 4.1.
262275970Scy# This is done before the in6_pktinfo check because that's what
263275970Scy# netinet6/in6.h is needed for.
264275970Scy#
265275970Scycase "$host" in
266275970Scy *-bsdi4.[[01]]*)
267275970Scy    AC_DEFINE([ISC_PLATFORM_NEEDNETINET6IN6H], [1],
268275970Scy	[Do we need netinet6/in6.h?])
269275970Scy    isc_netinet6in6_hack="#include <netinet6/in6.h>"
270275970Scy    ;;
271275970Scy *)
272275970Scy    isc_netinet6in6_hack=""
273275970Scy    ;;
274275970Scyesac
275275970Scy
276275970Scy#
277275970Scy# This is similar to the netinet6/in6.h issue.
278275970Scy#
279275970Scycase "$host" in
280275970Scy *-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*)
281275970Scy    AC_DEFINE([ISC_PLATFORM_FIXIN6ISADDR], [1],
282275970Scy	[Do we need to fix in6isaddr?])
283275970Scy    isc_netinetin6_hack="#include <netinet/in6.h>"
284275970Scy    ;;
285275970Scy *)
286275970Scy    isc_netinetin6_hack=""
287275970Scy    ;;
288275970Scyesac
289275970Scy
290275970Scy
291275970Scycase "$isc_cv_found_ipv6" in
292275970Scy yes)
293275970Scy    AC_DEFINE([ISC_PLATFORM_HAVEIPV6], [1], [have IPv6?])
294275970Scy    AC_CACHE_CHECK(
295275970Scy	[for in6_pktinfo],
296275970Scy	[isc_cv_have_in6_pktinfo],
297275970Scy	[AC_COMPILE_IFELSE(
298275970Scy	    [AC_LANG_PROGRAM(
299275970Scy		[[
300275970Scy		    #include <sys/types.h>
301275970Scy		    #include <sys/socket.h>
302275970Scy		    #include <netinet/in.h>
303275970Scy		    $isc_netinetin6_hack
304275970Scy		    $isc_netinet6in6_hack
305275970Scy		]],
306275970Scy		[[
307275970Scy		    struct in6_pktinfo xyzzy;
308275970Scy		]]
309275970Scy	    )],
310275970Scy	    [isc_cv_have_in6_pktinfo=yes],
311275970Scy	    [isc_cv_have_in6_pktinfo=no]
312275970Scy	)]
313275970Scy    )
314275970Scy    case "$isc_cv_have_in6_pktinfo" in
315275970Scy     yes)
316275970Scy	AC_DEFINE([ISC_PLATFORM_HAVEIN6PKTINFO], [1],
317275970Scy		[have struct in6_pktinfo?])
318275970Scy    esac
319275970Scy
320275970Scy
321275970Scy    # HMS: Use HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID instead?
322275970Scy    AC_CACHE_CHECK(
323275970Scy	[for sockaddr_in6.sin6_scope_id],
324275970Scy	[isc_cv_have_sin6_scope_id],
325275970Scy	[AC_COMPILE_IFELSE(
326275970Scy	    [AC_LANG_PROGRAM(
327275970Scy		[[
328275970Scy		    #include <sys/types.h>
329275970Scy		    #include <sys/socket.h>
330275970Scy		    #include <netinet/in.h>
331275970Scy		    $isc_netinetin6_hack
332275970Scy		    $isc_netinet6in6_hack
333275970Scy		]],
334275970Scy		[[
335275970Scy		    struct sockaddr_in6 xyzzy;
336275970Scy		    xyzzy.sin6_scope_id = 0;
337275970Scy		]]
338275970Scy	    )],
339275970Scy	    [isc_cv_have_sin6_scope_id=yes],
340275970Scy	    [isc_cv_have_sin6_scope_id=no]
341275970Scy	)]
342275970Scy    )
343275970Scy
344275970Scy    case "$isc_cv_have_sin6_scope_id" in
345275970Scy     yes)
346275970Scy	AC_DEFINE([ISC_PLATFORM_HAVESCOPEID], [1], [sin6_scope_id?])
347275970Scy    esac
348275970Scyesac
349275970Scy
350275970Scy
351275970Scy# We need this check run even without isc_cv_found_ipv6=yes
352275970Scy
353275970ScyAC_CACHE_CHECK(
354275970Scy    [for in6addr_any],
355275970Scy    [isc_cv_in6addr_any_links],
356275970Scy    [
357275970Scy	SAVED_LIBS="$LIBS"
358275970Scy	LIBS="$LDADD_LIBNTP $LIBS"
359275970Scy	AC_LINK_IFELSE(
360275970Scy	    [AC_LANG_PROGRAM(
361275970Scy		AC_INCLUDES_DEFAULT [[
362275970Scy		    #include <sys/socket.h>
363275970Scy		    #include <netinet/in.h>
364275970Scy		    $isc_netinetin6_hack
365275970Scy		    $isc_netinet6in6_hack
366275970Scy		]],
367275970Scy		[[
368275970Scy		    printf("%x", in6addr_any.s6_addr[15]);
369275970Scy		]]
370275970Scy	    )],
371275970Scy	    [isc_cv_in6addr_any_links=yes],
372275970Scy	    [isc_cv_in6addr_any_links=no]
373275970Scy	)
374275970Scy	LIBS="$SAVED_LIBS"
375275970Scy	AS_UNSET([SAVED_LIBS])
376275970Scy    ]
377275970Scy)
378275970Scy
379275970Scycase "$isc_cv_in6addr_any_links" in
380275970Scy no)
381275970Scy    AC_DEFINE([ISC_PLATFORM_NEEDIN6ADDRANY], [1], [missing in6addr_any?])
382275970Scyesac
383275970Scy
384275970Scy
385275970ScyAC_CACHE_CHECK(
386275970Scy    [for struct if_laddrconf],
387275970Scy    [isc_cv_struct_if_laddrconf],
388275970Scy    [AC_COMPILE_IFELSE(
389275970Scy	[AC_LANG_PROGRAM(
390275970Scy	    [[
391275970Scy		#include <sys/types.h>
392275970Scy		#include <net/if6.h>
393275970Scy	    ]],
394275970Scy	    [[
395275970Scy		struct if_laddrconf a;
396275970Scy	    ]]
397275970Scy	)],
398275970Scy	[isc_cv_struct_if_laddrconf=yes],
399275970Scy	[isc_cv_struct_if_laddrconf=no]
400275970Scy    )]
401275970Scy)
402275970Scy
403275970Scycase "$isc_cv_struct_if_laddrconf" in
404275970Scy yes)
405275970Scy    AC_DEFINE([ISC_PLATFORM_HAVEIF_LADDRCONF], [1],
406275970Scy	[have struct if_laddrconf?])
407275970Scyesac
408275970Scy
409275970ScyAC_CACHE_CHECK(
410275970Scy    [for struct if_laddrreq],
411275970Scy    isc_cv_struct_if_laddrreq,
412275970Scy    [AC_COMPILE_IFELSE(
413275970Scy	[AC_LANG_PROGRAM(
414275970Scy	    [[
415275970Scy		#include <sys/types.h>
416275970Scy		#include <net/if6.h>
417275970Scy	    ]],
418275970Scy	    [[
419275970Scy		struct if_laddrreq a;
420275970Scy	    ]]
421275970Scy	)],
422275970Scy	[isc_cv_struct_if_laddrreq=yes],
423275970Scy	[isc_cv_struct_if_laddrreq=no]
424275970Scy    )]
425275970Scy)
426275970Scy
427275970Scycase "$isc_cv_struct_if_laddrreq" in
428275970Scy yes)
429275970Scy    AC_DEFINE([ISC_PLATFORM_HAVEIF_LADDRREQ], [1],
430275970Scy	[have struct if_laddrreq?])
431275970Scyesac
432275970Scy
433275970ScyAC_CACHE_CHECK(
434275970Scy    [for multicast IP support],
435275970Scy    [ntp_cv_multicast],
436275970Scy    [
437275970Scy	ntp_cv_multicast=no
438275970Scy	case "$host" in
439275970Scy	 i386-sequent-sysv4)
440275970Scy	    ;;
441275970Scy	 *)
442275970Scy	    AC_COMPILE_IFELSE(
443275970Scy		[AC_LANG_PROGRAM(
444275970Scy		    [[
445275970Scy			#ifdef HAVE_NETINET_IN_H
446275970Scy			# include <netinet/in.h>
447275970Scy			#endif
448275970Scy		    ]],
449275970Scy		    [[
450275970Scy			struct ip_mreq ipmr;
451275970Scy			ipmr.imr_interface.s_addr = 0;
452275970Scy		    ]]
453275970Scy		)],
454275970Scy		[ntp_cv_multicast=yes],
455275970Scy		[]
456275970Scy	    )
457275970Scy	    ;;
458275970Scy	esac
459275970Scy    ]
460275970Scy)
461275970Scycase "$ntp_cv_multicast" in
462275970Scy yes)
463275970Scy    AC_DEFINE([MCAST], [1], [Does the target support multicast IP?])
464275970Scy    AC_CACHE_CHECK(
465275970Scy	[arg type needed for setsockopt() IP*_MULTICAST_LOOP],
466275970Scy	[ntp_cv_typeof_ip_multicast_loop],
467275970Scy	[
468275970Scy	    case "$host" in
469275970Scy	     *-*-netbsd*|*-*-*linux*)
470275970Scy		ntp_cv_typeof_ip_multicast_loop=u_int
471275970Scy		;;
472275970Scy	     *)
473275970Scy		ntp_cv_typeof_ip_multicast_loop=u_char
474275970Scy		;;
475275970Scy	    esac
476275970Scy	]
477275970Scy    )
478275970Scy    AC_DEFINE_UNQUOTED([TYPEOF_IP_MULTICAST_LOOP],
479275970Scy	[$ntp_cv_typeof_ip_multicast_loop],
480275970Scy	[What type to use for setsockopt])
481275970Scyesac
482275970Scy
483275970ScyAC_ARG_ENABLE(
484275970Scy    [getifaddrs],
485275970Scy    [AS_HELP_STRING(
486275970Scy	[--enable-getifaddrs],
487275970Scy	[+ Enable the use of getifaddrs() [[yes|no]].]
488275970Scy    )],
489275970Scy    [want_getifaddrs="$enableval"],
490275970Scy    [want_getifaddrs="yes"]
491275970Scy)
492275970Scy
493275970Scycase $want_getifaddrs in
494275970Scy glibc)
495275970Scy    AC_MSG_WARN([--enable-getifaddrs=glibc is no longer required])
496275970Scyesac
497275970Scycase $want_getifaddrs in
498275970Scy no)
499275970Scy    ;;
500275970Scy *)
501275970Scy    SAVED_LIBS="$LIBS"
502275970Scy    LIBS="$LDADD_LIBNTP $LIBS"
503275970Scy    AC_CHECK_FUNCS([getifaddrs])
504275970Scy    LIBS="$SAVED_LIBS"
505275970Scy    AS_UNSET([SAVED_LIBS])
506275970Scy    ;;
507275970Scyesac
508275970Scy
509275970Scy#
510275970Scy# Check for if_nametoindex() for IPv6 scoped addresses support
511275970Scy#
512275970Scycase "$host" in
513275970Scy *-hp-hpux*)
514275970Scy    AC_SEARCH_LIBS([if_nametoindex], [ipv6])
515275970Scyesac
516275970ScySAVED_LIBS="$LIBS"
517275970ScyLIBS="$LDADD_LIBNTP $LIBS"
518275970ScyAC_CHECK_FUNCS([if_nametoindex])
519275970ScyLIBS="$SAVED_LIBS"
520275970ScyAS_UNSET([SAVED_LIBS])
521275970Scycase "$ac_cv_func_if_nametoindex" in
522275970Scy yes)
523275970Scy	AC_DEFINE([ISC_PLATFORM_HAVEIFNAMETOINDEX], [1],
524275970Scy	    [ISC: do we have if_nametoindex()?])
525275970Scyesac
526275970Scy
527275970Scy])dnl
528275970Scydnl ======================================================================
529