xref: /freebsd/lib/libc/net/netdb_private.h (revision b3e7694832e81d7a904a10f525f8797b753bf0d3)
196f79dcaSHajimu UMEMOTO /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3d915a14eSPedro F. Giffuni  *
496f79dcaSHajimu UMEMOTO  * Copyright (C) 2005 The FreeBSD Project.  All rights reserved.
596f79dcaSHajimu UMEMOTO  *
696f79dcaSHajimu UMEMOTO  * Redistribution and use in source and binary forms, with or without
796f79dcaSHajimu UMEMOTO  * modification, are permitted provided that the following conditions
896f79dcaSHajimu UMEMOTO  * are met:
996f79dcaSHajimu UMEMOTO  * 1. Redistributions of source code must retain the above copyright
1096f79dcaSHajimu UMEMOTO  *    notice, this list of conditions and the following disclaimer.
1196f79dcaSHajimu UMEMOTO  * 2. Redistributions in binary form must reproduce the above copyright
1296f79dcaSHajimu UMEMOTO  *    notice, this list of conditions and the following disclaimer in the
1396f79dcaSHajimu UMEMOTO  *    documentation and/or other materials provided with the distribution.
1496f79dcaSHajimu UMEMOTO  *
1596f79dcaSHajimu UMEMOTO  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1696f79dcaSHajimu UMEMOTO  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1796f79dcaSHajimu UMEMOTO  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1896f79dcaSHajimu UMEMOTO  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
1996f79dcaSHajimu UMEMOTO  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2096f79dcaSHajimu UMEMOTO  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2196f79dcaSHajimu UMEMOTO  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2296f79dcaSHajimu UMEMOTO  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2396f79dcaSHajimu UMEMOTO  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2496f79dcaSHajimu UMEMOTO  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2596f79dcaSHajimu UMEMOTO  * SUCH DAMAGE.
2696f79dcaSHajimu UMEMOTO  */
2796f79dcaSHajimu UMEMOTO 
2896f79dcaSHajimu UMEMOTO #ifndef _NETDB_PRIVATE_H_
2996f79dcaSHajimu UMEMOTO #define _NETDB_PRIVATE_H_
3096f79dcaSHajimu UMEMOTO 
31a2a77501SHajimu UMEMOTO #include <stdio.h>				/* XXX: for FILE */
3296f79dcaSHajimu UMEMOTO 
33d3ac2b30SHajimu UMEMOTO #define	NETDB_THREAD_ALLOC(name)					\
34d3ac2b30SHajimu UMEMOTO static struct name name;						\
35d3ac2b30SHajimu UMEMOTO static thread_key_t name##_key;						\
36d3ac2b30SHajimu UMEMOTO static once_t name##_init_once = ONCE_INITIALIZER;			\
37d3ac2b30SHajimu UMEMOTO static int name##_thr_keycreated = 0;					\
38d3ac2b30SHajimu UMEMOTO \
39d3ac2b30SHajimu UMEMOTO static void name##_free(void *);					\
40d3ac2b30SHajimu UMEMOTO \
41d3ac2b30SHajimu UMEMOTO static void								\
42d3ac2b30SHajimu UMEMOTO name##_keycreate(void)							\
43d3ac2b30SHajimu UMEMOTO {									\
44d3ac2b30SHajimu UMEMOTO 	name##_thr_keycreated =						\
45d3ac2b30SHajimu UMEMOTO 	    (thr_keycreate(&name##_key, name##_free) == 0);		\
46d3ac2b30SHajimu UMEMOTO }									\
47d3ac2b30SHajimu UMEMOTO \
48d3ac2b30SHajimu UMEMOTO struct name *								\
49d3ac2b30SHajimu UMEMOTO __##name##_init(void)							\
50d3ac2b30SHajimu UMEMOTO {									\
51d3ac2b30SHajimu UMEMOTO 	struct name *he;						\
52d3ac2b30SHajimu UMEMOTO 									\
53d3ac2b30SHajimu UMEMOTO 	if (thr_main() != 0)						\
54d3ac2b30SHajimu UMEMOTO 		return (&name);						\
55d3ac2b30SHajimu UMEMOTO 	if (thr_once(&name##_init_once, name##_keycreate) != 0 ||	\
56d3ac2b30SHajimu UMEMOTO 	    !name##_thr_keycreated)					\
57d3ac2b30SHajimu UMEMOTO 		return (NULL);						\
58d3ac2b30SHajimu UMEMOTO 	if ((he = thr_getspecific(name##_key)) != NULL)			\
59d3ac2b30SHajimu UMEMOTO 		return (he);						\
60d3ac2b30SHajimu UMEMOTO 	if ((he = calloc(1, sizeof(*he))) == NULL)			\
61d3ac2b30SHajimu UMEMOTO 		return (NULL);						\
62d3ac2b30SHajimu UMEMOTO 	if (thr_setspecific(name##_key, he) == 0)			\
63d3ac2b30SHajimu UMEMOTO 		return (he);						\
64d3ac2b30SHajimu UMEMOTO 	free(he);							\
65d3ac2b30SHajimu UMEMOTO 	return (NULL);							\
66d3ac2b30SHajimu UMEMOTO }
67d3ac2b30SHajimu UMEMOTO 
68a2a77501SHajimu UMEMOTO #define	_MAXALIASES	35
69a2a77501SHajimu UMEMOTO #define	_MAXLINELEN	1024
70a2a77501SHajimu UMEMOTO #define	_MAXADDRS	35
71aa2f4ec7SHajimu UMEMOTO #define	_HOSTBUFSIZE	(8 * 1024)
72a2a77501SHajimu UMEMOTO #define	_NETBUFSIZE	1025
73a2a77501SHajimu UMEMOTO 
74aa2f4ec7SHajimu UMEMOTO struct hostent_data {
75aa2f4ec7SHajimu UMEMOTO 	uint32_t host_addr[4];			/* IPv4 or IPv6 */
76aa2f4ec7SHajimu UMEMOTO 	char *h_addr_ptrs[_MAXADDRS + 1];
77aa2f4ec7SHajimu UMEMOTO 	char *host_aliases[_MAXALIASES];
78aa2f4ec7SHajimu UMEMOTO 	char hostbuf[_HOSTBUFSIZE];
79aa2f4ec7SHajimu UMEMOTO 	FILE *hostf;
80aa2f4ec7SHajimu UMEMOTO 	int stayopen;
81aa2f4ec7SHajimu UMEMOTO #ifdef YP
82aa2f4ec7SHajimu UMEMOTO 	char *yp_domain;
83aa2f4ec7SHajimu UMEMOTO #endif
84aa2f4ec7SHajimu UMEMOTO };
85aa2f4ec7SHajimu UMEMOTO 
86a2a77501SHajimu UMEMOTO struct netent_data {
87a2a77501SHajimu UMEMOTO 	char *net_aliases[_MAXALIASES];
88a2a77501SHajimu UMEMOTO 	char netbuf[_NETBUFSIZE];
89a2a77501SHajimu UMEMOTO 	FILE *netf;
90a2a77501SHajimu UMEMOTO 	int stayopen;
91a2a77501SHajimu UMEMOTO #ifdef YP
92a2a77501SHajimu UMEMOTO 	char *yp_domain;
93a2a77501SHajimu UMEMOTO #endif
94a2a77501SHajimu UMEMOTO };
9596f79dcaSHajimu UMEMOTO 
9692b6f7beSHajimu UMEMOTO struct protoent_data {
9792b6f7beSHajimu UMEMOTO 	FILE *fp;
98a2a77501SHajimu UMEMOTO 	char *aliases[_MAXALIASES];
9992b6f7beSHajimu UMEMOTO 	int stayopen;
100a2a77501SHajimu UMEMOTO 	char line[_MAXLINELEN + 1];
10192b6f7beSHajimu UMEMOTO };
10292b6f7beSHajimu UMEMOTO 
103aa2f4ec7SHajimu UMEMOTO struct hostdata {
104aa2f4ec7SHajimu UMEMOTO 	struct hostent host;
105d3ac2b30SHajimu UMEMOTO 	char data[sizeof(struct hostent_data)];
106aa2f4ec7SHajimu UMEMOTO };
107aa2f4ec7SHajimu UMEMOTO 
108a2a77501SHajimu UMEMOTO struct netdata {
109a2a77501SHajimu UMEMOTO 	struct netent net;
110d3ac2b30SHajimu UMEMOTO 	char data[sizeof(struct netent_data)];
111a2a77501SHajimu UMEMOTO };
112a2a77501SHajimu UMEMOTO 
113a2a77501SHajimu UMEMOTO struct protodata {
114a2a77501SHajimu UMEMOTO 	struct protoent proto;
115d3ac2b30SHajimu UMEMOTO 	char data[sizeof(struct protoent_data)];
116a2a77501SHajimu UMEMOTO };
117a2a77501SHajimu UMEMOTO 
118aa2f4ec7SHajimu UMEMOTO struct hostdata *__hostdata_init(void);
119d3ac2b30SHajimu UMEMOTO struct hostent *__hostent_init(void);
120d3ac2b30SHajimu UMEMOTO struct hostent_data *__hostent_data_init(void);
121a2a77501SHajimu UMEMOTO struct netdata *__netdata_init(void);
122d3ac2b30SHajimu UMEMOTO struct netent_data *__netent_data_init(void);
12392b6f7beSHajimu UMEMOTO struct protodata *__protodata_init(void);
124d3ac2b30SHajimu UMEMOTO struct protoent_data *__protoent_data_init(void);
125d3ac2b30SHajimu UMEMOTO int __copy_hostent(struct hostent *, struct hostent *, char *, size_t);
126d3ac2b30SHajimu UMEMOTO int __copy_netent(struct netent *, struct netent *, char *, size_t);
127d3ac2b30SHajimu UMEMOTO int __copy_protoent(struct protoent *, struct protoent *, char *, size_t);
128d3ac2b30SHajimu UMEMOTO 
129d3ac2b30SHajimu UMEMOTO void __endprotoent_p(struct protoent_data *);
130d3ac2b30SHajimu UMEMOTO int __getprotoent_p(struct protoent *, struct protoent_data *);
131d3ac2b30SHajimu UMEMOTO void __setprotoent_p(int, struct protoent_data *);
132bcb131aaSHajimu UMEMOTO void _endhostdnsent(void);
133aa2f4ec7SHajimu UMEMOTO void _endhosthtent(struct hostent_data *);
134bcb131aaSHajimu UMEMOTO void _endnetdnsent(void);
135a2a77501SHajimu UMEMOTO void _endnethtent(struct netent_data *);
136bcb131aaSHajimu UMEMOTO void _map_v4v6_address(const char *, char *);
137850bc9afSHajimu UMEMOTO void _map_v4v6_hostent(struct hostent *, char **, char *);
138bcb131aaSHajimu UMEMOTO void _sethostdnsent(int);
139aa2f4ec7SHajimu UMEMOTO void _sethosthtent(int, struct hostent_data *);
140bcb131aaSHajimu UMEMOTO void _setnetdnsent(int);
141a2a77501SHajimu UMEMOTO void _setnethtent(int, struct netent_data *);
14296f79dcaSHajimu UMEMOTO 
1439a50fd2dSCraig Rodrigues struct hostent *__dns_getanswer(const char *, int, const char *, int);
1449a50fd2dSCraig Rodrigues int _dns_gethostbyaddr(void *, void *, va_list);
1459a50fd2dSCraig Rodrigues int _dns_gethostbyname(void *, void *, va_list);
1469a50fd2dSCraig Rodrigues int _dns_getnetbyaddr(void *, void *, va_list);
1479a50fd2dSCraig Rodrigues int _dns_getnetbyname(void *, void *, va_list);
1489a50fd2dSCraig Rodrigues int _ht_gethostbyaddr(void *, void *, va_list);
1499a50fd2dSCraig Rodrigues int _ht_gethostbyname(void *, void *, va_list);
1509a50fd2dSCraig Rodrigues int _ht_getnetbyaddr(void *, void *, va_list);
1519a50fd2dSCraig Rodrigues int _ht_getnetbyname(void *, void *, va_list);
1529a50fd2dSCraig Rodrigues int _nis_gethostbyaddr(void *, void *, va_list);
1539a50fd2dSCraig Rodrigues int _nis_gethostbyname(void *, void *, va_list);
1549a50fd2dSCraig Rodrigues int _nis_getnetbyaddr(void *, void *, va_list);
1559a50fd2dSCraig Rodrigues int _nis_getnetbyname(void *, void *, va_list);
1569a50fd2dSCraig Rodrigues #ifdef NS_CACHING
1579a50fd2dSCraig Rodrigues int __proto_id_func(char *, size_t *, va_list, void *);
1589a50fd2dSCraig Rodrigues int __proto_marshal_func(char *, size_t *, void *, va_list, void *);
1599a50fd2dSCraig Rodrigues int __proto_unmarshal_func(char *, size_t, void *, va_list, void *);
1609a50fd2dSCraig Rodrigues #endif
1619a50fd2dSCraig Rodrigues 
16296f79dcaSHajimu UMEMOTO #endif /* _NETDB_PRIVATE_H_ */
163