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