Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sudo-project
GitHub Repository: sudo-project/sudo
Path: blob/main/include/compat/getaddrinfo.h
1532 views
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 system getaddrinfo implementation 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 <[email protected]>
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
sudo_dso_public int sudo_getaddrinfo(const char *nodename, const char *servname,
70
const struct addrinfo *hints, struct addrinfo **res);
71
sudo_dso_public void sudo_freeaddrinfo(struct addrinfo *ai);
72
sudo_dso_public const char *sudo_gai_strerror(int ecode);
73
74
/* Map sudo_* to RFC 3493 names. */
75
#undef getaddrinfo
76
#define getaddrinfo(_a, _b, _c, _d) sudo_getaddrinfo((_a), (_b), (_c), (_d))
77
#undef freeaddrinfo
78
#define freeaddrinfo(_a) sudo_freeaddrinfo((_a))
79
#undef gai_strerror
80
#define gai_strerror(_a) sudo_gai_strerror((_a))
81
82
#endif /* !HAVE_GETADDRINFO */
83
#endif /* COMPAT_GETADDRINFO_H */
84
85