19c2daa00SOllivier Robert /* 29c2daa00SOllivier Robert * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 39c2daa00SOllivier Robert * All rights reserved. 49c2daa00SOllivier Robert * 59c2daa00SOllivier Robert * Redistribution and use in source and binary forms, with or without 69c2daa00SOllivier Robert * modification, are permitted provided that the following conditions 79c2daa00SOllivier Robert * are met: 89c2daa00SOllivier Robert * 1. Redistributions of source code must retain the above copyright 99c2daa00SOllivier Robert * notice, this list of conditions and the following disclaimer. 109c2daa00SOllivier Robert * 2. Redistributions in binary form must reproduce the above copyright 119c2daa00SOllivier Robert * notice, this list of conditions and the following disclaimer in the 129c2daa00SOllivier Robert * documentation and/or other materials provided with the distribution. 139c2daa00SOllivier Robert * 3. Neither the name of the project nor the names of its contributors 149c2daa00SOllivier Robert * may be used to endorse or promote products derived from this software 159c2daa00SOllivier Robert * without specific prior written permission. 169c2daa00SOllivier Robert * 179c2daa00SOllivier Robert * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 189c2daa00SOllivier Robert * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 199c2daa00SOllivier Robert * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 209c2daa00SOllivier Robert * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 219c2daa00SOllivier Robert * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 229c2daa00SOllivier Robert * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 239c2daa00SOllivier Robert * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 249c2daa00SOllivier Robert * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 259c2daa00SOllivier Robert * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 269c2daa00SOllivier Robert * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 279c2daa00SOllivier Robert * SUCH DAMAGE. 289c2daa00SOllivier Robert */ 299c2daa00SOllivier Robert 309c2daa00SOllivier Robert /* 319c2daa00SOllivier Robert * Copyright (c) 1982, 1986, 1990, 1993 329c2daa00SOllivier Robert * The Regents of the University of California. All rights reserved. 339c2daa00SOllivier Robert * 349c2daa00SOllivier Robert * Redistribution and use in source and binary forms, with or without 359c2daa00SOllivier Robert * modification, are permitted provided that the following conditions 369c2daa00SOllivier Robert * are met: 379c2daa00SOllivier Robert * 1. Redistributions of source code must retain the above copyright 389c2daa00SOllivier Robert * notice, this list of conditions and the following disclaimer. 399c2daa00SOllivier Robert * 2. Redistributions in binary form must reproduce the above copyright 409c2daa00SOllivier Robert * notice, this list of conditions and the following disclaimer in the 419c2daa00SOllivier Robert * documentation and/or other materials provided with the distribution. 429c2daa00SOllivier Robert * 3. All advertising materials mentioning features or use of this software 439c2daa00SOllivier Robert * must display the following acknowledgement: 449c2daa00SOllivier Robert * This product includes software developed by the University of 459c2daa00SOllivier Robert * California, Berkeley and its contributors. 469c2daa00SOllivier Robert * 4. Neither the name of the University nor the names of its contributors 479c2daa00SOllivier Robert * may be used to endorse or promote products derived from this software 489c2daa00SOllivier Robert * without specific prior written permission. 499c2daa00SOllivier Robert * 509c2daa00SOllivier Robert * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 519c2daa00SOllivier Robert * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 529c2daa00SOllivier Robert * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 539c2daa00SOllivier Robert * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 549c2daa00SOllivier Robert * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 559c2daa00SOllivier Robert * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 569c2daa00SOllivier Robert * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 579c2daa00SOllivier Robert * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 589c2daa00SOllivier Robert * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 599c2daa00SOllivier Robert * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 609c2daa00SOllivier Robert * SUCH DAMAGE. 619c2daa00SOllivier Robert * 629c2daa00SOllivier Robert * @(#)in.h 8.3 (Berkeley) 1/3/94 639c2daa00SOllivier Robert */ 649c2daa00SOllivier Robert 659c2daa00SOllivier Robert /* 669c2daa00SOllivier Robert * Compatability shims with the rfc2553 API to simplify ntp. 679c2daa00SOllivier Robert */ 68*2b15cb3dSCy Schubert #ifndef NTP_RFC2553_H 69*2b15cb3dSCy Schubert #define NTP_RFC2553_H 709c2daa00SOllivier Robert 71ea906c41SOllivier Robert #include <netdb.h> 72*2b15cb3dSCy Schubert #include <isc/net.h> 73ea906c41SOllivier Robert 749c2daa00SOllivier Robert #include "ntp_types.h" 75*2b15cb3dSCy Schubert #include "ntp_malloc.h" 769c2daa00SOllivier Robert 77*2b15cb3dSCy Schubert struct addrinfo *copy_addrinfo_impl(const struct addrinfo * 78*2b15cb3dSCy Schubert #ifdef EREALLOC_CALLSITE /* from ntp_malloc.h */ 79*2b15cb3dSCy Schubert , 80*2b15cb3dSCy Schubert const char *, int 81*2b15cb3dSCy Schubert #endif 82*2b15cb3dSCy Schubert ); 83*2b15cb3dSCy Schubert struct addrinfo *copy_addrinfo_list_impl(const struct addrinfo * 84*2b15cb3dSCy Schubert #ifdef EREALLOC_CALLSITE /* from ntp_malloc.h */ 85*2b15cb3dSCy Schubert , 86*2b15cb3dSCy Schubert const char *, int 87*2b15cb3dSCy Schubert #endif 88*2b15cb3dSCy Schubert ); 89*2b15cb3dSCy Schubert #ifdef EREALLOC_CALLSITE 90*2b15cb3dSCy Schubert # define copy_addrinfo(l) \ 91*2b15cb3dSCy Schubert copy_addrinfo_impl((l), __FILE__, __LINE__) 92*2b15cb3dSCy Schubert # define copy_addrinfo_list(l) \ 93*2b15cb3dSCy Schubert copy_addrinfo_list_impl((l), __FILE__, __LINE__) 94*2b15cb3dSCy Schubert #else 95*2b15cb3dSCy Schubert # define copy_addrinfo(l) copy_addrinfo_impl(l) 96*2b15cb3dSCy Schubert # define copy_addrinfo_list(l) copy_addrinfo_list_impl(l) 97*2b15cb3dSCy Schubert #endif 989c2daa00SOllivier Robert 99ea906c41SOllivier Robert /* 100ea906c41SOllivier Robert * If various macros are not defined we need to define them 101ea906c41SOllivier Robert */ 1029c2daa00SOllivier Robert 103ea906c41SOllivier Robert #ifndef AF_INET6 104ea906c41SOllivier Robert # define AF_INET6 AF_MAX 105ea906c41SOllivier Robert # define PF_INET6 AF_INET6 106ea906c41SOllivier Robert #endif 107ea906c41SOllivier Robert 108ea906c41SOllivier Robert #if !defined(_SS_MAXSIZE) && !defined(_SS_ALIGNSIZE) 109ea906c41SOllivier Robert 110ea906c41SOllivier Robert # define _SS_MAXSIZE 128 111ea906c41SOllivier Robert # define _SS_ALIGNSIZE (sizeof(ntp_uint64_t)) 112*2b15cb3dSCy Schubert # ifdef ISC_PLATFORM_HAVESALEN 113ea906c41SOllivier Robert # define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof(u_char) - sizeof(ntp_u_int8_t)) 114ea906c41SOllivier Robert # define _SS_PAD2SIZE (_SS_MAXSIZE - sizeof(u_char) - sizeof(ntp_u_int8_t) - \ 115ea906c41SOllivier Robert _SS_PAD1SIZE - _SS_ALIGNSIZE) 116ea906c41SOllivier Robert # else 117ea906c41SOllivier Robert # define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof(short)) 118ea906c41SOllivier Robert # define _SS_PAD2SIZE (_SS_MAXSIZE - sizeof(short) - \ 119ea906c41SOllivier Robert _SS_PAD1SIZE - _SS_ALIGNSIZE) 120*2b15cb3dSCy Schubert # endif /* ISC_PLATFORM_HAVESALEN */ 121*2b15cb3dSCy Schubert #endif 122*2b15cb3dSCy Schubert 123*2b15cb3dSCy Schubert #ifndef INET6_ADDRSTRLEN 124*2b15cb3dSCy Schubert # define INET6_ADDRSTRLEN 46 /* max len of IPv6 addr in ascii */ 1259c2daa00SOllivier Robert #endif 1269c2daa00SOllivier Robert 1279c2daa00SOllivier Robert /* 128ea906c41SOllivier Robert * If we don't have the sockaddr_storage structure 129ea906c41SOllivier Robert * we need to define it 130ea906c41SOllivier Robert */ 131ea906c41SOllivier Robert 132ea906c41SOllivier Robert #ifndef HAVE_STRUCT_SOCKADDR_STORAGE 133ea906c41SOllivier Robert struct sockaddr_storage { 134*2b15cb3dSCy Schubert #ifdef ISC_PLATFORM_HAVESALEN 135ea906c41SOllivier Robert ntp_u_int8_t ss_len; /* address length */ 136ea906c41SOllivier Robert ntp_u_int8_t ss_family; /* address family */ 137ea906c41SOllivier Robert #else 138ea906c41SOllivier Robert short ss_family; /* address family */ 139ea906c41SOllivier Robert #endif 140ea906c41SOllivier Robert char __ss_pad1[_SS_PAD1SIZE]; 141ea906c41SOllivier Robert ntp_uint64_t __ss_align; /* force desired structure storage alignment */ 142ea906c41SOllivier Robert char __ss_pad2[_SS_PAD2SIZE]; 143ea906c41SOllivier Robert }; 144ea906c41SOllivier Robert #endif 145ea906c41SOllivier Robert 146ea906c41SOllivier Robert /* 147ea906c41SOllivier Robert * Finally if the platform doesn't support IPv6 we need some 148ea906c41SOllivier Robert * additional definitions 149ea906c41SOllivier Robert */ 150ea906c41SOllivier Robert 151ea906c41SOllivier Robert /* 152ea906c41SOllivier Robert * Flag values for getaddrinfo() 153ea906c41SOllivier Robert */ 154*2b15cb3dSCy Schubert #ifndef AI_PASSIVE 155ea906c41SOllivier Robert #define AI_PASSIVE 0x00000001 /* get address to use bind() */ 156ea906c41SOllivier Robert #define AI_CANONNAME 0x00000002 /* fill ai_canonname */ 157ea906c41SOllivier Robert #define AI_NUMERICHOST 0x00000004 /* prevent name resolution */ 158ea906c41SOllivier Robert /* valid flags for addrinfo */ 159ea906c41SOllivier Robert #define AI_MASK \ 160ea906c41SOllivier Robert (AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST | AI_ADDRCONFIG) 161ea906c41SOllivier Robert 162ea906c41SOllivier Robert #define AI_ADDRCONFIG 0x00000400 /* only if any address is assigned */ 163*2b15cb3dSCy Schubert #endif /* !AI_PASSIVE */ 164*2b15cb3dSCy Schubert 165*2b15cb3dSCy Schubert #ifndef AI_NUMERICHOST /* such as AIX 4.3 */ 166*2b15cb3dSCy Schubert # define Z_AI_NUMERICHOST 0 167*2b15cb3dSCy Schubert #else 168*2b15cb3dSCy Schubert # define Z_AI_NUMERICHOST AI_NUMERICHOST 169*2b15cb3dSCy Schubert #endif 170*2b15cb3dSCy Schubert 171*2b15cb3dSCy Schubert #ifndef AI_NUMERICSERV /* not in RFC 2553 */ 172*2b15cb3dSCy Schubert # define Z_AI_NUMERICSERV 0 173*2b15cb3dSCy Schubert #else 174*2b15cb3dSCy Schubert # define Z_AI_NUMERICSERV AI_NUMERICSERV 175ea906c41SOllivier Robert #endif 176ea906c41SOllivier Robert 177ea906c41SOllivier Robert #ifndef ISC_PLATFORM_HAVEIPV6 1789c2daa00SOllivier Robert 179ea906c41SOllivier Robert #ifdef SYS_WINNT 180ea906c41SOllivier Robert # define in6_addr in_addr6 181ea906c41SOllivier Robert #endif 1829c2daa00SOllivier Robert 1839c2daa00SOllivier Robert struct addrinfo { 1849c2daa00SOllivier Robert int ai_flags; /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */ 1859c2daa00SOllivier Robert int ai_family; /* PF_xxx */ 1869c2daa00SOllivier Robert int ai_socktype; /* SOCK_xxx */ 1879c2daa00SOllivier Robert int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */ 1889c2daa00SOllivier Robert size_t ai_addrlen; /* length of ai_addr */ 1899c2daa00SOllivier Robert char *ai_canonname; /* canonical name for hostname */ 1909c2daa00SOllivier Robert struct sockaddr *ai_addr; /* binary address */ 1919c2daa00SOllivier Robert struct addrinfo *ai_next; /* next structure in linked list */ 1929c2daa00SOllivier Robert }; 1939c2daa00SOllivier Robert 1949c2daa00SOllivier Robert /* 1959c2daa00SOllivier Robert * Error return codes from getaddrinfo() 1969c2daa00SOllivier Robert */ 1979c2daa00SOllivier Robert #define EAI_ADDRFAMILY 1 /* address family for hostname not supported */ 1989c2daa00SOllivier Robert #define EAI_AGAIN 2 /* temporary failure in name resolution */ 1999c2daa00SOllivier Robert #define EAI_BADFLAGS 3 /* invalid value for ai_flags */ 2009c2daa00SOllivier Robert #define EAI_FAIL 4 /* non-recoverable failure in name resolution */ 2019c2daa00SOllivier Robert #define EAI_FAMILY 5 /* ai_family not supported */ 2029c2daa00SOllivier Robert #define EAI_MEMORY 6 /* memory allocation failure */ 2039c2daa00SOllivier Robert #define EAI_NODATA 7 /* no address associated with hostname */ 2049c2daa00SOllivier Robert #define EAI_NONAME 8 /* hostname nor servname provided, or not known */ 2059c2daa00SOllivier Robert #define EAI_SERVICE 9 /* servname not supported for ai_socktype */ 2069c2daa00SOllivier Robert #define EAI_SOCKTYPE 10 /* ai_socktype not supported */ 2079c2daa00SOllivier Robert #define EAI_SYSTEM 11 /* system error returned in errno */ 2089c2daa00SOllivier Robert #define EAI_BADHINTS 12 2099c2daa00SOllivier Robert #define EAI_PROTOCOL 13 2109c2daa00SOllivier Robert #define EAI_MAX 14 2119c2daa00SOllivier Robert 2129c2daa00SOllivier Robert 213*2b15cb3dSCy Schubert int getaddrinfo (const char *, const char *, 214*2b15cb3dSCy Schubert const struct addrinfo *, struct addrinfo **); 215*2b15cb3dSCy Schubert int getnameinfo (const struct sockaddr *, u_int, char *, 216*2b15cb3dSCy Schubert size_t, char *, size_t, int); 217*2b15cb3dSCy Schubert void freeaddrinfo (struct addrinfo *); 218*2b15cb3dSCy Schubert char *gai_strerror (int); 2199c2daa00SOllivier Robert 220ea906c41SOllivier Robert /* 221ea906c41SOllivier Robert * Constants for getnameinfo() 222ea906c41SOllivier Robert */ 223ea906c41SOllivier Robert #ifndef NI_MAXHOST 224ea906c41SOllivier Robert #define NI_MAXHOST 1025 225ea906c41SOllivier Robert #define NI_MAXSERV 32 226ea906c41SOllivier Robert #endif 227ea906c41SOllivier Robert 228ea906c41SOllivier Robert /* 229ea906c41SOllivier Robert * Flag values for getnameinfo() 230ea906c41SOllivier Robert */ 231ea906c41SOllivier Robert #ifndef NI_NUMERICHOST 232ea906c41SOllivier Robert #define NI_NOFQDN 0x00000001 233ea906c41SOllivier Robert #define NI_NUMERICHOST 0x00000002 234ea906c41SOllivier Robert #define NI_NAMEREQD 0x00000004 235ea906c41SOllivier Robert #define NI_NUMERICSERV 0x00000008 236ea906c41SOllivier Robert #define NI_DGRAM 0x00000010 237ea906c41SOllivier Robert #define NI_WITHSCOPEID 0x00000020 238ea906c41SOllivier Robert #endif 239ea906c41SOllivier Robert 240*2b15cb3dSCy Schubert #endif /* !ISC_PLATFORM_HAVEIPV6 */ 241ea906c41SOllivier Robert 242*2b15cb3dSCy Schubert /* 243*2b15cb3dSCy Schubert * Set up some macros to look for IPv6 and IPv6 multicast 244*2b15cb3dSCy Schubert */ 245*2b15cb3dSCy Schubert 246*2b15cb3dSCy Schubert #if defined(ISC_PLATFORM_HAVEIPV6) && defined(WANT_IPV6) 247*2b15cb3dSCy Schubert # define INCLUDE_IPV6_SUPPORT 248*2b15cb3dSCy Schubert # if defined(IPV6_JOIN_GROUP) && defined(IPV6_LEAVE_GROUP) 249*2b15cb3dSCy Schubert # define INCLUDE_IPV6_MULTICAST_SUPPORT 250*2b15cb3dSCy Schubert # endif /* IPV6 Multicast Support */ 251*2b15cb3dSCy Schubert #endif /* IPv6 Support */ 252*2b15cb3dSCy Schubert 253*2b15cb3dSCy Schubert #endif /* !NTP_RFC2553_H */ 254