xref: /freebsd/lib/libc/net/netdb_private.h (revision d915a14ef094c8dfc1a5aee70e135abfec01d0f1)
196f79dcaSHajimu UMEMOTO /*-
2*d915a14eSPedro F. Giffuni  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3*d915a14eSPedro 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  * $FreeBSD$
2896f79dcaSHajimu UMEMOTO  */
2996f79dcaSHajimu UMEMOTO 
3096f79dcaSHajimu UMEMOTO #ifndef _NETDB_PRIVATE_H_
3196f79dcaSHajimu UMEMOTO #define _NETDB_PRIVATE_H_
3296f79dcaSHajimu UMEMOTO 
33a2a77501SHajimu UMEMOTO #include <stdio.h>				/* XXX: for FILE */
3496f79dcaSHajimu UMEMOTO 
35d3ac2b30SHajimu UMEMOTO #define	NETDB_THREAD_ALLOC(name)					\
36d3ac2b30SHajimu UMEMOTO static struct name name;						\
37d3ac2b30SHajimu UMEMOTO static thread_key_t name##_key;						\
38d3ac2b30SHajimu UMEMOTO static once_t name##_init_once = ONCE_INITIALIZER;			\
39d3ac2b30SHajimu UMEMOTO static int name##_thr_keycreated = 0;					\
40d3ac2b30SHajimu UMEMOTO \
41d3ac2b30SHajimu UMEMOTO static void name##_free(void *);					\
42d3ac2b30SHajimu UMEMOTO \
43d3ac2b30SHajimu UMEMOTO static void								\
44d3ac2b30SHajimu UMEMOTO name##_keycreate(void)							\
45d3ac2b30SHajimu UMEMOTO {									\
46d3ac2b30SHajimu UMEMOTO 	name##_thr_keycreated =						\
47d3ac2b30SHajimu UMEMOTO 	    (thr_keycreate(&name##_key, name##_free) == 0);		\
48d3ac2b30SHajimu UMEMOTO }									\
49d3ac2b30SHajimu UMEMOTO \
50d3ac2b30SHajimu UMEMOTO struct name *								\
51d3ac2b30SHajimu UMEMOTO __##name##_init(void)							\
52d3ac2b30SHajimu UMEMOTO {									\
53d3ac2b30SHajimu UMEMOTO 	struct name *he;						\
54d3ac2b30SHajimu UMEMOTO 									\
55d3ac2b30SHajimu UMEMOTO 	if (thr_main() != 0)						\
56d3ac2b30SHajimu UMEMOTO 		return (&name);						\
57d3ac2b30SHajimu UMEMOTO 	if (thr_once(&name##_init_once, name##_keycreate) != 0 ||	\
58d3ac2b30SHajimu UMEMOTO 	    !name##_thr_keycreated)					\
59d3ac2b30SHajimu UMEMOTO 		return (NULL);						\
60d3ac2b30SHajimu UMEMOTO 	if ((he = thr_getspecific(name##_key)) != NULL)			\
61d3ac2b30SHajimu UMEMOTO 		return (he);						\
62d3ac2b30SHajimu UMEMOTO 	if ((he = calloc(1, sizeof(*he))) == NULL)			\
63d3ac2b30SHajimu UMEMOTO 		return (NULL);						\
64d3ac2b30SHajimu UMEMOTO 	if (thr_setspecific(name##_key, he) == 0)			\
65d3ac2b30SHajimu UMEMOTO 		return (he);						\
66d3ac2b30SHajimu UMEMOTO 	free(he);							\
67d3ac2b30SHajimu UMEMOTO 	return (NULL);							\
68d3ac2b30SHajimu UMEMOTO }
69d3ac2b30SHajimu UMEMOTO 
70a2a77501SHajimu UMEMOTO #define	_MAXALIASES	35
71a2a77501SHajimu UMEMOTO #define	_MAXLINELEN	1024
72a2a77501SHajimu UMEMOTO #define	_MAXADDRS	35
73aa2f4ec7SHajimu UMEMOTO #define	_HOSTBUFSIZE	(8 * 1024)
74a2a77501SHajimu UMEMOTO #define	_NETBUFSIZE	1025
75a2a77501SHajimu UMEMOTO 
76aa2f4ec7SHajimu UMEMOTO struct hostent_data {
77aa2f4ec7SHajimu UMEMOTO 	uint32_t host_addr[4];			/* IPv4 or IPv6 */
78aa2f4ec7SHajimu UMEMOTO 	char *h_addr_ptrs[_MAXADDRS + 1];
79aa2f4ec7SHajimu UMEMOTO 	char *host_aliases[_MAXALIASES];
80aa2f4ec7SHajimu UMEMOTO 	char hostbuf[_HOSTBUFSIZE];
81aa2f4ec7SHajimu UMEMOTO 	FILE *hostf;
82aa2f4ec7SHajimu UMEMOTO 	int stayopen;
83aa2f4ec7SHajimu UMEMOTO #ifdef YP
84aa2f4ec7SHajimu UMEMOTO 	char *yp_domain;
85aa2f4ec7SHajimu UMEMOTO #endif
86aa2f4ec7SHajimu UMEMOTO };
87aa2f4ec7SHajimu UMEMOTO 
88a2a77501SHajimu UMEMOTO struct netent_data {
89a2a77501SHajimu UMEMOTO 	char *net_aliases[_MAXALIASES];
90a2a77501SHajimu UMEMOTO 	char netbuf[_NETBUFSIZE];
91a2a77501SHajimu UMEMOTO 	FILE *netf;
92a2a77501SHajimu UMEMOTO 	int stayopen;
93a2a77501SHajimu UMEMOTO #ifdef YP
94a2a77501SHajimu UMEMOTO 	char *yp_domain;
95a2a77501SHajimu UMEMOTO #endif
96a2a77501SHajimu UMEMOTO };
9796f79dcaSHajimu UMEMOTO 
9892b6f7beSHajimu UMEMOTO struct protoent_data {
9992b6f7beSHajimu UMEMOTO 	FILE *fp;
100a2a77501SHajimu UMEMOTO 	char *aliases[_MAXALIASES];
10192b6f7beSHajimu UMEMOTO 	int stayopen;
102a2a77501SHajimu UMEMOTO 	char line[_MAXLINELEN + 1];
10392b6f7beSHajimu UMEMOTO };
10492b6f7beSHajimu UMEMOTO 
105aa2f4ec7SHajimu UMEMOTO struct hostdata {
106aa2f4ec7SHajimu UMEMOTO 	struct hostent host;
107d3ac2b30SHajimu UMEMOTO 	char data[sizeof(struct hostent_data)];
108aa2f4ec7SHajimu UMEMOTO };
109aa2f4ec7SHajimu UMEMOTO 
110a2a77501SHajimu UMEMOTO struct netdata {
111a2a77501SHajimu UMEMOTO 	struct netent net;
112d3ac2b30SHajimu UMEMOTO 	char data[sizeof(struct netent_data)];
113a2a77501SHajimu UMEMOTO };
114a2a77501SHajimu UMEMOTO 
115a2a77501SHajimu UMEMOTO struct protodata {
116a2a77501SHajimu UMEMOTO 	struct protoent proto;
117d3ac2b30SHajimu UMEMOTO 	char data[sizeof(struct protoent_data)];
118a2a77501SHajimu UMEMOTO };
119a2a77501SHajimu UMEMOTO 
120aa2f4ec7SHajimu UMEMOTO struct hostdata *__hostdata_init(void);
121d3ac2b30SHajimu UMEMOTO struct hostent *__hostent_init(void);
122d3ac2b30SHajimu UMEMOTO struct hostent_data *__hostent_data_init(void);
123a2a77501SHajimu UMEMOTO struct netdata *__netdata_init(void);
124d3ac2b30SHajimu UMEMOTO struct netent_data *__netent_data_init(void);
12592b6f7beSHajimu UMEMOTO struct protodata *__protodata_init(void);
126d3ac2b30SHajimu UMEMOTO struct protoent_data *__protoent_data_init(void);
127d3ac2b30SHajimu UMEMOTO int __copy_hostent(struct hostent *, struct hostent *, char *, size_t);
128d3ac2b30SHajimu UMEMOTO int __copy_netent(struct netent *, struct netent *, char *, size_t);
129d3ac2b30SHajimu UMEMOTO int __copy_protoent(struct protoent *, struct protoent *, char *, size_t);
130d3ac2b30SHajimu UMEMOTO 
131d3ac2b30SHajimu UMEMOTO void __endprotoent_p(struct protoent_data *);
132d3ac2b30SHajimu UMEMOTO int __getprotoent_p(struct protoent *, struct protoent_data *);
133d3ac2b30SHajimu UMEMOTO void __setprotoent_p(int, struct protoent_data *);
134bcb131aaSHajimu UMEMOTO void _endhostdnsent(void);
135aa2f4ec7SHajimu UMEMOTO void _endhosthtent(struct hostent_data *);
136bcb131aaSHajimu UMEMOTO void _endnetdnsent(void);
137a2a77501SHajimu UMEMOTO void _endnethtent(struct netent_data *);
138bcb131aaSHajimu UMEMOTO void _map_v4v6_address(const char *, char *);
139850bc9afSHajimu UMEMOTO void _map_v4v6_hostent(struct hostent *, char **, char *);
140bcb131aaSHajimu UMEMOTO void _sethostdnsent(int);
141aa2f4ec7SHajimu UMEMOTO void _sethosthtent(int, struct hostent_data *);
142bcb131aaSHajimu UMEMOTO void _setnetdnsent(int);
143a2a77501SHajimu UMEMOTO void _setnethtent(int, struct netent_data *);
14496f79dcaSHajimu UMEMOTO 
1459a50fd2dSCraig Rodrigues struct hostent *__dns_getanswer(const char *, int, const char *, int);
1469a50fd2dSCraig Rodrigues int _dns_gethostbyaddr(void *, void *, va_list);
1479a50fd2dSCraig Rodrigues int _dns_gethostbyname(void *, void *, va_list);
1489a50fd2dSCraig Rodrigues int _dns_getnetbyaddr(void *, void *, va_list);
1499a50fd2dSCraig Rodrigues int _dns_getnetbyname(void *, void *, va_list);
1509a50fd2dSCraig Rodrigues int _ht_gethostbyaddr(void *, void *, va_list);
1519a50fd2dSCraig Rodrigues int _ht_gethostbyname(void *, void *, va_list);
1529a50fd2dSCraig Rodrigues int _ht_getnetbyaddr(void *, void *, va_list);
1539a50fd2dSCraig Rodrigues int _ht_getnetbyname(void *, void *, va_list);
1549a50fd2dSCraig Rodrigues int _nis_gethostbyaddr(void *, void *, va_list);
1559a50fd2dSCraig Rodrigues int _nis_gethostbyname(void *, void *, va_list);
1569a50fd2dSCraig Rodrigues int _nis_getnetbyaddr(void *, void *, va_list);
1579a50fd2dSCraig Rodrigues int _nis_getnetbyname(void *, void *, va_list);
1589a50fd2dSCraig Rodrigues #ifdef NS_CACHING
1599a50fd2dSCraig Rodrigues int __proto_id_func(char *, size_t *, va_list, void *);
1609a50fd2dSCraig Rodrigues int __proto_marshal_func(char *, size_t *, void *, va_list, void *);
1619a50fd2dSCraig Rodrigues int __proto_unmarshal_func(char *, size_t, void *, va_list, void *);
1629a50fd2dSCraig Rodrigues #endif
1639a50fd2dSCraig Rodrigues 
16496f79dcaSHajimu UMEMOTO #endif /* _NETDB_PRIVATE_H_ */
165