1/*
2 * Copyright 2023, Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _NETDB_H_
6#define _NETDB_H_
7
8#include <stdint.h>
9#include <netinet/in.h>
10
11
12#ifdef __cplusplus
13extern "C" {
14#endif
15
16
17struct hostent {
18	char* h_name;
19	char** h_aliases;
20	int h_addrtype;
21	int h_length;
22	char** h_addr_list;
23#define	h_addr	h_addr_list[0]
24};
25
26struct netent {
27	char* n_name;
28	char** n_aliases;
29	int n_addrtype;
30	in_addr_t n_net;
31};
32
33struct servent {
34	char* s_name;
35	char** s_aliases;
36	int s_port;
37	char* s_proto;
38};
39
40struct protoent {
41	char* p_name;
42	char** p_aliases;
43	int p_proto;
44};
45
46struct addrinfo {
47	int ai_flags;
48	int ai_family;
49	int ai_socktype;
50	int ai_protocol;
51	socklen_t ai_addrlen;
52	char* ai_canonname;
53	struct sockaddr* ai_addr;
54	struct addrinfo* ai_next;
55};
56
57
58#if defined(_DEFAULT_SOURCE)
59extern int * __h_errno(void);
60#define	h_errno (*__h_errno())
61
62void herror(const char *);
63const char *hstrerror(int);
64
65#define	NETDB_INTERNAL	-1
66#define	NETDB_SUCCESS	0
67#define	HOST_NOT_FOUND	1
68#define	TRY_AGAIN		2
69#define	NO_RECOVERY		3
70#define	NO_DATA			4
71#define	NO_ADDRESS		NO_DATA
72#endif
73
74
75/* getaddrinfo, getnameinfo */
76#define	AI_PASSIVE		0x00000001
77#define	AI_CANONNAME	0x00000002
78#define AI_NUMERICHOST	0x00000004
79#define AI_NUMERICSERV	0x00000008
80
81#define AI_ALL			0x00000100
82#define AI_V4MAPPED_CFG	0x00000200
83#define AI_ADDRCONFIG	0x00000400
84#define AI_V4MAPPED		0x00000800
85
86#define	AI_MASK			\
87	(AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST | AI_NUMERICSERV | AI_ADDRCONFIG)
88
89
90/* getnameinfo */
91#if defined(_DEFAULT_SOURCE)
92#define	NI_MAXHOST		1025
93#define	NI_MAXSERV		32
94
95#define SCOPE_DELIMITER	'%'
96#endif
97
98#define	NI_NOFQDN		0x00000001
99#define	NI_NUMERICHOST	0x00000002
100#define	NI_NAMEREQD		0x00000004
101#define	NI_NUMERICSERV	0x00000008
102#define	NI_DGRAM		0x00000010
103#define NI_NUMERICSCOPE	0x00000040
104
105
106/* getaddrinfo */
107#define	EAI_ADDRFAMILY	1
108#define	EAI_AGAIN	 	2
109#define	EAI_BADFLAGS	3
110#define	EAI_FAIL		4
111#define	EAI_FAMILY		5
112#define	EAI_MEMORY		6
113#define	EAI_NODATA		7
114#define	EAI_NONAME		8
115#define	EAI_SERVICE		9
116#define	EAI_SOCKTYPE	10
117#define	EAI_SYSTEM		11
118#define EAI_BADHINTS	12
119#define EAI_PROTOCOL	13
120#define EAI_OVERFLOW	14
121#define EAI_MAX			15
122
123
124void sethostent(int);
125void endhostent(void);
126struct hostent* gethostent(void);
127
128void setnetent(int);
129void endnetent(void);
130struct netent* getnetbyaddr(uint32_t, int);
131struct netent* getnetbyname(const char *);
132struct netent* getnetent(void);
133
134void setprotoent(int);
135void endprotoent(void);
136struct protoent* getprotoent(void);
137struct protoent* getprotobyname(const char *);
138struct protoent* getprotobynumber(int);
139
140void setservent(int);
141void endservent(void);
142struct servent* getservent(void);
143struct servent* getservbyname(const char *, const char *);
144struct servent* getservbyport(int, const char *);
145
146struct hostent* gethostbyaddr(const void *address, socklen_t length, int type);
147struct hostent* gethostbyname(const char *name);
148struct hostent* gethostbyname2(const char *name, int type);
149
150int getaddrinfo(const char *, const char *, const struct addrinfo *,
151	struct addrinfo **);
152int getnameinfo(const struct sockaddr *, socklen_t, char *, socklen_t,
153	char *, socklen_t, int);
154void freeaddrinfo(struct addrinfo *);
155
156const char* gai_strerror(int);
157
158
159#ifdef __cplusplus
160}
161#endif
162
163#endif /* _NETDB_H_ */
164