xref: /freebsd/lib/libc/net/getnetnamadr.c (revision d3ac2b30d40b8257bbf8680487708e05e3de8ea7)
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