]> CyberLeo.Net >> Repos - FreeBSD/releng/7.2.git/blob - contrib/bind9/lib/isc/include/isc/sockaddr.h
Create releng/7.2 from stable/7 in preparation for 7.2-RELEASE.
[FreeBSD/releng/7.2.git] / contrib / bind9 / lib / isc / include / isc / sockaddr.h
1 /*
2  * Copyright (C) 2004-2006  Internet Systems Consortium, Inc. ("ISC")
3  * Copyright (C) 1998-2003  Internet Software Consortium.
4  *
5  * Permission to use, copy, modify, and 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.42.18.8 2006/03/02 00:37:22 marka Exp $ */
19
20 #ifndef ISC_SOCKADDR_H
21 #define ISC_SOCKADDR_H 1
22
23 /*! \file */
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
32 struct 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
45 typedef 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
56 ISC_LANG_BEGINDECLS
57
58 isc_boolean_t
59 isc_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
68 isc_boolean_t
69 isc_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
74 isc_boolean_t
75 isc_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
81 isc_boolean_t
82 isc_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  */
88
89 unsigned int
90 isc_sockaddr_hash(const isc_sockaddr_t *sockaddr, isc_boolean_t address_only);
91 /*%<
92  * Return a hash value for the socket address 'sockaddr'.  If 'address_only'
93  * is ISC_TRUE, the hash value will not depend on the port.
94  *
95  * IPv6 addresses containing mapped IPv4 addresses generate the same hash
96  * value as the equivalent IPv4 address.
97  */
98
99 void
100 isc_sockaddr_any(isc_sockaddr_t *sockaddr);
101 /*%<
102  * Return the IPv4 wildcard address.
103  */
104
105 void
106 isc_sockaddr_any6(isc_sockaddr_t *sockaddr);
107 /*%<
108  * Return the IPv6 wildcard address.
109  */
110
111 void
112 isc_sockaddr_anyofpf(isc_sockaddr_t *sockaddr, int family);
113 /*%<
114  * Set '*sockaddr' to the wildcard address of protocol family
115  * 'family'.
116  *
117  * Requires:
118  * \li  'family' is AF_INET or AF_INET6.
119  */
120
121 void
122 isc_sockaddr_fromin(isc_sockaddr_t *sockaddr, const struct in_addr *ina,
123                     in_port_t port);
124 /*%<
125  * Construct an isc_sockaddr_t from an IPv4 address and port.
126  */
127
128 void
129 isc_sockaddr_fromin6(isc_sockaddr_t *sockaddr, const struct in6_addr *ina6,
130                      in_port_t port);
131 /*%<
132  * Construct an isc_sockaddr_t from an IPv6 address and port.
133  */
134
135 void
136 isc_sockaddr_v6fromin(isc_sockaddr_t *sockaddr, const struct in_addr *ina,
137                       in_port_t port);
138 /*%<
139  * Construct an IPv6 isc_sockaddr_t representing a mapped IPv4 address.
140  */
141
142 void
143 isc_sockaddr_fromnetaddr(isc_sockaddr_t *sockaddr, const isc_netaddr_t *na,
144                          in_port_t port);
145 /*%<
146  * Construct an isc_sockaddr_t from an isc_netaddr_t and port.
147  */
148
149 int
150 isc_sockaddr_pf(const isc_sockaddr_t *sockaddr);
151 /*%<
152  * Get the protocol family of 'sockaddr'.
153  *
154  * Requires:
155  *
156  *\li   'sockaddr' is a valid sockaddr with an address family of AF_INET
157  *      or AF_INET6.
158  *
159  * Returns:
160  *
161  *\li   The protocol family of 'sockaddr', e.g. PF_INET or PF_INET6.
162  */
163
164 void
165 isc_sockaddr_setport(isc_sockaddr_t *sockaddr, in_port_t port);
166 /*%<
167  * Set the port of 'sockaddr' to 'port'.
168  */
169
170 in_port_t
171 isc_sockaddr_getport(const isc_sockaddr_t *sockaddr);
172 /*%<
173  * Get the port stored in 'sockaddr'.
174  */
175
176 isc_result_t
177 isc_sockaddr_totext(const isc_sockaddr_t *sockaddr, isc_buffer_t *target);
178 /*%<
179  * Append a text representation of 'sockaddr' to the buffer 'target'.
180  * The text will include both the IP address (v4 or v6) and the port.
181  * The text is null terminated, but the terminating null is not
182  * part of the buffer's used region.
183  *
184  * Returns:
185  * \li  ISC_R_SUCCESS
186  * \li  ISC_R_NOSPACE   The text or the null termination did not fit.
187  */
188
189 void
190 isc_sockaddr_format(const isc_sockaddr_t *sa, char *array, unsigned int size);
191 /*%<
192  * Format a human-readable representation of the socket address '*sa'
193  * into the character array 'array', which is of size 'size'.
194  * The resulting string is guaranteed to be null-terminated.
195  */
196
197 isc_boolean_t
198 isc_sockaddr_ismulticast(const isc_sockaddr_t *sa);
199 /*%<
200  * Returns #ISC_TRUE if the address is a multicast address.
201  */
202
203 isc_boolean_t
204 isc_sockaddr_isexperimental(const isc_sockaddr_t *sa);
205 /*
206  * Returns ISC_TRUE if the address is a experimental (CLASS E) address.
207  */
208
209 isc_boolean_t
210 isc_sockaddr_islinklocal(const isc_sockaddr_t *sa);
211 /*%<
212  * Returns ISC_TRUE if the address is a link local addresss.
213  */
214
215 isc_boolean_t
216 isc_sockaddr_issitelocal(const isc_sockaddr_t *sa);
217 /*%<
218  * Returns ISC_TRUE if the address is a sitelocal address.
219  */
220
221 isc_result_t
222 isc_sockaddr_frompath(isc_sockaddr_t *sockaddr, const char *path);
223 /*
224  *  Create a UNIX domain sockaddr that refers to path.
225  *
226  * Returns:
227  * \li  ISC_R_NOSPACE
228  * \li  ISC_R_NOTIMPLEMENTED
229  * \li  ISC_R_SUCCESS
230  */
231
232 #define ISC_SOCKADDR_FORMATSIZE \
233         sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:XXX.XXX.XXX.XXX%SSSSSSSSSS#YYYYY")
234 /*%<
235  * Minimum size of array to pass to isc_sockaddr_format().
236  */
237
238 ISC_LANG_ENDDECLS
239
240 #endif /* ISC_SOCKADDR_H */