11363f04cSPaul Traina /*- 21363f04cSPaul Traina * Copyright (c) 1994, Garrett Wollman 31363f04cSPaul Traina * 41363f04cSPaul Traina * Redistribution and use in source and binary forms, with or without 51363f04cSPaul Traina * modification, are permitted provided that the following conditions 61363f04cSPaul Traina * are met: 71363f04cSPaul Traina * 1. Redistributions of source code must retain the above copyright 81363f04cSPaul Traina * notice, this list of conditions and the following disclaimer. 91363f04cSPaul Traina * 2. Redistributions in binary form must reproduce the above copyright 101363f04cSPaul Traina * notice, this list of conditions and the following disclaimer in the 111363f04cSPaul Traina * documentation and/or other materials provided with the distribution. 121363f04cSPaul Traina * 131363f04cSPaul Traina * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND 141363f04cSPaul Traina * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 151363f04cSPaul Traina * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 161363f04cSPaul Traina * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 171363f04cSPaul Traina * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 181363f04cSPaul Traina * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 191363f04cSPaul Traina * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 201363f04cSPaul Traina * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 211363f04cSPaul Traina * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 221363f04cSPaul Traina * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 231363f04cSPaul Traina * SUCH DAMAGE. 241363f04cSPaul Traina */ 251363f04cSPaul Traina 26333fc21eSDavid E. O'Brien #include <sys/cdefs.h> 27333fc21eSDavid E. O'Brien __FBSDID("$FreeBSD$"); 281363f04cSPaul Traina 29c5774e2dSJacques Vidrine #include "namespace.h" 30a2a77501SHajimu UMEMOTO #include "reentrant.h" 311363f04cSPaul Traina #include <sys/param.h> 321363f04cSPaul Traina #include <sys/socket.h> 331363f04cSPaul Traina #include <netinet/in.h> 341363f04cSPaul Traina #include <arpa/inet.h> 351363f04cSPaul Traina #include <netdb.h> 361363f04cSPaul Traina #include <stdio.h> 371363f04cSPaul Traina #include <ctype.h> 38d3ac2b30SHajimu UMEMOTO #include <errno.h> 39a2a77501SHajimu UMEMOTO #include <stdlib.h> 401363f04cSPaul Traina #include <string.h> 41248aee62SJacques Vidrine #include <stdarg.h> 42248aee62SJacques Vidrine #include <nsswitch.h> 43c5774e2dSJacques Vidrine #include "un-namespace.h" 44bcb131aaSHajimu UMEMOTO #include "netdb_private.h" 451363f04cSPaul Traina 46248aee62SJacques Vidrine extern int _ht_getnetbyname(void *, void *, va_list); 47248aee62SJacques Vidrine extern int _dns_getnetbyname(void *, void *, va_list); 48248aee62SJacques Vidrine extern int _nis_getnetbyname(void *, void *, va_list); 49248aee62SJacques Vidrine extern int _ht_getnetbyaddr(void *, void *, va_list); 50248aee62SJacques Vidrine extern int _dns_getnetbyaddr(void *, void *, va_list); 51248aee62SJacques Vidrine extern int _nis_getnetbyaddr(void *, void *, va_list); 521363f04cSPaul Traina 53248aee62SJacques Vidrine /* Network lookup order if nsswitch.conf is broken or nonexistant */ 54248aee62SJacques Vidrine static const ns_src default_src[] = { 55248aee62SJacques Vidrine { NSSRC_FILES, NS_SUCCESS }, 56248aee62SJacques Vidrine { NSSRC_DNS, NS_SUCCESS }, 57248aee62SJacques Vidrine { 0 } 581363f04cSPaul Traina }; 591363f04cSPaul Traina 60d3ac2b30SHajimu UMEMOTO NETDB_THREAD_ALLOC(netent_data) 61d3ac2b30SHajimu UMEMOTO NETDB_THREAD_ALLOC(netdata) 62d3ac2b30SHajimu UMEMOTO 63d3ac2b30SHajimu UMEMOTO static void 64d3ac2b30SHajimu UMEMOTO netent_data_free(void *ptr) 65d3ac2b30SHajimu UMEMOTO { 66d3ac2b30SHajimu UMEMOTO struct netent_data *ned = ptr; 67d3ac2b30SHajimu UMEMOTO 68d3ac2b30SHajimu UMEMOTO if (ned == NULL) 69d3ac2b30SHajimu UMEMOTO return; 70d3ac2b30SHajimu UMEMOTO ned->stayopen = 0; 71d3ac2b30SHajimu UMEMOTO _endnethtent(ned); 72d3ac2b30SHajimu UMEMOTO free(ned); 73d3ac2b30SHajimu UMEMOTO } 74a2a77501SHajimu UMEMOTO 75a2a77501SHajimu UMEMOTO static void 76a2a77501SHajimu UMEMOTO netdata_free(void *ptr) 771363f04cSPaul Traina { 78d3ac2b30SHajimu UMEMOTO free(ptr); 79a2a77501SHajimu UMEMOTO } 80a2a77501SHajimu UMEMOTO 81a2a77501SHajimu UMEMOTO int 82d3ac2b30SHajimu UMEMOTO __copy_netent(struct netent *ne, struct netent *nptr, char *buf, size_t buflen) 83a2a77501SHajimu UMEMOTO { 84d3ac2b30SHajimu UMEMOTO char *cp; 85d3ac2b30SHajimu UMEMOTO int i, n; 86d3ac2b30SHajimu UMEMOTO int numptr, len; 871363f04cSPaul Traina 88d3ac2b30SHajimu UMEMOTO /* Find out the amount of space required to store the answer. */ 89d3ac2b30SHajimu UMEMOTO numptr = 1; /* NULL ptr */ 90d3ac2b30SHajimu UMEMOTO len = (char *)ALIGN(buf) - buf; 91d3ac2b30SHajimu UMEMOTO for (i = 0; ne->n_aliases[i]; i++, numptr++) { 92d3ac2b30SHajimu UMEMOTO len += strlen(ne->n_aliases[i]) + 1; 93d3ac2b30SHajimu UMEMOTO } 94d3ac2b30SHajimu UMEMOTO len += strlen(ne->n_name) + 1; 95d3ac2b30SHajimu UMEMOTO len += numptr * sizeof(char*); 96d3ac2b30SHajimu UMEMOTO 97d3ac2b30SHajimu UMEMOTO if (len > (int)buflen) { 98d3ac2b30SHajimu UMEMOTO errno = ERANGE; 99d3ac2b30SHajimu UMEMOTO return (-1); 100d3ac2b30SHajimu UMEMOTO } 101d3ac2b30SHajimu UMEMOTO 102d3ac2b30SHajimu UMEMOTO /* copy net value and type */ 103d3ac2b30SHajimu UMEMOTO nptr->n_addrtype = ne->n_addrtype; 104d3ac2b30SHajimu UMEMOTO nptr->n_net = ne->n_net; 105d3ac2b30SHajimu UMEMOTO 106d3ac2b30SHajimu UMEMOTO cp = (char *)ALIGN(buf) + numptr * sizeof(char *); 107d3ac2b30SHajimu UMEMOTO 108d3ac2b30SHajimu UMEMOTO /* copy official name */ 109d3ac2b30SHajimu UMEMOTO n = strlen(ne->n_name) + 1; 110d3ac2b30SHajimu UMEMOTO strcpy(cp, ne->n_name); 111d3ac2b30SHajimu UMEMOTO nptr->n_name = cp; 112d3ac2b30SHajimu UMEMOTO cp += n; 113d3ac2b30SHajimu UMEMOTO 114d3ac2b30SHajimu UMEMOTO /* copy aliases */ 115d3ac2b30SHajimu UMEMOTO nptr->n_aliases = (char **)ALIGN(buf); 116d3ac2b30SHajimu UMEMOTO for (i = 0 ; ne->n_aliases[i]; i++) { 117d3ac2b30SHajimu UMEMOTO n = strlen(ne->n_aliases[i]) + 1; 118d3ac2b30SHajimu UMEMOTO strcpy(cp, ne->n_aliases[i]); 119d3ac2b30SHajimu UMEMOTO nptr->n_aliases[i] = cp; 120d3ac2b30SHajimu UMEMOTO cp += n; 121d3ac2b30SHajimu UMEMOTO } 122d3ac2b30SHajimu UMEMOTO nptr->n_aliases[i] = NULL; 123d3ac2b30SHajimu UMEMOTO 124d3ac2b30SHajimu UMEMOTO return (0); 125d3ac2b30SHajimu UMEMOTO } 126d3ac2b30SHajimu UMEMOTO 127d3ac2b30SHajimu UMEMOTO int 128d3ac2b30SHajimu UMEMOTO getnetbyname_r(const char *name, struct netent *ne, char *buffer, 129d3ac2b30SHajimu UMEMOTO size_t buflen, struct netent **result, int *h_errorp) 130d3ac2b30SHajimu UMEMOTO { 131d3ac2b30SHajimu UMEMOTO int rval, ret_errno; 1321363f04cSPaul Traina 133248aee62SJacques Vidrine static const ns_dtab dtab[] = { 134248aee62SJacques Vidrine NS_FILES_CB(_ht_getnetbyname, NULL) 135248aee62SJacques Vidrine { NSSRC_DNS, _dns_getnetbyname, NULL }, 136248aee62SJacques Vidrine NS_NIS_CB(_nis_getnetbyname, NULL) /* force -DHESIOD */ 137248aee62SJacques Vidrine { 0 } 138248aee62SJacques Vidrine }; 139248aee62SJacques Vidrine 140d3ac2b30SHajimu UMEMOTO rval = _nsdispatch((void *)result, dtab, NSDB_NETWORKS, 141d3ac2b30SHajimu UMEMOTO "getnetbyname_r", default_src, name, ne, buffer, buflen, 142d3ac2b30SHajimu UMEMOTO &ret_errno, h_errorp); 143248aee62SJacques Vidrine 144d3ac2b30SHajimu UMEMOTO return ((rval == NS_SUCCESS) ? 0 : -1); 1451363f04cSPaul Traina } 1461363f04cSPaul Traina 147a2a77501SHajimu UMEMOTO int 148d3ac2b30SHajimu UMEMOTO getnetbyaddr_r(uint32_t addr, int af, struct netent *ne, char *buffer, 149d3ac2b30SHajimu UMEMOTO size_t buflen, struct netent **result, int *h_errorp) 1501363f04cSPaul Traina { 151d3ac2b30SHajimu UMEMOTO int rval, ret_errno; 1521363f04cSPaul Traina 153248aee62SJacques Vidrine static const ns_dtab dtab[] = { 154248aee62SJacques Vidrine NS_FILES_CB(_ht_getnetbyaddr, NULL) 155248aee62SJacques Vidrine { NSSRC_DNS, _dns_getnetbyaddr, NULL }, 156248aee62SJacques Vidrine NS_NIS_CB(_nis_getnetbyaddr, NULL) /* force -DHESIOD */ 157248aee62SJacques Vidrine { 0 } 158248aee62SJacques Vidrine }; 1591363f04cSPaul Traina 160d3ac2b30SHajimu UMEMOTO rval = _nsdispatch((void *)result, dtab, NSDB_NETWORKS, 161d3ac2b30SHajimu UMEMOTO "getnetbyaddr_r", default_src, addr, af, ne, buffer, buflen, 162d3ac2b30SHajimu UMEMOTO &ret_errno, h_errorp); 163248aee62SJacques Vidrine 164d3ac2b30SHajimu UMEMOTO return ((rval == NS_SUCCESS) ? 0 : -1); 1651363f04cSPaul Traina } 166a2a77501SHajimu UMEMOTO 167a2a77501SHajimu UMEMOTO struct netent * 168a2a77501SHajimu UMEMOTO getnetbyname(const char *name) 169a2a77501SHajimu UMEMOTO { 170a2a77501SHajimu UMEMOTO struct netdata *nd; 171d3ac2b30SHajimu UMEMOTO struct netent *rval; 172d3ac2b30SHajimu UMEMOTO int ret_h_errno; 173a2a77501SHajimu UMEMOTO 174a2a77501SHajimu UMEMOTO if ((nd = __netdata_init()) == NULL) 175d3ac2b30SHajimu UMEMOTO return (NULL); 176d3ac2b30SHajimu UMEMOTO if (getnetbyname_r(name, &nd->net, nd->data, sizeof(nd->data), &rval, 177d3ac2b30SHajimu UMEMOTO &ret_h_errno) != 0) 178d3ac2b30SHajimu UMEMOTO return (NULL); 179d3ac2b30SHajimu UMEMOTO return (rval); 180a2a77501SHajimu UMEMOTO } 181a2a77501SHajimu UMEMOTO 182a2a77501SHajimu UMEMOTO struct netent * 183036ae3ddSHajimu UMEMOTO getnetbyaddr(uint32_t addr, int af) 184a2a77501SHajimu UMEMOTO { 185a2a77501SHajimu UMEMOTO struct netdata *nd; 186d3ac2b30SHajimu UMEMOTO struct netent *rval; 187d3ac2b30SHajimu UMEMOTO int ret_h_errno; 188a2a77501SHajimu UMEMOTO 189a2a77501SHajimu UMEMOTO if ((nd = __netdata_init()) == NULL) 190d3ac2b30SHajimu UMEMOTO return (NULL); 191d3ac2b30SHajimu UMEMOTO if (getnetbyaddr_r(addr, af, &nd->net, nd->data, sizeof(nd->data), 192d3ac2b30SHajimu UMEMOTO &rval, &ret_h_errno) != 0) 193d3ac2b30SHajimu UMEMOTO return (NULL); 194d3ac2b30SHajimu UMEMOTO return (rval); 195a2a77501SHajimu UMEMOTO } 196a2a77501SHajimu UMEMOTO 197a2a77501SHajimu UMEMOTO void 198a2a77501SHajimu UMEMOTO setnetent(int stayopen) 199a2a77501SHajimu UMEMOTO { 200d3ac2b30SHajimu UMEMOTO struct netent_data *ned; 201a2a77501SHajimu UMEMOTO 202d3ac2b30SHajimu UMEMOTO if ((ned = __netent_data_init()) == NULL) 203a2a77501SHajimu UMEMOTO return; 204d3ac2b30SHajimu UMEMOTO _setnethtent(stayopen, ned); 205d3ac2b30SHajimu UMEMOTO _setnetdnsent(stayopen); 206a2a77501SHajimu UMEMOTO } 207a2a77501SHajimu UMEMOTO 208a2a77501SHajimu UMEMOTO void 209a2a77501SHajimu UMEMOTO endnetent(void) 210a2a77501SHajimu UMEMOTO { 211d3ac2b30SHajimu UMEMOTO struct netent_data *ned; 212a2a77501SHajimu UMEMOTO 213d3ac2b30SHajimu UMEMOTO if ((ned = __netent_data_init()) == NULL) 214a2a77501SHajimu UMEMOTO return; 215d3ac2b30SHajimu UMEMOTO _endnethtent(ned); 216d3ac2b30SHajimu UMEMOTO _endnetdnsent(); 217a2a77501SHajimu UMEMOTO } 218