Backed out 2 changesets (bug 1943998) for causing wd failures @ phases.py CLOSED...
[gecko.git] / nsprpub / pr / include / prnetdb.h
blob023a46e5df6d19cf047a950d6ffdd046d17bdf96
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #ifndef prnetdb_h___
7 #define prnetdb_h___
9 #include "prtypes.h"
10 #include "prio.h"
12 PR_BEGIN_EXTERN_C
16 *********************************************************************
17 * Translate an Internet address to/from a character string
18 *********************************************************************
20 NSPR_API(PRStatus) PR_StringToNetAddr(
21 const char *string, PRNetAddr *addr);
23 NSPR_API(PRStatus) PR_NetAddrToString(
24 const PRNetAddr *addr, char *string, PRUint32 size);
27 ** Structures returned by network data base library. All addresses are
28 ** supplied in host order, and returned in network order (suitable for
29 ** use in system calls).
32 ** Beware that WINSOCK.H defines h_addrtype and h_length as short.
33 ** Client code does direct struct copies of hostent to PRHostEnt and
34 ** hence the ifdef.
36 typedef struct PRHostEnt {
37 char *h_name; /* official name of host */
38 char **h_aliases; /* alias list */
39 #ifdef WIN32
40 PRInt16 h_addrtype; /* host address type */
41 PRInt16 h_length; /* length of address */
42 #else
43 PRInt32 h_addrtype; /* host address type */
44 PRInt32 h_length; /* length of address */
45 #endif
46 char **h_addr_list; /* list of addresses from name server */
47 } PRHostEnt;
49 /* A safe size to use that will mostly work... */
50 #if (defined(AIX) && defined(_THREAD_SAFE))
51 #define PR_NETDB_BUF_SIZE sizeof(struct protoent_data)
52 #define PR_MIN_NETDB_BUF_SIZE PR_NETDB_BUF_SIZE
53 #else
54 /* PR_NETDB_BUF_SIZE is the recommended buffer size */
55 #define PR_NETDB_BUF_SIZE 2048
56 /* PR_MIN_NETDB_BUF_SIZE is the smallest buffer size that the API
57 * accepts (for backward compatibility). */
58 #define PR_MIN_NETDB_BUF_SIZE 1024
59 #endif
61 /***********************************************************************
62 ** FUNCTION:
63 ** DESCRIPTION: PR_GetHostByName()
64 ** Lookup a host by name.
66 ** INPUTS:
67 ** char *hostname Character string defining the host name of interest
68 ** char *buf A scratch buffer for the runtime to return result.
69 ** This buffer is allocated by the caller.
70 ** PRIntn bufsize Number of bytes in 'buf'. A recommnded value to
71 ** use is PR_NETDB_BUF_SIZE.
72 ** OUTPUTS:
73 ** PRHostEnt *hostentry
74 ** This structure is filled in by the runtime if
75 ** the function returns PR_SUCCESS. This structure
76 ** is allocated by the caller.
77 ** RETURN:
78 ** PRStatus PR_SUCCESS if the lookup succeeds. If it fails
79 ** the result will be PR_FAILURE and the reason
80 ** for the failure can be retrieved by PR_GetError().
81 ***********************************************************************/
82 NSPR_API(PRStatus) PR_GetHostByName(
83 const char *hostname, char *buf, PRIntn bufsize, PRHostEnt *hostentry);
85 /***********************************************************************
86 ** FUNCTION:
87 ** DESCRIPTION: PR_GetIPNodeByName()
88 ** Lookup a host by name. Equivalent to getipnodebyname(AI_DEFAULT)
89 ** of RFC 2553.
91 ** INPUTS:
92 ** char *hostname Character string defining the host name of interest
93 ** PRUint16 af Address family (either PR_AF_INET or PR_AF_INET6)
94 ** PRIntn flags Specifies the types of addresses that are searched
95 ** for and the types of addresses that are returned.
96 ** The only supported flag is PR_AI_DEFAULT.
97 ** char *buf A scratch buffer for the runtime to return result.
98 ** This buffer is allocated by the caller.
99 ** PRIntn bufsize Number of bytes in 'buf'. A recommnded value to
100 ** use is PR_NETDB_BUF_SIZE.
101 ** OUTPUTS:
102 ** PRHostEnt *hostentry
103 ** This structure is filled in by the runtime if
104 ** the function returns PR_SUCCESS. This structure
105 ** is allocated by the caller.
106 ** RETURN:
107 ** PRStatus PR_SUCCESS if the lookup succeeds. If it fails
108 ** the result will be PR_FAILURE and the reason
109 ** for the failure can be retrieved by PR_GetError().
110 ***********************************************************************/
113 #define PR_AI_ALL 0x08
114 #define PR_AI_V4MAPPED 0x10
115 #define PR_AI_ADDRCONFIG 0x20
116 #define PR_AI_NOCANONNAME 0x8000
117 #define PR_AI_DEFAULT (PR_AI_V4MAPPED | PR_AI_ADDRCONFIG)
119 NSPR_API(PRStatus) PR_GetIPNodeByName(
120 const char *hostname,
121 PRUint16 af,
122 PRIntn flags,
123 char *buf,
124 PRIntn bufsize,
125 PRHostEnt *hostentry);
127 /***********************************************************************
128 ** FUNCTION:
129 ** DESCRIPTION: PR_GetHostByAddr()
130 ** Lookup a host entry by its network address.
132 ** INPUTS:
133 ** char *hostaddr IP address of host in question
134 ** char *buf A scratch buffer for the runtime to return result.
135 ** This buffer is allocated by the caller.
136 ** PRIntn bufsize Number of bytes in 'buf'. A recommnded value to
137 ** use is PR_NETDB_BUF_SIZE.
138 ** OUTPUTS:
139 ** PRHostEnt *hostentry
140 ** This structure is filled in by the runtime if
141 ** the function returns PR_SUCCESS. This structure
142 ** is allocated by the caller.
143 ** RETURN:
144 ** PRStatus PR_SUCCESS if the lookup succeeds. If it fails
145 ** the result will be PR_FAILURE and the reason
146 ** for the failure can be retrieved by PR_GetError().
147 ***********************************************************************/
148 NSPR_API(PRStatus) PR_GetHostByAddr(
149 const PRNetAddr *hostaddr, char *buf, PRIntn bufsize, PRHostEnt *hostentry);
151 /***********************************************************************
152 ** FUNCTION: PR_EnumerateHostEnt()
153 ** DESCRIPTION:
154 ** A stateless enumerator over a PRHostEnt structure acquired from
155 ** PR_GetHostByName() PR_GetHostByAddr() to evaluate the possible
156 ** network addresses.
158 ** INPUTS:
159 ** PRIntn enumIndex Index of the enumeration. The enumeration starts
160 ** and ends with a value of zero.
162 ** PRHostEnt *hostEnt A pointer to a host entry struct that was
163 ** previously returned by PR_GetHostByName() or
164 ** PR_GetHostByAddr().
166 ** PRUint16 port The port number to be assigned as part of the
167 ** PRNetAddr.
169 ** OUTPUTS:
170 ** PRNetAddr *address A pointer to an address structure that will be
171 ** filled in by the call to the enumeration if the
172 ** result of the call is greater than zero.
174 ** RETURN:
175 ** PRIntn The value that should be used for the next call
176 ** of the enumerator ('enumIndex'). The enumeration
177 ** is ended if this value is returned zero.
178 ** If a value of -1 is returned, the enumeration
179 ** has failed. The reason for the failure can be
180 ** retrieved by calling PR_GetError().
181 ***********************************************************************/
182 NSPR_API(PRIntn) PR_EnumerateHostEnt(
183 PRIntn enumIndex, const PRHostEnt *hostEnt, PRUint16 port, PRNetAddr *address);
185 /***********************************************************************
186 ** FUNCTION: PR_InitializeNetAddr(),
187 ** DESCRIPTION:
188 ** Initialize the fields of a PRNetAddr, assigning well known values as
189 ** appropriate.
191 ** INPUTS
192 ** PRNetAddrValue val The value to be assigned to the IP Address portion
193 ** of the network address. This can only specify the
194 ** special well known values that are equivalent to
195 ** INADDR_ANY and INADDR_LOOPBACK.
197 ** PRUint16 port The port number to be assigned in the structure.
199 ** OUTPUTS:
200 ** PRNetAddr *addr The address to be manipulated.
202 ** RETURN:
203 ** PRStatus To indicate success or failure. If the latter, the
204 ** reason for the failure can be retrieved by calling
205 ** PR_GetError();
206 ***********************************************************************/
207 typedef enum PRNetAddrValue
209 PR_IpAddrNull, /* do NOT overwrite the IP address */
210 PR_IpAddrAny, /* assign logical INADDR_ANY to IP address */
211 PR_IpAddrLoopback, /* assign logical INADDR_LOOPBACK */
212 PR_IpAddrV4Mapped /* IPv4 mapped address */
213 } PRNetAddrValue;
215 NSPR_API(PRStatus) PR_InitializeNetAddr(
216 PRNetAddrValue val, PRUint16 port, PRNetAddr *addr);
218 /***********************************************************************
219 ** FUNCTION: PR_SetNetAddr(),
220 ** DESCRIPTION:
221 ** Set the fields of a PRNetAddr, assigning well known values as
222 ** appropriate. This function is similar to PR_InitializeNetAddr
223 ** but differs in that the address family is specified.
225 ** INPUTS
226 ** PRNetAddrValue val The value to be assigned to the IP Address portion
227 ** of the network address. This can only specify the
228 ** special well known values that are equivalent to
229 ** INADDR_ANY and INADDR_LOOPBACK.
231 ** PRUint16 af The address family (either PR_AF_INET or PR_AF_INET6)
233 ** PRUint16 port The port number to be assigned in the structure.
235 ** OUTPUTS:
236 ** PRNetAddr *addr The address to be manipulated.
238 ** RETURN:
239 ** PRStatus To indicate success or failure. If the latter, the
240 ** reason for the failure can be retrieved by calling
241 ** PR_GetError();
242 ***********************************************************************/
243 NSPR_API(PRStatus) PR_SetNetAddr(
244 PRNetAddrValue val, PRUint16 af, PRUint16 port, PRNetAddr *addr);
246 /***********************************************************************
247 ** FUNCTION:
248 ** DESCRIPTION: PR_IsNetAddrType()
249 ** Determine if the network address is of the specified type.
251 ** INPUTS:
252 ** const PRNetAddr *addr A network address.
253 ** PRNetAddrValue The type of network address
255 ** RETURN:
256 ** PRBool PR_TRUE if the network address is of the
257 ** specified type, else PR_FALSE.
258 ***********************************************************************/
259 NSPR_API(PRBool) PR_IsNetAddrType(const PRNetAddr *addr, PRNetAddrValue val);
261 /***********************************************************************
262 ** FUNCTION:
263 ** DESCRIPTION: PR_ConvertIPv4AddrToIPv6()
264 ** Convert an IPv4 addr to an (IPv4-mapped) IPv6 addr
266 ** INPUTS:
267 ** PRUint32 v4addr IPv4 address
269 ** OUTPUTS:
270 ** PRIPv6Addr *v6addr The converted IPv6 address
272 ** RETURN:
273 ** void
275 ***********************************************************************/
276 NSPR_API(void) PR_ConvertIPv4AddrToIPv6(PRUint32 v4addr, PRIPv6Addr *v6addr);
278 /***********************************************************************
279 ** MACRO:
280 ** DESCRIPTION: PR_NetAddrFamily()
281 ** Get the 'family' field of a PRNetAddr union.
283 ** INPUTS:
284 ** const PRNetAddr *addr A network address.
286 ** RETURN:
287 ** PRUint16 The 'family' field of 'addr'.
288 ***********************************************************************/
289 #define PR_NetAddrFamily(addr) ((addr)->raw.family)
291 /***********************************************************************
292 ** MACRO:
293 ** DESCRIPTION: PR_NetAddrInetPort()
294 ** Get the 'port' field of a PRNetAddr union.
296 ** INPUTS:
297 ** const PRNetAddr *addr A network address.
299 ** RETURN:
300 ** PRUint16 The 'port' field of 'addr'.
301 ***********************************************************************/
302 #define PR_NetAddrInetPort(addr) \
303 ((addr)->raw.family == PR_AF_INET6 ? (addr)->ipv6.port : (addr)->inet.port)
305 /***********************************************************************
306 ** FUNCTION:
307 ** DESCRIPTION: PR_GetProtoByName()
308 ** Lookup a protocol entry based on protocol's name
310 ** INPUTS:
311 ** char *protocolname Character string of the protocol's name.
312 ** char *buf A scratch buffer for the runtime to return result.
313 ** This buffer is allocated by the caller.
314 ** PRIntn bufsize Number of bytes in 'buf'. A recommnded value to
315 ** use is PR_NETDB_BUF_SIZE.
316 ** OUTPUTS:
317 ** PRHostEnt *PRProtoEnt
318 ** This structure is filled in by the runtime if
319 ** the function returns PR_SUCCESS. This structure
320 ** is allocated by the caller.
321 ** RETURN:
322 ** PRStatus PR_SUCCESS if the lookup succeeds. If it fails
323 ** the result will be PR_FAILURE and the reason
324 ** for the failure can be retrieved by PR_GetError().
325 ***********************************************************************/
327 typedef struct PRProtoEnt {
328 char *p_name; /* official protocol name */
329 char **p_aliases; /* alias list */
330 #ifdef WIN32
331 PRInt16 p_num; /* protocol # */
332 #else
333 PRInt32 p_num; /* protocol # */
334 #endif
335 } PRProtoEnt;
337 NSPR_API(PRStatus) PR_GetProtoByName(
338 const char* protocolname, char* buffer, PRInt32 bufsize, PRProtoEnt* result);
340 /***********************************************************************
341 ** FUNCTION:
342 ** DESCRIPTION: PR_GetProtoByNumber()
343 ** Lookup a protocol entry based on protocol's number
345 ** INPUTS:
346 ** PRInt32 protocolnumber
347 ** Number assigned to the protocol.
348 ** char *buf A scratch buffer for the runtime to return result.
349 ** This buffer is allocated by the caller.
350 ** PRIntn bufsize Number of bytes in 'buf'. A recommnded value to
351 ** use is PR_NETDB_BUF_SIZE.
352 ** OUTPUTS:
353 ** PRHostEnt *PRProtoEnt
354 ** This structure is filled in by the runtime if
355 ** the function returns PR_SUCCESS. This structure
356 ** is allocated by the caller.
357 ** RETURN:
358 ** PRStatus PR_SUCCESS if the lookup succeeds. If it fails
359 ** the result will be PR_FAILURE and the reason
360 ** for the failure can be retrieved by PR_GetError().
361 ***********************************************************************/
362 NSPR_API(PRStatus) PR_GetProtoByNumber(
363 PRInt32 protocolnumber, char* buffer, PRInt32 bufsize, PRProtoEnt* result);
365 /***********************************************************************
366 ** FUNCTION:
367 ** DESCRIPTION: PR_GetAddrInfoByName()
368 ** Look up a host by name. Equivalent to getaddrinfo(host, NULL, ...) of
369 ** RFC 3493.
371 ** INPUTS:
372 ** char *hostname Character string defining the host name of interest
373 ** PRUint16 af May be PR_AF_UNSPEC or PR_AF_INET.
374 ** PRIntn flags May be either PR_AI_ADDRCONFIG or
375 ** PR_AI_ADDRCONFIG | PR_AI_NOCANONNAME. Include
376 ** PR_AI_NOCANONNAME to suppress the determination of
377 ** the canonical name corresponding to hostname.
378 ** RETURN:
379 ** PRAddrInfo* Handle to a data structure containing the results
380 ** of the host lookup. Use PR_EnumerateAddrInfo to
381 ** inspect the PRNetAddr values stored in this object.
382 ** When no longer needed, this handle must be destroyed
383 ** with a call to PR_FreeAddrInfo. If a lookup error
384 ** occurs, then NULL will be returned.
385 ***********************************************************************/
386 typedef struct PRAddrInfo PRAddrInfo;
388 NSPR_API(PRAddrInfo*) PR_GetAddrInfoByName(
389 const char *hostname, PRUint16 af, PRIntn flags);
391 /***********************************************************************
392 ** FUNCTION:
393 ** DESCRIPTION: PR_FreeAddrInfo()
394 ** Destroy the PRAddrInfo handle allocated by PR_GetAddrInfoByName().
396 ** INPUTS:
397 ** PRAddrInfo *addrInfo
398 ** The handle resulting from a successful call to
399 ** PR_GetAddrInfoByName().
400 ** RETURN:
401 ** void
402 ***********************************************************************/
403 NSPR_API(void) PR_FreeAddrInfo(PRAddrInfo *addrInfo);
405 /***********************************************************************
406 ** FUNCTION:
407 ** DESCRIPTION: PR_EnumerateAddrInfo()
408 ** A stateless enumerator over a PRAddrInfo handle acquired from
409 ** PR_GetAddrInfoByName() to inspect the possible network addresses.
411 ** INPUTS:
412 ** void *enumPtr Index pointer of the enumeration. The enumeration
413 ** starts and ends with a value of NULL.
414 ** const PRAddrInfo *addrInfo
415 ** The PRAddrInfo handle returned by a successful
416 ** call to PR_GetAddrInfoByName().
417 ** PRUint16 port The port number to be assigned as part of the
418 ** PRNetAddr.
419 ** OUTPUTS:
420 ** PRNetAddr *result A pointer to an address structure that will be
421 ** filled in by the call to the enumeration if the
422 ** result of the call is not NULL.
423 ** RETURN:
424 ** void* The value that should be used for the next call
425 ** of the enumerator ('enumPtr'). The enumeration
426 ** is ended if this value is NULL.
427 ***********************************************************************/
428 NSPR_API(void *) PR_EnumerateAddrInfo(
429 void *enumPtr, const PRAddrInfo *addrInfo, PRUint16 port, PRNetAddr *result);
431 NSPR_API(PRStatus) PR_GetPrefLoopbackAddrInfo(PRNetAddr *result,
432 PRUint16 port);
434 /***********************************************************************
435 ** FUNCTION:
436 ** DESCRIPTION: PR_GetCanonNameFromAddrInfo()
437 ** Extracts the canonical name of the hostname passed to
438 ** PR_GetAddrInfoByName().
440 ** INPUTS:
441 ** const PRAddrInfo *addrInfo
442 ** The PRAddrInfo handle returned by a successful
443 ** call to PR_GetAddrInfoByName().
444 ** RETURN:
445 ** const char * A const pointer to the canonical hostname stored
446 ** in the given PRAddrInfo handle. This pointer is
447 ** invalidated once the PRAddrInfo handle is destroyed
448 ** by a call to PR_FreeAddrInfo().
449 ***********************************************************************/
450 NSPR_API(const char *) PR_GetCanonNameFromAddrInfo(
451 const PRAddrInfo *addrInfo);
453 /***********************************************************************
454 ** FUNCTIONS: PR_ntohs, PR_ntohl, PR_ntohll, PR_htons, PR_htonl, PR_htonll
456 ** DESCRIPTION: API entries for the common byte ordering routines.
458 ** PR_ntohs 16 bit conversion from network to host
459 ** PR_ntohl 32 bit conversion from network to host
460 ** PR_ntohll 64 bit conversion from network to host
461 ** PR_htons 16 bit conversion from host to network
462 ** PR_htonl 32 bit conversion from host to network
463 ** PR_ntonll 64 bit conversion from host to network
465 ***********************************************************************/
466 NSPR_API(PRUint16) PR_ntohs(PRUint16);
467 NSPR_API(PRUint32) PR_ntohl(PRUint32);
468 NSPR_API(PRUint64) PR_ntohll(PRUint64);
469 NSPR_API(PRUint16) PR_htons(PRUint16);
470 NSPR_API(PRUint32) PR_htonl(PRUint32);
471 NSPR_API(PRUint64) PR_htonll(PRUint64);
473 PR_END_EXTERN_C
475 #endif /* prnetdb_h___ */