Merge from vendor branch FILE:
[dragonfly.git] / contrib / bind-9.3 / 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.35.12.10 2006/03/02 00:37:20 marka Exp $ */
19
20 #ifndef ISC_SOCKADDR_H
21 #define ISC_SOCKADDR_H 1
22
23 #include <isc/lang.h>
24 #include <isc/net.h>
25 #include <isc/types.h>
26
27 struct isc_sockaddr {
28         union {
29                 struct sockaddr         sa;
30                 struct sockaddr_in      sin;
31                 struct sockaddr_in6     sin6;
32         }                               type;
33         unsigned int                    length;         /* XXXRTH beginning? */
34         ISC_LINK(struct isc_sockaddr)   link;
35 };
36
37 typedef ISC_LIST(struct isc_sockaddr)   isc_sockaddrlist_t;
38
39 ISC_LANG_BEGINDECLS
40
41 isc_boolean_t
42 isc_sockaddr_equal(const isc_sockaddr_t *a, const isc_sockaddr_t *b);
43 /*
44  * Return ISC_TRUE iff the socket addresses 'a' and 'b' are equal.
45  */
46
47 isc_boolean_t
48 isc_sockaddr_eqaddr(const isc_sockaddr_t *a, const isc_sockaddr_t *b);
49 /*
50  * Return ISC_TRUE iff the address parts of the socket addresses
51  * 'a' and 'b' are equal, ignoring the ports.
52  */
53
54 isc_boolean_t
55 isc_sockaddr_eqaddrprefix(const isc_sockaddr_t *a, const isc_sockaddr_t *b,
56                           unsigned int prefixlen);
57 /*
58  * Return ISC_TRUE iff the most significant 'prefixlen' bits of the
59  * socket addresses 'a' and 'b' are equal, ignoring the ports.
60  */
61
62 unsigned int
63 isc_sockaddr_hash(const isc_sockaddr_t *sockaddr, isc_boolean_t address_only);
64 /*
65  * Return a hash value for the socket address 'sockaddr'.  If 'address_only'
66  * is ISC_TRUE, the hash value will not depend on the port.
67  *
68  * IPv6 addresses containing mapped IPv4 addresses generate the same hash
69  * value as the equivalent IPv4 address.
70  */
71
72 void
73 isc_sockaddr_any(isc_sockaddr_t *sockaddr);
74 /*
75  * Return the IPv4 wildcard address.
76  */
77
78 void
79 isc_sockaddr_any6(isc_sockaddr_t *sockaddr);
80 /*
81  * Return the IPv6 wildcard address.
82  */
83
84 void
85 isc_sockaddr_anyofpf(isc_sockaddr_t *sockaddr, int family);
86 /*
87  * Set '*sockaddr' to the wildcard address of protocol family
88  * 'family'.
89  *
90  * Requires:
91  *      'family' is AF_INET or AF_INET6.
92  */
93
94 void
95 isc_sockaddr_fromin(isc_sockaddr_t *sockaddr, const struct in_addr *ina,
96                     in_port_t port);
97 /*
98  * Construct an isc_sockaddr_t from an IPv4 address and port.
99  */
100
101 void
102 isc_sockaddr_fromin6(isc_sockaddr_t *sockaddr, const struct in6_addr *ina6,
103                      in_port_t port);
104 /*
105  * Construct an isc_sockaddr_t from an IPv6 address and port.
106  */
107
108 void
109 isc_sockaddr_v6fromin(isc_sockaddr_t *sockaddr, const struct in_addr *ina,
110                       in_port_t port);
111 /*
112  * Construct an IPv6 isc_sockaddr_t representing a mapped IPv4 address.
113  */
114
115 void
116 isc_sockaddr_fromnetaddr(isc_sockaddr_t *sockaddr, const isc_netaddr_t *na,
117                          in_port_t port);
118 /*
119  * Construct an isc_sockaddr_t from an isc_netaddr_t and port.
120  */
121
122 int
123 isc_sockaddr_pf(const isc_sockaddr_t *sockaddr);
124 /*
125  * Get the protocol family of 'sockaddr'.
126  *
127  * Requires:
128  *
129  *      'sockaddr' is a valid sockaddr with an address family of AF_INET
130  *      or AF_INET6.
131  *
132  * Returns:
133  *
134  *      The protocol family of 'sockaddr', e.g. PF_INET or PF_INET6.
135  */
136
137 void
138 isc_sockaddr_setport(isc_sockaddr_t *sockaddr, in_port_t port);
139 /*
140  * Set the port of 'sockaddr' to 'port'.
141  */
142
143 in_port_t
144 isc_sockaddr_getport(const isc_sockaddr_t *sockaddr);
145 /*
146  * Get the port stored in 'sockaddr'.
147  */
148
149 isc_result_t
150 isc_sockaddr_totext(const isc_sockaddr_t *sockaddr, isc_buffer_t *target);
151 /*
152  * Append a text representation of 'sockaddr' to the buffer 'target'.
153  * The text will include both the IP address (v4 or v6) and the port.
154  * The text is null terminated, but the terminating null is not
155  * part of the buffer's used region.
156  *
157  * Returns:
158  *      ISC_R_SUCCESS
159  *      ISC_R_NOSPACE   The text or the null termination did not fit.
160  */
161
162 void
163 isc_sockaddr_format(const isc_sockaddr_t *sa, char *array, unsigned int size);
164 /*
165  * Format a human-readable representation of the socket address '*sa'
166  * into the character array 'array', which is of size 'size'.
167  * The resulting string is guaranteed to be null-terminated.
168  */
169
170 isc_boolean_t
171 isc_sockaddr_ismulticast(const isc_sockaddr_t *sa);
172 /*
173  * Returns ISC_TRUE if the address is a multicast address.
174  */
175
176 isc_boolean_t
177 isc_sockaddr_isexperimental(const isc_sockaddr_t *sa);
178 /*
179  * Returns ISC_TRUE if the address is a experimental (CLASS E) address.
180  */
181
182 isc_boolean_t
183 isc_sockaddr_islinklocal(const isc_sockaddr_t *sa);
184 /*
185  * Returns ISC_TRUE if the address is a link local addresss.
186  */
187
188 isc_boolean_t
189 isc_sockaddr_issitelocal(const isc_sockaddr_t *sa);
190 /*
191  * Returns ISC_TRUE if the address is a sitelocal address.
192  */
193
194 #define ISC_SOCKADDR_FORMATSIZE \
195         sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:XXX.XXX.XXX.XXX#YYYYY%SSSSSSSSSS")
196 /*
197  * Minimum size of array to pass to isc_sockaddr_format().
198  */
199
200 ISC_LANG_ENDDECLS
201
202 #endif /* ISC_SOCKADDR_H */