prepare to upload
[debian/sudo] / compat / getaddrinfo.h
1 /*
2  * Replacement implementation of getaddrinfo.
3  *
4  * This is an implementation of the getaddrinfo family of functions for
5  * systems that lack it, so that code can use getaddrinfo always.  It provides
6  * IPv4 support only; for IPv6 support, a native getaddrinfo implemenation is
7  * required.
8  *
9  * The canonical version of this file is maintained in the rra-c-util package,
10  * which can be found at <http://www.eyrie.org/~eagle/software/rra-c-util/>.
11  *
12  * Written by Russ Allbery <rra@stanford.edu>
13  *
14  * The authors hereby relinquish any claim to any copyright that they may have
15  * in this work, whether granted under contract or by operation of law or
16  * international treaty, and hereby commit to the public, at large, that they
17  * shall not, at any time in the future, seek to enforce any copyright in this
18  * work against any person or entity, or prevent any person or entity from
19  * copying, publishing, distributing or creating derivative works of this
20  * work.
21  */
22
23 #ifndef _COMPAT_GETADDRINFO_H
24 #define _COMPAT_GETADDRINFO_H
25
26 #include <config.h>
27
28 /* Skip this entire file if a system getaddrinfo was detected. */
29 #ifndef HAVE_GETADDRINFO
30
31 /* OpenBSD likes to have sys/types.h included before sys/socket.h. */
32 #include <sys/types.h>
33 #include <sys/socket.h>
34
35 /* The struct returned by getaddrinfo, from RFC 3493. */
36 struct addrinfo {
37     int ai_flags;               /* AI_PASSIVE, AI_CANONNAME, .. */
38     int ai_family;              /* AF_xxx */
39     int ai_socktype;            /* SOCK_xxx */
40     int ai_protocol;            /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
41     socklen_t ai_addrlen;       /* Length of ai_addr */
42     char *ai_canonname;         /* Canonical name for nodename */
43     struct sockaddr *ai_addr;   /* Binary address */
44     struct addrinfo *ai_next;   /* Next structure in linked list */
45 };
46
47 /* Constants for ai_flags from RFC 3493, combined with binary or. */
48 #define AI_PASSIVE      0x0001
49 #define AI_CANONNAME    0x0002
50 #define AI_NUMERICHOST  0x0004
51 #define AI_NUMERICSERV  0x0008
52 #define AI_V4MAPPED     0x0010
53 #define AI_ALL          0x0020
54 #define AI_ADDRCONFIG   0x0040
55
56 /* Error return codes from RFC 3493. */
57 #define EAI_AGAIN       1       /* Temporary name resolution failure */
58 #define EAI_BADFLAGS    2       /* Invalid value in ai_flags parameter */
59 #define EAI_FAIL        3       /* Permanent name resolution failure */
60 #define EAI_FAMILY      4       /* Address family not recognized */
61 #define EAI_MEMORY      5       /* Memory allocation failure */
62 #define EAI_NONAME      6       /* nodename or servname unknown */
63 #define EAI_SERVICE     7       /* Service not recognized for socket type */
64 #define EAI_SOCKTYPE    8       /* Socket type not recognized */
65 #define EAI_SYSTEM      9       /* System error occurred, see errno */
66 #define EAI_OVERFLOW    10      /* An argument buffer overflowed */
67
68 /* Function prototypes. */
69 int getaddrinfo(const char *nodename, const char *servname,
70                 const struct addrinfo *hints, struct addrinfo **res);
71 void freeaddrinfo(struct addrinfo *ai);
72 const char *gai_strerror(int ecode);
73
74 #endif /* !HAVE_GETADDRINFO */
75 #endif /* _COMPAT_GETADDRINFO_H */