sockaddr.h revision 290001
1/*
2 * Copyright (C) 2004-2007, 2009  Internet Systems Consortium, Inc. ("ISC")
3 * Copyright (C) 1998-2003  Internet Software Consortium.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11 * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15 * PERFORMANCE OF THIS SOFTWARE.
16 */
17
18/* $Id: sockaddr.h,v 1.57 2009/01/18 23:48:14 tbox Exp $ */
19
20#ifndef ISC_SOCKADDR_H
21#define ISC_SOCKADDR_H 1
22
23/*! \file isc/sockaddr.h */
24
25#include <isc/lang.h>
26#include <isc/net.h>
27#include <isc/types.h>
28#ifdef ISC_PLATFORM_HAVESYSUNH
29#include <sys/un.h>
30#endif
31
32struct isc_sockaddr {
33	union {
34		struct sockaddr		sa;
35		struct sockaddr_in	sin;
36		struct sockaddr_in6	sin6;
37#ifdef ISC_PLATFORM_HAVESYSUNH
38		struct sockaddr_un	sunix;
39#endif
40	}				type;
41	unsigned int			length;		/* XXXRTH beginning? */
42	ISC_LINK(struct isc_sockaddr)	link;
43};
44
45typedef ISC_LIST(struct isc_sockaddr)	isc_sockaddrlist_t;
46
47#define ISC_SOCKADDR_CMPADDR	  0x0001	/*%< compare the address
48						 *   sin_addr/sin6_addr */
49#define ISC_SOCKADDR_CMPPORT 	  0x0002	/*%< compare the port
50						 *   sin_port/sin6_port */
51#define ISC_SOCKADDR_CMPSCOPE     0x0004	/*%< compare the scope
52						 *   sin6_scope */
53#define ISC_SOCKADDR_CMPSCOPEZERO 0x0008	/*%< when comparing scopes
54						 *   zero scopes always match */
55
56ISC_LANG_BEGINDECLS
57
58isc_boolean_t
59isc_sockaddr_compare(const isc_sockaddr_t *a, const isc_sockaddr_t *b,
60		     unsigned int flags);
61/*%<
62 * Compare the elements of the two address ('a' and 'b') as specified
63 * by 'flags' and report if they are equal or not.
64 *
65 * 'flags' is set from ISC_SOCKADDR_CMP*.
66 */
67
68isc_boolean_t
69isc_sockaddr_equal(const isc_sockaddr_t *a, const isc_sockaddr_t *b);
70/*%<
71 * Return ISC_TRUE iff the socket addresses 'a' and 'b' are equal.
72 */
73
74isc_boolean_t
75isc_sockaddr_eqaddr(const isc_sockaddr_t *a, const isc_sockaddr_t *b);
76/*%<
77 * Return ISC_TRUE iff the address parts of the socket addresses
78 * 'a' and 'b' are equal, ignoring the ports.
79 */
80
81isc_boolean_t
82isc_sockaddr_eqaddrprefix(const isc_sockaddr_t *a, const isc_sockaddr_t *b,
83			  unsigned int prefixlen);
84/*%<
85 * Return ISC_TRUE iff the most significant 'prefixlen' bits of the
86 * socket addresses 'a' and 'b' are equal, ignoring the ports.
87 * If 'b''s scope is zero then 'a''s scope will be ignored.
88 */
89
90unsigned int
91isc_sockaddr_hash(const isc_sockaddr_t *sockaddr, isc_boolean_t address_only);
92/*%<
93 * Return a hash value for the socket address 'sockaddr'.  If 'address_only'
94 * is ISC_TRUE, the hash value will not depend on the port.
95 *
96 * IPv6 addresses containing mapped IPv4 addresses generate the same hash
97 * value as the equivalent IPv4 address.
98 */
99
100void
101isc_sockaddr_any(isc_sockaddr_t *sockaddr);
102/*%<
103 * Return the IPv4 wildcard address.
104 */
105
106void
107isc_sockaddr_any6(isc_sockaddr_t *sockaddr);
108/*%<
109 * Return the IPv6 wildcard address.
110 */
111
112void
113isc_sockaddr_anyofpf(isc_sockaddr_t *sockaddr, int family);
114/*%<
115 * Set '*sockaddr' to the wildcard address of protocol family
116 * 'family'.
117 *
118 * Requires:
119 * \li	'family' is AF_INET or AF_INET6.
120 */
121
122void
123isc_sockaddr_fromin(isc_sockaddr_t *sockaddr, const struct in_addr *ina,
124		    in_port_t port);
125/*%<
126 * Construct an isc_sockaddr_t from an IPv4 address and port.
127 */
128
129void
130isc_sockaddr_fromin6(isc_sockaddr_t *sockaddr, const struct in6_addr *ina6,
131		     in_port_t port);
132/*%<
133 * Construct an isc_sockaddr_t from an IPv6 address and port.
134 */
135
136void
137isc_sockaddr_v6fromin(isc_sockaddr_t *sockaddr, const struct in_addr *ina,
138		      in_port_t port);
139/*%<
140 * Construct an IPv6 isc_sockaddr_t representing a mapped IPv4 address.
141 */
142
143void
144isc_sockaddr_fromnetaddr(isc_sockaddr_t *sockaddr, const isc_netaddr_t *na,
145			 in_port_t port);
146/*%<
147 * Construct an isc_sockaddr_t from an isc_netaddr_t and port.
148 */
149
150int
151isc_sockaddr_pf(const isc_sockaddr_t *sockaddr);
152/*%<
153 * Get the protocol family of 'sockaddr'.
154 *
155 * Requires:
156 *
157 *\li	'sockaddr' is a valid sockaddr with an address family of AF_INET
158 *	or AF_INET6.
159 *
160 * Returns:
161 *
162 *\li	The protocol family of 'sockaddr', e.g. PF_INET or PF_INET6.
163 */
164
165void
166isc_sockaddr_setport(isc_sockaddr_t *sockaddr, in_port_t port);
167/*%<
168 * Set the port of 'sockaddr' to 'port'.
169 */
170
171in_port_t
172isc_sockaddr_getport(const isc_sockaddr_t *sockaddr);
173/*%<
174 * Get the port stored in 'sockaddr'.
175 */
176
177isc_result_t
178isc_sockaddr_totext(const isc_sockaddr_t *sockaddr, isc_buffer_t *target);
179/*%<
180 * Append a text representation of 'sockaddr' to the buffer 'target'.
181 * The text will include both the IP address (v4 or v6) and the port.
182 * The text is null terminated, but the terminating null is not
183 * part of the buffer's used region.
184 *
185 * Returns:
186 * \li	ISC_R_SUCCESS
187 * \li	ISC_R_NOSPACE	The text or the null termination did not fit.
188 */
189
190void
191isc_sockaddr_format(const isc_sockaddr_t *sa, char *array, unsigned int size);
192/*%<
193 * Format a human-readable representation of the socket address '*sa'
194 * into the character array 'array', which is of size 'size'.
195 * The resulting string is guaranteed to be null-terminated.
196 */
197
198isc_boolean_t
199isc_sockaddr_ismulticast(const isc_sockaddr_t *sa);
200/*%<
201 * Returns #ISC_TRUE if the address is a multicast address.
202 */
203
204isc_boolean_t
205isc_sockaddr_isexperimental(const isc_sockaddr_t *sa);
206/*
207 * Returns ISC_TRUE if the address is a experimental (CLASS E) address.
208 */
209
210isc_boolean_t
211isc_sockaddr_islinklocal(const isc_sockaddr_t *sa);
212/*%<
213 * Returns ISC_TRUE if the address is a link local address.
214 */
215
216isc_boolean_t
217isc_sockaddr_issitelocal(const isc_sockaddr_t *sa);
218/*%<
219 * Returns ISC_TRUE if the address is a sitelocal address.
220 */
221
222isc_result_t
223isc_sockaddr_frompath(isc_sockaddr_t *sockaddr, const char *path);
224/*
225 *  Create a UNIX domain sockaddr that refers to path.
226 *
227 * Returns:
228 * \li	ISC_R_NOSPACE
229 * \li	ISC_R_NOTIMPLEMENTED
230 * \li	ISC_R_SUCCESS
231 */
232
233#define ISC_SOCKADDR_FORMATSIZE \
234	sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:XXX.XXX.XXX.XXX%SSSSSSSSSS#YYYYY")
235/*%<
236 * Minimum size of array to pass to isc_sockaddr_format().
237 */
238
239ISC_LANG_ENDDECLS
240
241#endif /* ISC_SOCKADDR_H */
242