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