xref: /freebsd/lib/libc/net/getnetnamadr.c (revision 32223c1b7dea9bcf5ccb35a6462fb6a29a344910)
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"
4506a99fe3SHajimu UMEMOTO #ifdef NS_CACHING
4606a99fe3SHajimu UMEMOTO #include "nscache.h"
4706a99fe3SHajimu UMEMOTO #endif
481363f04cSPaul Traina 
49*32223c1bSPedro F. Giffuni /* Network lookup order if nsswitch.conf is broken or nonexistent */
50248aee62SJacques Vidrine static const ns_src default_src[] = {
51248aee62SJacques Vidrine 	{ NSSRC_FILES, NS_SUCCESS },
52248aee62SJacques Vidrine 	{ NSSRC_DNS, NS_SUCCESS },
53248aee62SJacques Vidrine 	{ 0 }
541363f04cSPaul Traina };
551363f04cSPaul Traina 
56d3ac2b30SHajimu UMEMOTO NETDB_THREAD_ALLOC(netent_data)
57d3ac2b30SHajimu UMEMOTO NETDB_THREAD_ALLOC(netdata)
58d3ac2b30SHajimu UMEMOTO 
5906a99fe3SHajimu UMEMOTO #ifdef NS_CACHING
6006a99fe3SHajimu UMEMOTO static int
6106a99fe3SHajimu UMEMOTO net_id_func(char *buffer, size_t *buffer_size, va_list ap, void *cache_mdata)
6206a99fe3SHajimu UMEMOTO {
6306a99fe3SHajimu UMEMOTO 	char *name;
6406a99fe3SHajimu UMEMOTO 	uint32_t net;
6506a99fe3SHajimu UMEMOTO 	int type;
6606a99fe3SHajimu UMEMOTO 
6706a99fe3SHajimu UMEMOTO 	size_t desired_size, size;
6806a99fe3SHajimu UMEMOTO 	enum nss_lookup_type lookup_type;
6906a99fe3SHajimu UMEMOTO 	int res = NS_UNAVAIL;
7006a99fe3SHajimu UMEMOTO 
7106a99fe3SHajimu UMEMOTO 	lookup_type = (enum nss_lookup_type)cache_mdata;
7206a99fe3SHajimu UMEMOTO 	switch (lookup_type) {
7306a99fe3SHajimu UMEMOTO 	case nss_lt_name:
7406a99fe3SHajimu UMEMOTO 		name = va_arg(ap, char *);
7506a99fe3SHajimu UMEMOTO 
7606a99fe3SHajimu UMEMOTO 		size = strlen(name);
7706a99fe3SHajimu UMEMOTO 		desired_size = sizeof(enum nss_lookup_type) + size + 1;
7806a99fe3SHajimu UMEMOTO 		if (desired_size > *buffer_size) {
7906a99fe3SHajimu UMEMOTO 			res = NS_RETURN;
8006a99fe3SHajimu UMEMOTO 			goto fin;
8106a99fe3SHajimu UMEMOTO 		}
8206a99fe3SHajimu UMEMOTO 
8306a99fe3SHajimu UMEMOTO 		memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type));
8406a99fe3SHajimu UMEMOTO 		memcpy(buffer + sizeof(enum nss_lookup_type), name, size + 1);
8506a99fe3SHajimu UMEMOTO 
8606a99fe3SHajimu UMEMOTO 		res = NS_SUCCESS;
8706a99fe3SHajimu UMEMOTO 		break;
8806a99fe3SHajimu UMEMOTO 	case nss_lt_id:
8906a99fe3SHajimu UMEMOTO 		net = va_arg(ap, uint32_t);
9006a99fe3SHajimu UMEMOTO 		type = va_arg(ap, int);
9106a99fe3SHajimu UMEMOTO 
9206a99fe3SHajimu UMEMOTO 		desired_size = sizeof(enum nss_lookup_type) +
9306a99fe3SHajimu UMEMOTO 		    sizeof(uint32_t) + sizeof(int);
9406a99fe3SHajimu UMEMOTO 		if (desired_size > *buffer_size) {
9506a99fe3SHajimu UMEMOTO 			res = NS_RETURN;
9606a99fe3SHajimu UMEMOTO 			goto fin;
9706a99fe3SHajimu UMEMOTO 		}
9806a99fe3SHajimu UMEMOTO 
9906a99fe3SHajimu UMEMOTO 		memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type));
10006a99fe3SHajimu UMEMOTO 		memcpy(buffer + sizeof(enum nss_lookup_type), &net,
10106a99fe3SHajimu UMEMOTO 		    sizeof(uint32_t));
10206a99fe3SHajimu UMEMOTO 		memcpy(buffer + sizeof(enum nss_lookup_type) + sizeof(uint32_t),
10306a99fe3SHajimu UMEMOTO 		    &type, sizeof(int));
10406a99fe3SHajimu UMEMOTO 
10506a99fe3SHajimu UMEMOTO 		res = NS_SUCCESS;
10606a99fe3SHajimu UMEMOTO 		break;
10706a99fe3SHajimu UMEMOTO 	default:
10806a99fe3SHajimu UMEMOTO 		/* should be unreachable */
10906a99fe3SHajimu UMEMOTO 		return (NS_UNAVAIL);
11006a99fe3SHajimu UMEMOTO 	}
11106a99fe3SHajimu UMEMOTO 
11206a99fe3SHajimu UMEMOTO fin:
11306a99fe3SHajimu UMEMOTO 	*buffer_size = desired_size;
11406a99fe3SHajimu UMEMOTO 	return (res);
11506a99fe3SHajimu UMEMOTO }
11606a99fe3SHajimu UMEMOTO 
11706a99fe3SHajimu UMEMOTO 
11806a99fe3SHajimu UMEMOTO static int
11906a99fe3SHajimu UMEMOTO net_marshal_func(char *buffer, size_t *buffer_size, void *retval, va_list ap,
12006a99fe3SHajimu UMEMOTO     void *cache_mdata)
12106a99fe3SHajimu UMEMOTO {
12206a99fe3SHajimu UMEMOTO 	char *name;
12306a99fe3SHajimu UMEMOTO 	uint32_t net;
12406a99fe3SHajimu UMEMOTO 	int type;
12506a99fe3SHajimu UMEMOTO 	struct netent *ne;
12606a99fe3SHajimu UMEMOTO 	char *orig_buf;
12706a99fe3SHajimu UMEMOTO 	size_t orig_buf_size;
12806a99fe3SHajimu UMEMOTO 
12906a99fe3SHajimu UMEMOTO 	struct netent new_ne;
13006a99fe3SHajimu UMEMOTO 	size_t desired_size, size, aliases_size;
13106a99fe3SHajimu UMEMOTO 	char *p;
13206a99fe3SHajimu UMEMOTO 	char **alias;
13306a99fe3SHajimu UMEMOTO 
13406a99fe3SHajimu UMEMOTO 	switch ((enum nss_lookup_type)cache_mdata) {
13506a99fe3SHajimu UMEMOTO 	case nss_lt_name:
13606a99fe3SHajimu UMEMOTO 		name = va_arg(ap, char *);
13706a99fe3SHajimu UMEMOTO 		break;
13806a99fe3SHajimu UMEMOTO 	case nss_lt_id:
13906a99fe3SHajimu UMEMOTO 		net = va_arg(ap, uint32_t);
14006a99fe3SHajimu UMEMOTO 		type = va_arg(ap, int);
14106a99fe3SHajimu UMEMOTO 	break;
14206a99fe3SHajimu UMEMOTO 	case nss_lt_all:
14306a99fe3SHajimu UMEMOTO 		break;
14406a99fe3SHajimu UMEMOTO 	default:
14506a99fe3SHajimu UMEMOTO 		/* should be unreachable */
14606a99fe3SHajimu UMEMOTO 		return (NS_UNAVAIL);
14706a99fe3SHajimu UMEMOTO 	}
14806a99fe3SHajimu UMEMOTO 
14906a99fe3SHajimu UMEMOTO 	ne = va_arg(ap, struct netent *);
15006a99fe3SHajimu UMEMOTO 	orig_buf = va_arg(ap, char *);
15106a99fe3SHajimu UMEMOTO 	orig_buf_size = va_arg(ap, size_t);
15206a99fe3SHajimu UMEMOTO 
15306a99fe3SHajimu UMEMOTO 	desired_size = _ALIGNBYTES + sizeof(struct netent) + sizeof(char *);
15406a99fe3SHajimu UMEMOTO 	if (ne->n_name != NULL)
15506a99fe3SHajimu UMEMOTO 		desired_size += strlen(ne->n_name) + 1;
15606a99fe3SHajimu UMEMOTO 
15706a99fe3SHajimu UMEMOTO 	if (ne->n_aliases != NULL) {
15806a99fe3SHajimu UMEMOTO 		aliases_size = 0;
15906a99fe3SHajimu UMEMOTO 		for (alias = ne->n_aliases; *alias; ++alias) {
16006a99fe3SHajimu UMEMOTO 			desired_size += strlen(*alias) + 1;
16106a99fe3SHajimu UMEMOTO 			++aliases_size;
16206a99fe3SHajimu UMEMOTO 		}
16306a99fe3SHajimu UMEMOTO 
16406a99fe3SHajimu UMEMOTO 		desired_size += _ALIGNBYTES +
16506a99fe3SHajimu UMEMOTO 		    (aliases_size + 1) * sizeof(char *);
16606a99fe3SHajimu UMEMOTO 	}
16706a99fe3SHajimu UMEMOTO 
16806a99fe3SHajimu UMEMOTO 	if (*buffer_size < desired_size) {
16906a99fe3SHajimu UMEMOTO 		/* this assignment is here for future use */
17006a99fe3SHajimu UMEMOTO 		*buffer_size = desired_size;
17106a99fe3SHajimu UMEMOTO 		return (NS_RETURN);
17206a99fe3SHajimu UMEMOTO 	}
17306a99fe3SHajimu UMEMOTO 
17406a99fe3SHajimu UMEMOTO 	memcpy(&new_ne, ne, sizeof(struct netent));
17506a99fe3SHajimu UMEMOTO 
17606a99fe3SHajimu UMEMOTO 	*buffer_size = desired_size;
17706a99fe3SHajimu UMEMOTO 	memset(buffer, 0, desired_size);
17806a99fe3SHajimu UMEMOTO 	p = buffer + sizeof(struct netent) + sizeof(char *);
17906a99fe3SHajimu UMEMOTO 	memcpy(buffer + sizeof(struct netent), &p, sizeof(char *));
18006a99fe3SHajimu UMEMOTO 	p = (char *)_ALIGN(p);
18106a99fe3SHajimu UMEMOTO 
18206a99fe3SHajimu UMEMOTO 	if (new_ne.n_name != NULL) {
18306a99fe3SHajimu UMEMOTO 		size = strlen(new_ne.n_name);
18406a99fe3SHajimu UMEMOTO 		memcpy(p, new_ne.n_name, size);
18506a99fe3SHajimu UMEMOTO 		new_ne.n_name = p;
18606a99fe3SHajimu UMEMOTO 		p += size + 1;
18706a99fe3SHajimu UMEMOTO 	}
18806a99fe3SHajimu UMEMOTO 
18906a99fe3SHajimu UMEMOTO 	if (new_ne.n_aliases != NULL) {
19006a99fe3SHajimu UMEMOTO 		p = (char *)_ALIGN(p);
19106a99fe3SHajimu UMEMOTO 		memcpy(p, new_ne.n_aliases, sizeof(char *) * aliases_size);
19206a99fe3SHajimu UMEMOTO 		new_ne.n_aliases = (char **)p;
19306a99fe3SHajimu UMEMOTO 		p += sizeof(char *) * (aliases_size + 1);
19406a99fe3SHajimu UMEMOTO 
19506a99fe3SHajimu UMEMOTO 		for (alias = new_ne.n_aliases; *alias; ++alias) {
19606a99fe3SHajimu UMEMOTO 			size = strlen(*alias);
19706a99fe3SHajimu UMEMOTO 			memcpy(p, *alias, size);
19806a99fe3SHajimu UMEMOTO 			*alias = p;
19906a99fe3SHajimu UMEMOTO 			p += size + 1;
20006a99fe3SHajimu UMEMOTO 		}
20106a99fe3SHajimu UMEMOTO 	}
20206a99fe3SHajimu UMEMOTO 
20306a99fe3SHajimu UMEMOTO 	memcpy(buffer, &new_ne, sizeof(struct netent));
20406a99fe3SHajimu UMEMOTO 	return (NS_SUCCESS);
20506a99fe3SHajimu UMEMOTO }
20606a99fe3SHajimu UMEMOTO 
20706a99fe3SHajimu UMEMOTO static int
20806a99fe3SHajimu UMEMOTO net_unmarshal_func(char *buffer, size_t buffer_size, void *retval, va_list ap,
20906a99fe3SHajimu UMEMOTO     void *cache_mdata)
21006a99fe3SHajimu UMEMOTO {
21106a99fe3SHajimu UMEMOTO 	char *name;
21206a99fe3SHajimu UMEMOTO 	uint32_t net;
21306a99fe3SHajimu UMEMOTO 	int type;
21406a99fe3SHajimu UMEMOTO 	struct netent *ne;
21506a99fe3SHajimu UMEMOTO 	char *orig_buf;
21606a99fe3SHajimu UMEMOTO 	size_t orig_buf_size;
21706a99fe3SHajimu UMEMOTO 	int *ret_errno;
21806a99fe3SHajimu UMEMOTO 
21906a99fe3SHajimu UMEMOTO 	char *p;
22006a99fe3SHajimu UMEMOTO 	char **alias;
22106a99fe3SHajimu UMEMOTO 
22206a99fe3SHajimu UMEMOTO 	switch ((enum nss_lookup_type)cache_mdata) {
22306a99fe3SHajimu UMEMOTO 	case nss_lt_name:
22406a99fe3SHajimu UMEMOTO 		name = va_arg(ap, char *);
22506a99fe3SHajimu UMEMOTO 		break;
22606a99fe3SHajimu UMEMOTO 	case nss_lt_id:
22706a99fe3SHajimu UMEMOTO 		net = va_arg(ap, uint32_t);
22806a99fe3SHajimu UMEMOTO 		type = va_arg(ap, int);
22906a99fe3SHajimu UMEMOTO 		break;
23006a99fe3SHajimu UMEMOTO 	case nss_lt_all:
23106a99fe3SHajimu UMEMOTO 		break;
23206a99fe3SHajimu UMEMOTO 	default:
23306a99fe3SHajimu UMEMOTO 		/* should be unreachable */
23406a99fe3SHajimu UMEMOTO 		return (NS_UNAVAIL);
23506a99fe3SHajimu UMEMOTO 	}
23606a99fe3SHajimu UMEMOTO 
23706a99fe3SHajimu UMEMOTO 	ne = va_arg(ap, struct netent *);
23806a99fe3SHajimu UMEMOTO 	orig_buf = va_arg(ap, char *);
23906a99fe3SHajimu UMEMOTO 	orig_buf_size = va_arg(ap, size_t);
24006a99fe3SHajimu UMEMOTO 	ret_errno = va_arg(ap, int *);
24106a99fe3SHajimu UMEMOTO 
24206a99fe3SHajimu UMEMOTO 	if (orig_buf_size <
24306a99fe3SHajimu UMEMOTO 	    buffer_size - sizeof(struct netent) - sizeof(char *)) {
24406a99fe3SHajimu UMEMOTO 		*ret_errno = ERANGE;
24506a99fe3SHajimu UMEMOTO 		return (NS_RETURN);
24606a99fe3SHajimu UMEMOTO 	}
24706a99fe3SHajimu UMEMOTO 
24806a99fe3SHajimu UMEMOTO 	memcpy(ne, buffer, sizeof(struct netent));
24906a99fe3SHajimu UMEMOTO 	memcpy(&p, buffer + sizeof(struct netent), sizeof(char *));
25006a99fe3SHajimu UMEMOTO 
25106a99fe3SHajimu UMEMOTO 	orig_buf = (char *)_ALIGN(orig_buf);
25206a99fe3SHajimu UMEMOTO 	memcpy(orig_buf, buffer + sizeof(struct netent) + sizeof(char *) +
25306a99fe3SHajimu UMEMOTO 	    _ALIGN(p) - (size_t)p,
25406a99fe3SHajimu UMEMOTO 	    buffer_size - sizeof(struct netent) - sizeof(char *) -
25506a99fe3SHajimu UMEMOTO 	    _ALIGN(p) + (size_t)p);
25606a99fe3SHajimu UMEMOTO 	p = (char *)_ALIGN(p);
25706a99fe3SHajimu UMEMOTO 
25806a99fe3SHajimu UMEMOTO 	NS_APPLY_OFFSET(ne->n_name, orig_buf, p, char *);
25906a99fe3SHajimu UMEMOTO 	if (ne->n_aliases != NULL) {
26006a99fe3SHajimu UMEMOTO 		NS_APPLY_OFFSET(ne->n_aliases, orig_buf, p, char **);
26106a99fe3SHajimu UMEMOTO 
26206a99fe3SHajimu UMEMOTO 		for (alias = ne->n_aliases; *alias; ++alias)
26306a99fe3SHajimu UMEMOTO 			NS_APPLY_OFFSET(*alias, orig_buf, p, char *);
26406a99fe3SHajimu UMEMOTO 	}
26506a99fe3SHajimu UMEMOTO 
26606a99fe3SHajimu UMEMOTO 	if (retval != NULL)
26706a99fe3SHajimu UMEMOTO 		*((struct netent **)retval) = ne;
26806a99fe3SHajimu UMEMOTO 
26906a99fe3SHajimu UMEMOTO 	return (NS_SUCCESS);
27006a99fe3SHajimu UMEMOTO }
27106a99fe3SHajimu UMEMOTO #endif /* NS_CACHING */
27206a99fe3SHajimu UMEMOTO 
273d3ac2b30SHajimu UMEMOTO static void
274d3ac2b30SHajimu UMEMOTO netent_data_free(void *ptr)
275d3ac2b30SHajimu UMEMOTO {
276d3ac2b30SHajimu UMEMOTO 	struct netent_data *ned = ptr;
277d3ac2b30SHajimu UMEMOTO 
278d3ac2b30SHajimu UMEMOTO 	if (ned == NULL)
279d3ac2b30SHajimu UMEMOTO 		return;
280d3ac2b30SHajimu UMEMOTO 	ned->stayopen = 0;
281d3ac2b30SHajimu UMEMOTO 	_endnethtent(ned);
282d3ac2b30SHajimu UMEMOTO 	free(ned);
283d3ac2b30SHajimu UMEMOTO }
284a2a77501SHajimu UMEMOTO 
285a2a77501SHajimu UMEMOTO static void
286a2a77501SHajimu UMEMOTO netdata_free(void *ptr)
2871363f04cSPaul Traina {
288d3ac2b30SHajimu UMEMOTO 	free(ptr);
289a2a77501SHajimu UMEMOTO }
290a2a77501SHajimu UMEMOTO 
291a2a77501SHajimu UMEMOTO int
292d3ac2b30SHajimu UMEMOTO __copy_netent(struct netent *ne, struct netent *nptr, char *buf, size_t buflen)
293a2a77501SHajimu UMEMOTO {
294d3ac2b30SHajimu UMEMOTO 	char *cp;
295d3ac2b30SHajimu UMEMOTO 	int i, n;
296d3ac2b30SHajimu UMEMOTO 	int numptr, len;
2971363f04cSPaul Traina 
298d3ac2b30SHajimu UMEMOTO 	/* Find out the amount of space required to store the answer. */
299d3ac2b30SHajimu UMEMOTO 	numptr = 1; /* NULL ptr */
300d3ac2b30SHajimu UMEMOTO 	len = (char *)ALIGN(buf) - buf;
301d3ac2b30SHajimu UMEMOTO 	for (i = 0; ne->n_aliases[i]; i++, numptr++) {
302d3ac2b30SHajimu UMEMOTO 		len += strlen(ne->n_aliases[i]) + 1;
303d3ac2b30SHajimu UMEMOTO 	}
304d3ac2b30SHajimu UMEMOTO 	len += strlen(ne->n_name) + 1;
305d3ac2b30SHajimu UMEMOTO 	len += numptr * sizeof(char*);
306d3ac2b30SHajimu UMEMOTO 
307d3ac2b30SHajimu UMEMOTO 	if (len > (int)buflen) {
308d3ac2b30SHajimu UMEMOTO 		errno = ERANGE;
309d3ac2b30SHajimu UMEMOTO 		return (-1);
310d3ac2b30SHajimu UMEMOTO 	}
311d3ac2b30SHajimu UMEMOTO 
312d3ac2b30SHajimu UMEMOTO 	/* copy net value and type */
313d3ac2b30SHajimu UMEMOTO 	nptr->n_addrtype = ne->n_addrtype;
314d3ac2b30SHajimu UMEMOTO 	nptr->n_net = ne->n_net;
315d3ac2b30SHajimu UMEMOTO 
316d3ac2b30SHajimu UMEMOTO 	cp = (char *)ALIGN(buf) + numptr * sizeof(char *);
317d3ac2b30SHajimu UMEMOTO 
318d3ac2b30SHajimu UMEMOTO 	/* copy official name */
319d3ac2b30SHajimu UMEMOTO 	n = strlen(ne->n_name) + 1;
320d3ac2b30SHajimu UMEMOTO 	strcpy(cp, ne->n_name);
321d3ac2b30SHajimu UMEMOTO 	nptr->n_name = cp;
322d3ac2b30SHajimu UMEMOTO 	cp += n;
323d3ac2b30SHajimu UMEMOTO 
324d3ac2b30SHajimu UMEMOTO 	/* copy aliases */
325d3ac2b30SHajimu UMEMOTO 	nptr->n_aliases = (char **)ALIGN(buf);
326d3ac2b30SHajimu UMEMOTO 	for (i = 0 ; ne->n_aliases[i]; i++) {
327d3ac2b30SHajimu UMEMOTO 		n = strlen(ne->n_aliases[i]) + 1;
328d3ac2b30SHajimu UMEMOTO 		strcpy(cp, ne->n_aliases[i]);
329d3ac2b30SHajimu UMEMOTO 		nptr->n_aliases[i] = cp;
330d3ac2b30SHajimu UMEMOTO 		cp += n;
331d3ac2b30SHajimu UMEMOTO 	}
332d3ac2b30SHajimu UMEMOTO 	nptr->n_aliases[i] = NULL;
333d3ac2b30SHajimu UMEMOTO 
334d3ac2b30SHajimu UMEMOTO 	return (0);
335d3ac2b30SHajimu UMEMOTO }
336d3ac2b30SHajimu UMEMOTO 
337d3ac2b30SHajimu UMEMOTO int
338d3ac2b30SHajimu UMEMOTO getnetbyname_r(const char *name, struct netent *ne, char *buffer,
339d3ac2b30SHajimu UMEMOTO     size_t buflen, struct netent **result, int *h_errorp)
340d3ac2b30SHajimu UMEMOTO {
34106a99fe3SHajimu UMEMOTO #ifdef NS_CACHING
34206a99fe3SHajimu UMEMOTO 	static const nss_cache_info cache_info =
34306a99fe3SHajimu UMEMOTO     		NS_COMMON_CACHE_INFO_INITIALIZER(
34406a99fe3SHajimu UMEMOTO 		networks, (void *)nss_lt_name,
34506a99fe3SHajimu UMEMOTO 		net_id_func, net_marshal_func, net_unmarshal_func);
34606a99fe3SHajimu UMEMOTO #endif
347248aee62SJacques Vidrine 	static const ns_dtab dtab[] = {
348248aee62SJacques Vidrine 		NS_FILES_CB(_ht_getnetbyname, NULL)
349248aee62SJacques Vidrine 		{ NSSRC_DNS, _dns_getnetbyname, NULL },
350248aee62SJacques Vidrine 		NS_NIS_CB(_nis_getnetbyname, NULL) /* force -DHESIOD */
35106a99fe3SHajimu UMEMOTO #ifdef NS_CACHING
35206a99fe3SHajimu UMEMOTO 		NS_CACHE_CB(&cache_info)
35306a99fe3SHajimu UMEMOTO #endif
354248aee62SJacques Vidrine 		{ 0 }
355248aee62SJacques Vidrine 	};
356225edeacSHajimu UMEMOTO 	int rval, ret_errno = 0;
357248aee62SJacques Vidrine 
358d3ac2b30SHajimu UMEMOTO 	rval = _nsdispatch((void *)result, dtab, NSDB_NETWORKS,
359d3ac2b30SHajimu UMEMOTO 	    "getnetbyname_r", default_src, name, ne, buffer, buflen,
360d3ac2b30SHajimu UMEMOTO 	    &ret_errno, h_errorp);
361248aee62SJacques Vidrine 
362225edeacSHajimu UMEMOTO 	if (rval != NS_SUCCESS) {
363225edeacSHajimu UMEMOTO 		errno = ret_errno;
364225edeacSHajimu UMEMOTO 		return ((ret_errno != 0) ? ret_errno : -1);
365225edeacSHajimu UMEMOTO 	}
366225edeacSHajimu UMEMOTO 	return (0);
3671363f04cSPaul Traina }
3681363f04cSPaul Traina 
369a2a77501SHajimu UMEMOTO int
370d3ac2b30SHajimu UMEMOTO getnetbyaddr_r(uint32_t addr, int af, struct netent *ne, char *buffer,
371d3ac2b30SHajimu UMEMOTO     size_t buflen, struct netent **result, int *h_errorp)
3721363f04cSPaul Traina {
37306a99fe3SHajimu UMEMOTO #ifdef NS_CACHING
37406a99fe3SHajimu UMEMOTO 	static const nss_cache_info cache_info =
37506a99fe3SHajimu UMEMOTO     		NS_COMMON_CACHE_INFO_INITIALIZER(
37606a99fe3SHajimu UMEMOTO 		networks, (void *)nss_lt_id,
37706a99fe3SHajimu UMEMOTO 		net_id_func, net_marshal_func, net_unmarshal_func);
37806a99fe3SHajimu UMEMOTO #endif
379248aee62SJacques Vidrine 	static const ns_dtab dtab[] = {
380248aee62SJacques Vidrine 		NS_FILES_CB(_ht_getnetbyaddr, NULL)
381248aee62SJacques Vidrine 		{ NSSRC_DNS, _dns_getnetbyaddr, NULL },
382248aee62SJacques Vidrine 		NS_NIS_CB(_nis_getnetbyaddr, NULL) /* force -DHESIOD */
38306a99fe3SHajimu UMEMOTO #ifdef NS_CACHING
38406a99fe3SHajimu UMEMOTO 		NS_CACHE_CB(&cache_info)
38506a99fe3SHajimu UMEMOTO #endif
386248aee62SJacques Vidrine 		{ 0 }
387248aee62SJacques Vidrine 	};
388225edeacSHajimu UMEMOTO 	int rval, ret_errno = 0;
3891363f04cSPaul Traina 
390d3ac2b30SHajimu UMEMOTO 	rval = _nsdispatch((void *)result, dtab, NSDB_NETWORKS,
391d3ac2b30SHajimu UMEMOTO 	    "getnetbyaddr_r", default_src, addr, af, ne, buffer, buflen,
392d3ac2b30SHajimu UMEMOTO 	    &ret_errno, h_errorp);
393248aee62SJacques Vidrine 
394225edeacSHajimu UMEMOTO 	if (rval != NS_SUCCESS) {
395225edeacSHajimu UMEMOTO 		errno = ret_errno;
396225edeacSHajimu UMEMOTO 		return ((ret_errno != 0) ? ret_errno : -1);
397225edeacSHajimu UMEMOTO 	}
398225edeacSHajimu UMEMOTO 	return (0);
3991363f04cSPaul Traina }
400a2a77501SHajimu UMEMOTO 
401a2a77501SHajimu UMEMOTO struct netent *
402a2a77501SHajimu UMEMOTO getnetbyname(const char *name)
403a2a77501SHajimu UMEMOTO {
404a2a77501SHajimu UMEMOTO 	struct netdata *nd;
405d3ac2b30SHajimu UMEMOTO 	struct netent *rval;
406d3ac2b30SHajimu UMEMOTO 	int ret_h_errno;
407a2a77501SHajimu UMEMOTO 
408a2a77501SHajimu UMEMOTO 	if ((nd = __netdata_init()) == NULL)
409d3ac2b30SHajimu UMEMOTO 		return (NULL);
410d3ac2b30SHajimu UMEMOTO 	if (getnetbyname_r(name, &nd->net, nd->data, sizeof(nd->data), &rval,
411d3ac2b30SHajimu UMEMOTO 	    &ret_h_errno) != 0)
412d3ac2b30SHajimu UMEMOTO 		return (NULL);
413d3ac2b30SHajimu UMEMOTO 	return (rval);
414a2a77501SHajimu UMEMOTO }
415a2a77501SHajimu UMEMOTO 
416a2a77501SHajimu UMEMOTO struct netent *
417036ae3ddSHajimu UMEMOTO getnetbyaddr(uint32_t addr, int af)
418a2a77501SHajimu UMEMOTO {
419a2a77501SHajimu UMEMOTO 	struct netdata *nd;
420d3ac2b30SHajimu UMEMOTO 	struct netent *rval;
421d3ac2b30SHajimu UMEMOTO 	int ret_h_errno;
422a2a77501SHajimu UMEMOTO 
423a2a77501SHajimu UMEMOTO 	if ((nd = __netdata_init()) == NULL)
424d3ac2b30SHajimu UMEMOTO 		return (NULL);
425d3ac2b30SHajimu UMEMOTO 	if (getnetbyaddr_r(addr, af, &nd->net, nd->data, sizeof(nd->data),
426d3ac2b30SHajimu UMEMOTO 	    &rval, &ret_h_errno) != 0)
427d3ac2b30SHajimu UMEMOTO 		return (NULL);
428d3ac2b30SHajimu UMEMOTO 	return (rval);
429a2a77501SHajimu UMEMOTO }
430a2a77501SHajimu UMEMOTO 
431a2a77501SHajimu UMEMOTO void
432a2a77501SHajimu UMEMOTO setnetent(int stayopen)
433a2a77501SHajimu UMEMOTO {
434d3ac2b30SHajimu UMEMOTO 	struct netent_data *ned;
435a2a77501SHajimu UMEMOTO 
436d3ac2b30SHajimu UMEMOTO 	if ((ned = __netent_data_init()) == NULL)
437a2a77501SHajimu UMEMOTO 		return;
438d3ac2b30SHajimu UMEMOTO 	_setnethtent(stayopen, ned);
439d3ac2b30SHajimu UMEMOTO 	_setnetdnsent(stayopen);
440a2a77501SHajimu UMEMOTO }
441a2a77501SHajimu UMEMOTO 
442a2a77501SHajimu UMEMOTO void
443a2a77501SHajimu UMEMOTO endnetent(void)
444a2a77501SHajimu UMEMOTO {
445d3ac2b30SHajimu UMEMOTO 	struct netent_data *ned;
446a2a77501SHajimu UMEMOTO 
447d3ac2b30SHajimu UMEMOTO 	if ((ned = __netent_data_init()) == NULL)
448a2a77501SHajimu UMEMOTO 		return;
449d3ac2b30SHajimu UMEMOTO 	_endnethtent(ned);
450d3ac2b30SHajimu UMEMOTO 	_endnetdnsent();
451a2a77501SHajimu UMEMOTO }
452