xref: /freebsd/lib/libc/rpc/getrpcent.c (revision dc36d6f9bb1753f3808552f3afd30eda9a7b206a)
18360efbdSAlfred Perlstein /*	$NetBSD: getrpcent.c,v 1.17 2000/01/22 22:19:17 mycroft Exp $	*/
28360efbdSAlfred Perlstein 
32e322d37SHiroki Sato /*-
48a16b7a1SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
58a16b7a1SPedro F. Giffuni  *
62e322d37SHiroki Sato  * Copyright (c) 2009, Sun Microsystems, Inc.
72e322d37SHiroki Sato  * All rights reserved.
899064799SGarrett Wollman  *
92e322d37SHiroki Sato  * Redistribution and use in source and binary forms, with or without
102e322d37SHiroki Sato  * modification, are permitted provided that the following conditions are met:
112e322d37SHiroki Sato  * - Redistributions of source code must retain the above copyright notice,
122e322d37SHiroki Sato  *   this list of conditions and the following disclaimer.
132e322d37SHiroki Sato  * - Redistributions in binary form must reproduce the above copyright notice,
142e322d37SHiroki Sato  *   this list of conditions and the following disclaimer in the documentation
152e322d37SHiroki Sato  *   and/or other materials provided with the distribution.
162e322d37SHiroki Sato  * - Neither the name of Sun Microsystems, Inc. nor the names of its
172e322d37SHiroki Sato  *   contributors may be used to endorse or promote products derived
182e322d37SHiroki Sato  *   from this software without specific prior written permission.
1999064799SGarrett Wollman  *
202e322d37SHiroki Sato  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
212e322d37SHiroki Sato  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
222e322d37SHiroki Sato  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
232e322d37SHiroki Sato  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
242e322d37SHiroki Sato  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
252e322d37SHiroki Sato  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
262e322d37SHiroki Sato  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
272e322d37SHiroki Sato  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
282e322d37SHiroki Sato  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
292e322d37SHiroki Sato  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
302e322d37SHiroki Sato  * POSSIBILITY OF SUCH DAMAGE.
3199064799SGarrett Wollman  */
3299064799SGarrett Wollman 
3399064799SGarrett Wollman /*
3499064799SGarrett Wollman  * Copyright (c) 1984 by Sun Microsystems, Inc.
3599064799SGarrett Wollman  */
3699064799SGarrett Wollman 
3706a99fe3SHajimu UMEMOTO #include <sys/param.h>
3806a99fe3SHajimu UMEMOTO #include <sys/socket.h>
398360efbdSAlfred Perlstein #include <arpa/inet.h>
408360efbdSAlfred Perlstein #include <assert.h>
4106a99fe3SHajimu UMEMOTO #include <errno.h>
4206a99fe3SHajimu UMEMOTO #include <nsswitch.h>
4306a99fe3SHajimu UMEMOTO #include <netinet/in.h>
4499064799SGarrett Wollman #include <stdio.h>
4599064799SGarrett Wollman #include <string.h>
4606a99fe3SHajimu UMEMOTO #include <stdarg.h>
4706a99fe3SHajimu UMEMOTO #include <stdlib.h>
4899064799SGarrett Wollman #include <rpc/rpc.h>
4999064799SGarrett Wollman #ifdef YP
5099064799SGarrett Wollman #include <rpcsvc/yp_prot.h>
5199064799SGarrett Wollman #include <rpcsvc/ypclnt.h>
5299064799SGarrett Wollman #endif
5306a99fe3SHajimu UMEMOTO #include <unistd.h>
5406a99fe3SHajimu UMEMOTO #include "namespace.h"
5506a99fe3SHajimu UMEMOTO #include "reentrant.h"
568360efbdSAlfred Perlstein #include "un-namespace.h"
572bbd7cf8SJacques Vidrine #include "libc_private.h"
5806a99fe3SHajimu UMEMOTO #include "nss_tls.h"
5906a99fe3SHajimu UMEMOTO #ifdef NS_CACHING
6006a99fe3SHajimu UMEMOTO #include "nscache.h"
6199064799SGarrett Wollman #endif
6299064799SGarrett Wollman 
638360efbdSAlfred Perlstein #define	RPCDB	"/etc/rpc"
6499064799SGarrett Wollman 
6506a99fe3SHajimu UMEMOTO /* nsswitch declarations */
6606a99fe3SHajimu UMEMOTO enum constants
6799064799SGarrett Wollman {
6806a99fe3SHajimu UMEMOTO 	SETRPCENT = 1,
6906a99fe3SHajimu UMEMOTO 	ENDRPCENT = 2,
7006a99fe3SHajimu UMEMOTO 	RPCENT_STORAGE_INITIAL	= 1 << 10, /* 1 KByte */
7106a99fe3SHajimu UMEMOTO 	RPCENT_STORAGE_MAX	= 1 << 20, /* 1 MByte */
7206a99fe3SHajimu UMEMOTO };
7399064799SGarrett Wollman 
7406a99fe3SHajimu UMEMOTO static const ns_src defaultsrc[] = {
7506a99fe3SHajimu UMEMOTO 	{ NSSRC_FILES, NS_SUCCESS },
7606a99fe3SHajimu UMEMOTO #ifdef YP
7706a99fe3SHajimu UMEMOTO 	{ NSSRC_NIS, NS_SUCCESS },
7806a99fe3SHajimu UMEMOTO #endif
7906a99fe3SHajimu UMEMOTO 	{ NULL, 0 }
8006a99fe3SHajimu UMEMOTO };
8199064799SGarrett Wollman 
8206a99fe3SHajimu UMEMOTO /* files backend declarations */
8306a99fe3SHajimu UMEMOTO struct files_state {
8406a99fe3SHajimu UMEMOTO 	FILE	*fp;
8506a99fe3SHajimu UMEMOTO 	int	stayopen;
8606a99fe3SHajimu UMEMOTO };
8706a99fe3SHajimu UMEMOTO 
8806a99fe3SHajimu UMEMOTO static	int	files_rpcent(void *, void *, va_list);
8906a99fe3SHajimu UMEMOTO static	int	files_setrpcent(void *, void *, va_list);
9006a99fe3SHajimu UMEMOTO 
9106a99fe3SHajimu UMEMOTO static	void	files_endstate(void *);
9206a99fe3SHajimu UMEMOTO NSS_TLS_HANDLING(files);
9306a99fe3SHajimu UMEMOTO 
9406a99fe3SHajimu UMEMOTO /* nis backend declarations */
9506a99fe3SHajimu UMEMOTO #ifdef YP
9606a99fe3SHajimu UMEMOTO struct nis_state {
9706a99fe3SHajimu UMEMOTO 	char	domain[MAXHOSTNAMELEN];
9806a99fe3SHajimu UMEMOTO 	char	*current;
9906a99fe3SHajimu UMEMOTO 	int	currentlen;
10006a99fe3SHajimu UMEMOTO 	int	stepping;
10106a99fe3SHajimu UMEMOTO 	int	no_name_map;
10206a99fe3SHajimu UMEMOTO };
10306a99fe3SHajimu UMEMOTO 
10406a99fe3SHajimu UMEMOTO static	int	nis_rpcent(void *, void *, va_list);
10506a99fe3SHajimu UMEMOTO static	int	nis_setrpcent(void *, void *, va_list);
10606a99fe3SHajimu UMEMOTO 
10706a99fe3SHajimu UMEMOTO static	void	nis_endstate(void *);
10806a99fe3SHajimu UMEMOTO NSS_TLS_HANDLING(nis);
10906a99fe3SHajimu UMEMOTO #endif
11006a99fe3SHajimu UMEMOTO 
11106a99fe3SHajimu UMEMOTO /* get** wrappers for get**_r functions declarations */
11206a99fe3SHajimu UMEMOTO struct rpcent_state {
11306a99fe3SHajimu UMEMOTO 	struct rpcent	rpc;
11406a99fe3SHajimu UMEMOTO 	char		*buffer;
11506a99fe3SHajimu UMEMOTO 	size_t	bufsize;
11606a99fe3SHajimu UMEMOTO };
11706a99fe3SHajimu UMEMOTO static	void	rpcent_endstate(void *);
11806a99fe3SHajimu UMEMOTO NSS_TLS_HANDLING(rpcent);
11906a99fe3SHajimu UMEMOTO 
12006a99fe3SHajimu UMEMOTO union key {
12106a99fe3SHajimu UMEMOTO 	const char	*name;
1228360efbdSAlfred Perlstein 	int		number;
12306a99fe3SHajimu UMEMOTO };
12499064799SGarrett Wollman 
12506a99fe3SHajimu UMEMOTO static int wrap_getrpcbyname_r(union key, struct rpcent *, char *,
12606a99fe3SHajimu UMEMOTO 			size_t, struct rpcent **);
12706a99fe3SHajimu UMEMOTO static int wrap_getrpcbynumber_r(union key, struct rpcent *, char *,
12806a99fe3SHajimu UMEMOTO 			size_t, struct rpcent **);
12906a99fe3SHajimu UMEMOTO static int wrap_getrpcent_r(union key, struct rpcent *, char *,
13006a99fe3SHajimu UMEMOTO 			size_t, struct rpcent **);
13106a99fe3SHajimu UMEMOTO static struct rpcent *getrpc(int (*fn)(union key, struct rpcent *, char *,
13206a99fe3SHajimu UMEMOTO 			size_t, struct rpcent **), union key);
1338360efbdSAlfred Perlstein 
13406a99fe3SHajimu UMEMOTO #ifdef NS_CACHING
13506a99fe3SHajimu UMEMOTO static int rpc_id_func(char *, size_t *, va_list, void *);
13606a99fe3SHajimu UMEMOTO static int rpc_marshal_func(char *, size_t *, void *, va_list, void *);
13706a99fe3SHajimu UMEMOTO static int rpc_unmarshal_func(char *, size_t, void *, va_list, void *);
13899064799SGarrett Wollman #endif
13999064799SGarrett Wollman 
14006a99fe3SHajimu UMEMOTO static int
rpcent_unpack(char * p,struct rpcent * rpc,char ** r_aliases,size_t aliases_size,int * errnop)14106a99fe3SHajimu UMEMOTO rpcent_unpack(char *p, struct rpcent *rpc, char **r_aliases,
14206a99fe3SHajimu UMEMOTO 	size_t aliases_size, int *errnop)
14399064799SGarrett Wollman {
1448360efbdSAlfred Perlstein 	char *cp, **q;
1458360efbdSAlfred Perlstein 
14606a99fe3SHajimu UMEMOTO 	assert(p != NULL);
14799064799SGarrett Wollman 
14899064799SGarrett Wollman 	if (*p == '#')
14906a99fe3SHajimu UMEMOTO 		return (-1);
15099064799SGarrett Wollman 	cp = strpbrk(p, "#\n");
15199064799SGarrett Wollman 	if (cp == NULL)
15206a99fe3SHajimu UMEMOTO 		return (-1);
15399064799SGarrett Wollman 	*cp = '\0';
15499064799SGarrett Wollman 	cp = strpbrk(p, " \t");
15599064799SGarrett Wollman 	if (cp == NULL)
15606a99fe3SHajimu UMEMOTO 		return (-1);
15799064799SGarrett Wollman 	*cp++ = '\0';
15899064799SGarrett Wollman 	/* THIS STUFF IS INTERNET SPECIFIC */
15906a99fe3SHajimu UMEMOTO 	rpc->r_name = p;
16099064799SGarrett Wollman 	while (*cp == ' ' || *cp == '\t')
16199064799SGarrett Wollman 		cp++;
16206a99fe3SHajimu UMEMOTO 	rpc->r_number = atoi(cp);
16306a99fe3SHajimu UMEMOTO 	q = rpc->r_aliases = r_aliases;
16499064799SGarrett Wollman 	cp = strpbrk(cp, " \t");
16599064799SGarrett Wollman 	if (cp != NULL)
16699064799SGarrett Wollman 		*cp++ = '\0';
16799064799SGarrett Wollman 	while (cp && *cp) {
16899064799SGarrett Wollman 		if (*cp == ' ' || *cp == '\t') {
16999064799SGarrett Wollman 			cp++;
17099064799SGarrett Wollman 			continue;
17199064799SGarrett Wollman 		}
17206a99fe3SHajimu UMEMOTO 		if (q < &(r_aliases[aliases_size - 1]))
17399064799SGarrett Wollman 			*q++ = cp;
17406a99fe3SHajimu UMEMOTO 		else {
17506a99fe3SHajimu UMEMOTO 			*errnop = ERANGE;
17606a99fe3SHajimu UMEMOTO 			return -1;
17706a99fe3SHajimu UMEMOTO 		}
17806a99fe3SHajimu UMEMOTO 
17999064799SGarrett Wollman 		cp = strpbrk(cp, " \t");
18099064799SGarrett Wollman 		if (cp != NULL)
18199064799SGarrett Wollman 			*cp++ = '\0';
18299064799SGarrett Wollman 	}
18399064799SGarrett Wollman 	*q = NULL;
18406a99fe3SHajimu UMEMOTO 	return 0;
18599064799SGarrett Wollman }
18699064799SGarrett Wollman 
18706a99fe3SHajimu UMEMOTO /* files backend implementation */
18806a99fe3SHajimu UMEMOTO static	void
files_endstate(void * p)18906a99fe3SHajimu UMEMOTO files_endstate(void *p)
19006a99fe3SHajimu UMEMOTO {
19106a99fe3SHajimu UMEMOTO 	FILE * f;
19206a99fe3SHajimu UMEMOTO 
19306a99fe3SHajimu UMEMOTO 	if (p == NULL)
19406a99fe3SHajimu UMEMOTO 		return;
19506a99fe3SHajimu UMEMOTO 
19606a99fe3SHajimu UMEMOTO 	f = ((struct files_state *)p)->fp;
19706a99fe3SHajimu UMEMOTO 	if (f != NULL)
19806a99fe3SHajimu UMEMOTO 		fclose(f);
19906a99fe3SHajimu UMEMOTO 
20006a99fe3SHajimu UMEMOTO 	free(p);
20106a99fe3SHajimu UMEMOTO }
20206a99fe3SHajimu UMEMOTO 
20306a99fe3SHajimu UMEMOTO static int
files_rpcent(void * retval,void * mdata,va_list ap)20406a99fe3SHajimu UMEMOTO files_rpcent(void *retval, void *mdata, va_list ap)
20506a99fe3SHajimu UMEMOTO {
20606a99fe3SHajimu UMEMOTO 	char *name;
20706a99fe3SHajimu UMEMOTO 	int number;
20806a99fe3SHajimu UMEMOTO 	struct rpcent *rpc;
20906a99fe3SHajimu UMEMOTO 	char *buffer;
21006a99fe3SHajimu UMEMOTO 	size_t bufsize;
21106a99fe3SHajimu UMEMOTO 	int *errnop;
21206a99fe3SHajimu UMEMOTO 
21306a99fe3SHajimu UMEMOTO 	char *line;
21406a99fe3SHajimu UMEMOTO 	size_t linesize;
21506a99fe3SHajimu UMEMOTO 	char **aliases;
21606a99fe3SHajimu UMEMOTO 	int aliases_size;
21706a99fe3SHajimu UMEMOTO 	char **rp;
21806a99fe3SHajimu UMEMOTO 
21906a99fe3SHajimu UMEMOTO 	struct files_state	*st;
22006a99fe3SHajimu UMEMOTO 	int rv;
22106a99fe3SHajimu UMEMOTO 	int stayopen;
22206a99fe3SHajimu UMEMOTO 	enum nss_lookup_type how;
22306a99fe3SHajimu UMEMOTO 
2246671366aSBrooks Davis 	how = (enum nss_lookup_type)(uintptr_t)mdata;
22506a99fe3SHajimu UMEMOTO 	switch (how)
22606a99fe3SHajimu UMEMOTO 	{
22706a99fe3SHajimu UMEMOTO 	case nss_lt_name:
22806a99fe3SHajimu UMEMOTO 		name = va_arg(ap, char *);
22906a99fe3SHajimu UMEMOTO 		break;
23006a99fe3SHajimu UMEMOTO 	case nss_lt_id:
23106a99fe3SHajimu UMEMOTO 		number = va_arg(ap, int);
23206a99fe3SHajimu UMEMOTO 		break;
23306a99fe3SHajimu UMEMOTO 	case nss_lt_all:
23406a99fe3SHajimu UMEMOTO 		break;
23506a99fe3SHajimu UMEMOTO 	default:
23606a99fe3SHajimu UMEMOTO 		return (NS_NOTFOUND);
23706a99fe3SHajimu UMEMOTO 	}
23806a99fe3SHajimu UMEMOTO 
23906a99fe3SHajimu UMEMOTO 	rpc = va_arg(ap, struct rpcent *);
24006a99fe3SHajimu UMEMOTO 	buffer = va_arg(ap, char *);
24106a99fe3SHajimu UMEMOTO 	bufsize = va_arg(ap, size_t);
24206a99fe3SHajimu UMEMOTO 	errnop = va_arg(ap, int *);
24306a99fe3SHajimu UMEMOTO 
24406a99fe3SHajimu UMEMOTO 	*errnop = files_getstate(&st);
24506a99fe3SHajimu UMEMOTO 	if (*errnop != 0)
24606a99fe3SHajimu UMEMOTO 		return (NS_UNAVAIL);
24706a99fe3SHajimu UMEMOTO 
24806a99fe3SHajimu UMEMOTO 	if (st->fp == NULL && (st->fp = fopen(RPCDB, "r")) == NULL) {
24906a99fe3SHajimu UMEMOTO 		*errnop = errno;
25006a99fe3SHajimu UMEMOTO 		return (NS_UNAVAIL);
25106a99fe3SHajimu UMEMOTO 	}
25206a99fe3SHajimu UMEMOTO 
25306a99fe3SHajimu UMEMOTO 	if (how == nss_lt_all)
25406a99fe3SHajimu UMEMOTO 		stayopen = 1;
25506a99fe3SHajimu UMEMOTO 	else {
25606a99fe3SHajimu UMEMOTO 		rewind(st->fp);
25706a99fe3SHajimu UMEMOTO 		stayopen = st->stayopen;
25806a99fe3SHajimu UMEMOTO 	}
25906a99fe3SHajimu UMEMOTO 
26006a99fe3SHajimu UMEMOTO 	do {
26106a99fe3SHajimu UMEMOTO 		if ((line = fgetln(st->fp, &linesize)) == NULL) {
26206a99fe3SHajimu UMEMOTO 			*errnop = errno;
26306a99fe3SHajimu UMEMOTO 			rv = NS_RETURN;
26406a99fe3SHajimu UMEMOTO 			break;
26506a99fe3SHajimu UMEMOTO 		}
26606a99fe3SHajimu UMEMOTO 
26706a99fe3SHajimu UMEMOTO 		if (bufsize <= linesize + _ALIGNBYTES + sizeof(char *)) {
26806a99fe3SHajimu UMEMOTO 			*errnop = ERANGE;
26906a99fe3SHajimu UMEMOTO 			rv = NS_RETURN;
27006a99fe3SHajimu UMEMOTO 			break;
27106a99fe3SHajimu UMEMOTO 		}
27206a99fe3SHajimu UMEMOTO 
27306a99fe3SHajimu UMEMOTO 		aliases = (char **)_ALIGN(&buffer[linesize+1]);
27406a99fe3SHajimu UMEMOTO 		aliases_size = (buffer + bufsize -
27506a99fe3SHajimu UMEMOTO 			(char *)aliases)/sizeof(char *);
27606a99fe3SHajimu UMEMOTO 		if (aliases_size < 1) {
27706a99fe3SHajimu UMEMOTO 			*errnop = ERANGE;
27806a99fe3SHajimu UMEMOTO 			rv = NS_RETURN;
27906a99fe3SHajimu UMEMOTO 			break;
28006a99fe3SHajimu UMEMOTO 		}
28106a99fe3SHajimu UMEMOTO 
28206a99fe3SHajimu UMEMOTO 		memcpy(buffer, line, linesize);
28306a99fe3SHajimu UMEMOTO 		buffer[linesize] = '\0';
28406a99fe3SHajimu UMEMOTO 
28506a99fe3SHajimu UMEMOTO 		rv = rpcent_unpack(buffer, rpc, aliases, aliases_size, errnop);
28606a99fe3SHajimu UMEMOTO 		if (rv != 0) {
28706a99fe3SHajimu UMEMOTO 			if (*errnop == 0) {
28806a99fe3SHajimu UMEMOTO 				rv = NS_NOTFOUND;
28906a99fe3SHajimu UMEMOTO 				continue;
29006a99fe3SHajimu UMEMOTO 			}
29106a99fe3SHajimu UMEMOTO 			else {
29206a99fe3SHajimu UMEMOTO 				rv = NS_RETURN;
29306a99fe3SHajimu UMEMOTO 				break;
29406a99fe3SHajimu UMEMOTO 			}
29506a99fe3SHajimu UMEMOTO 		}
29606a99fe3SHajimu UMEMOTO 
29706a99fe3SHajimu UMEMOTO 		switch (how)
29806a99fe3SHajimu UMEMOTO 		{
29906a99fe3SHajimu UMEMOTO 		case nss_lt_name:
30006a99fe3SHajimu UMEMOTO 			if (strcmp(rpc->r_name, name) == 0)
30106a99fe3SHajimu UMEMOTO 				goto done;
30206a99fe3SHajimu UMEMOTO 			for (rp = rpc->r_aliases; *rp != NULL; rp++) {
30306a99fe3SHajimu UMEMOTO 				if (strcmp(*rp, name) == 0)
30406a99fe3SHajimu UMEMOTO 					goto done;
30506a99fe3SHajimu UMEMOTO 			}
30606a99fe3SHajimu UMEMOTO 			rv = NS_NOTFOUND;
30706a99fe3SHajimu UMEMOTO 			continue;
30806a99fe3SHajimu UMEMOTO done:
30906a99fe3SHajimu UMEMOTO 			rv = NS_SUCCESS;
31006a99fe3SHajimu UMEMOTO 			break;
31106a99fe3SHajimu UMEMOTO 		case nss_lt_id:
31206a99fe3SHajimu UMEMOTO 			rv = (rpc->r_number == number) ? NS_SUCCESS :
31306a99fe3SHajimu UMEMOTO 				NS_NOTFOUND;
31406a99fe3SHajimu UMEMOTO 			break;
31506a99fe3SHajimu UMEMOTO 		case nss_lt_all:
31606a99fe3SHajimu UMEMOTO 			rv = NS_SUCCESS;
31706a99fe3SHajimu UMEMOTO 			break;
31806a99fe3SHajimu UMEMOTO 		}
31906a99fe3SHajimu UMEMOTO 
32006a99fe3SHajimu UMEMOTO 	} while (!(rv & NS_TERMINATE));
32106a99fe3SHajimu UMEMOTO 
32206a99fe3SHajimu UMEMOTO 	if (!stayopen && st->fp!=NULL) {
32306a99fe3SHajimu UMEMOTO 		fclose(st->fp);
32406a99fe3SHajimu UMEMOTO 		st->fp = NULL;
32506a99fe3SHajimu UMEMOTO 	}
32606a99fe3SHajimu UMEMOTO 
32706a99fe3SHajimu UMEMOTO 	if ((rv == NS_SUCCESS) && (retval != NULL))
32806a99fe3SHajimu UMEMOTO 		*((struct rpcent **)retval) = rpc;
32906a99fe3SHajimu UMEMOTO 
33006a99fe3SHajimu UMEMOTO 	return (rv);
33106a99fe3SHajimu UMEMOTO }
33206a99fe3SHajimu UMEMOTO 
33306a99fe3SHajimu UMEMOTO static int
files_setrpcent(void * retval,void * mdata,va_list ap)33406a99fe3SHajimu UMEMOTO files_setrpcent(void *retval, void *mdata, va_list ap)
33506a99fe3SHajimu UMEMOTO {
33606a99fe3SHajimu UMEMOTO 	struct files_state	*st;
33706a99fe3SHajimu UMEMOTO 	int	rv;
33806a99fe3SHajimu UMEMOTO 	int	f;
33906a99fe3SHajimu UMEMOTO 
34006a99fe3SHajimu UMEMOTO 	rv = files_getstate(&st);
34106a99fe3SHajimu UMEMOTO 	if (rv != 0)
34206a99fe3SHajimu UMEMOTO 		return (NS_UNAVAIL);
34306a99fe3SHajimu UMEMOTO 
3446671366aSBrooks Davis 	switch ((enum constants)(uintptr_t)mdata)
34506a99fe3SHajimu UMEMOTO 	{
34606a99fe3SHajimu UMEMOTO 	case SETRPCENT:
34706a99fe3SHajimu UMEMOTO 		f = va_arg(ap,int);
34806a99fe3SHajimu UMEMOTO 		if (st->fp == NULL)
34906a99fe3SHajimu UMEMOTO 			st->fp = fopen(RPCDB, "r");
35006a99fe3SHajimu UMEMOTO 		else
35106a99fe3SHajimu UMEMOTO 			rewind(st->fp);
35206a99fe3SHajimu UMEMOTO 		st->stayopen |= f;
35306a99fe3SHajimu UMEMOTO 		break;
35406a99fe3SHajimu UMEMOTO 	case ENDRPCENT:
35506a99fe3SHajimu UMEMOTO 		if (st->fp != NULL) {
35606a99fe3SHajimu UMEMOTO 			fclose(st->fp);
35706a99fe3SHajimu UMEMOTO 			st->fp = NULL;
35806a99fe3SHajimu UMEMOTO 		}
35906a99fe3SHajimu UMEMOTO 		st->stayopen = 0;
36006a99fe3SHajimu UMEMOTO 		break;
36106a99fe3SHajimu UMEMOTO 	default:
36206a99fe3SHajimu UMEMOTO 		break;
36306a99fe3SHajimu UMEMOTO 	}
36406a99fe3SHajimu UMEMOTO 
36506a99fe3SHajimu UMEMOTO 	return (NS_UNAVAIL);
36606a99fe3SHajimu UMEMOTO }
36706a99fe3SHajimu UMEMOTO 
36806a99fe3SHajimu UMEMOTO /* nis backend implementation */
36906a99fe3SHajimu UMEMOTO #ifdef YP
37006a99fe3SHajimu UMEMOTO static 	void
nis_endstate(void * p)37106a99fe3SHajimu UMEMOTO nis_endstate(void *p)
37206a99fe3SHajimu UMEMOTO {
37306a99fe3SHajimu UMEMOTO 	if (p == NULL)
37406a99fe3SHajimu UMEMOTO 		return;
37506a99fe3SHajimu UMEMOTO 
37606a99fe3SHajimu UMEMOTO 	free(((struct nis_state *)p)->current);
37706a99fe3SHajimu UMEMOTO 	free(p);
37806a99fe3SHajimu UMEMOTO }
37906a99fe3SHajimu UMEMOTO 
38006a99fe3SHajimu UMEMOTO static int
nis_rpcent(void * retval,void * mdata,va_list ap)38106a99fe3SHajimu UMEMOTO nis_rpcent(void *retval, void *mdata, va_list ap)
38206a99fe3SHajimu UMEMOTO {
38306a99fe3SHajimu UMEMOTO 	char		*name;
38406a99fe3SHajimu UMEMOTO 	int		number;
38506a99fe3SHajimu UMEMOTO 	struct rpcent	*rpc;
38606a99fe3SHajimu UMEMOTO 	char		*buffer;
38706a99fe3SHajimu UMEMOTO 	size_t	bufsize;
38806a99fe3SHajimu UMEMOTO 	int		*errnop;
38906a99fe3SHajimu UMEMOTO 
39006a99fe3SHajimu UMEMOTO 	char		**rp;
39106a99fe3SHajimu UMEMOTO 	char		**aliases;
39206a99fe3SHajimu UMEMOTO 	int		aliases_size;
39306a99fe3SHajimu UMEMOTO 
39406a99fe3SHajimu UMEMOTO 	char	*lastkey;
39506a99fe3SHajimu UMEMOTO 	char	*resultbuf;
39606a99fe3SHajimu UMEMOTO 	int	resultbuflen;
3976b462d27SKonstantin Belousov 	char	*buf;
39806a99fe3SHajimu UMEMOTO 
39906a99fe3SHajimu UMEMOTO 	struct nis_state	*st;
40006a99fe3SHajimu UMEMOTO 	int		rv;
40106a99fe3SHajimu UMEMOTO 	enum nss_lookup_type	how;
40206a99fe3SHajimu UMEMOTO 	int	no_name_active;
40306a99fe3SHajimu UMEMOTO 
4046671366aSBrooks Davis 	how = (enum nss_lookup_type)(uintptr_t)mdata;
40506a99fe3SHajimu UMEMOTO 	switch (how)
40606a99fe3SHajimu UMEMOTO 	{
40706a99fe3SHajimu UMEMOTO 	case nss_lt_name:
40806a99fe3SHajimu UMEMOTO 		name = va_arg(ap, char *);
40906a99fe3SHajimu UMEMOTO 		break;
41006a99fe3SHajimu UMEMOTO 	case nss_lt_id:
41106a99fe3SHajimu UMEMOTO 		number = va_arg(ap, int);
41206a99fe3SHajimu UMEMOTO 		break;
41306a99fe3SHajimu UMEMOTO 	case nss_lt_all:
41406a99fe3SHajimu UMEMOTO 		break;
41506a99fe3SHajimu UMEMOTO 	default:
41606a99fe3SHajimu UMEMOTO 		return (NS_NOTFOUND);
41706a99fe3SHajimu UMEMOTO 	}
41806a99fe3SHajimu UMEMOTO 
4196b462d27SKonstantin Belousov 	buf = NULL;
42006a99fe3SHajimu UMEMOTO 	rpc = va_arg(ap, struct rpcent *);
42106a99fe3SHajimu UMEMOTO 	buffer = va_arg(ap, char *);
42206a99fe3SHajimu UMEMOTO 	bufsize = va_arg(ap, size_t);
42306a99fe3SHajimu UMEMOTO 	errnop = va_arg(ap, int *);
42406a99fe3SHajimu UMEMOTO 
42506a99fe3SHajimu UMEMOTO 	*errnop = nis_getstate(&st);
42606a99fe3SHajimu UMEMOTO 	if (*errnop != 0)
42706a99fe3SHajimu UMEMOTO 		return (NS_UNAVAIL);
42806a99fe3SHajimu UMEMOTO 
42906a99fe3SHajimu UMEMOTO 	if (st->domain[0] == '\0') {
43006a99fe3SHajimu UMEMOTO 		if (getdomainname(st->domain, sizeof(st->domain)) != 0) {
43106a99fe3SHajimu UMEMOTO 			*errnop = errno;
43206a99fe3SHajimu UMEMOTO 			return (NS_UNAVAIL);
43306a99fe3SHajimu UMEMOTO 		}
43406a99fe3SHajimu UMEMOTO 	}
43506a99fe3SHajimu UMEMOTO 
43606a99fe3SHajimu UMEMOTO 	no_name_active = 0;
43706a99fe3SHajimu UMEMOTO 	do {
43806a99fe3SHajimu UMEMOTO 		switch (how)
43906a99fe3SHajimu UMEMOTO 		{
44006a99fe3SHajimu UMEMOTO 		case nss_lt_name:
44106a99fe3SHajimu UMEMOTO 			if (!st->no_name_map)
44206a99fe3SHajimu UMEMOTO 			{
4436b462d27SKonstantin Belousov 				free(buf);
4446b462d27SKonstantin Belousov 				asprintf(&buf, "%s", name);
4456b462d27SKonstantin Belousov 				if (buf == NULL)
4466b462d27SKonstantin Belousov 					return (NS_TRYAGAIN);
44706a99fe3SHajimu UMEMOTO 				rv = yp_match(st->domain, "rpc.byname", buf,
44806a99fe3SHajimu UMEMOTO 			    		strlen(buf), &resultbuf, &resultbuflen);
44906a99fe3SHajimu UMEMOTO 
45006a99fe3SHajimu UMEMOTO 				switch (rv) {
45106a99fe3SHajimu UMEMOTO 				case 0:
45206a99fe3SHajimu UMEMOTO 					break;
45306a99fe3SHajimu UMEMOTO 				case YPERR_MAP:
45406a99fe3SHajimu UMEMOTO 					st->stepping = 0;
45506a99fe3SHajimu UMEMOTO 					no_name_active = 1;
45606a99fe3SHajimu UMEMOTO 					how = nss_lt_all;
45706a99fe3SHajimu UMEMOTO 
45806a99fe3SHajimu UMEMOTO 					rv = NS_NOTFOUND;
45906a99fe3SHajimu UMEMOTO 					continue;
46006a99fe3SHajimu UMEMOTO 				default:
46106a99fe3SHajimu UMEMOTO 					rv = NS_NOTFOUND;
46206a99fe3SHajimu UMEMOTO 					goto fin;
46306a99fe3SHajimu UMEMOTO 				}
46406a99fe3SHajimu UMEMOTO 			} else {
46506a99fe3SHajimu UMEMOTO 				st->stepping = 0;
46606a99fe3SHajimu UMEMOTO 				no_name_active = 1;
46706a99fe3SHajimu UMEMOTO 				how = nss_lt_all;
46806a99fe3SHajimu UMEMOTO 
46906a99fe3SHajimu UMEMOTO 				rv = NS_NOTFOUND;
47006a99fe3SHajimu UMEMOTO 				continue;
47106a99fe3SHajimu UMEMOTO 			}
47206a99fe3SHajimu UMEMOTO 		break;
47306a99fe3SHajimu UMEMOTO 		case nss_lt_id:
4746b462d27SKonstantin Belousov 			free(buf);
4756b462d27SKonstantin Belousov 			asprintf(&buf, "%d", number);
4766b462d27SKonstantin Belousov 			if (buf == NULL)
4776b462d27SKonstantin Belousov 				return (NS_TRYAGAIN);
47806a99fe3SHajimu UMEMOTO 			if (yp_match(st->domain, "rpc.bynumber", buf,
47906a99fe3SHajimu UMEMOTO 			    	strlen(buf), &resultbuf, &resultbuflen)) {
48006a99fe3SHajimu UMEMOTO 				rv = NS_NOTFOUND;
48106a99fe3SHajimu UMEMOTO 				goto fin;
48206a99fe3SHajimu UMEMOTO 			}
48306a99fe3SHajimu UMEMOTO 			break;
48406a99fe3SHajimu UMEMOTO 		case nss_lt_all:
48506a99fe3SHajimu UMEMOTO 				if (!st->stepping) {
48606a99fe3SHajimu UMEMOTO 					rv = yp_first(st->domain, "rpc.bynumber",
48706a99fe3SHajimu UMEMOTO 				    		&st->current,
48806a99fe3SHajimu UMEMOTO 						&st->currentlen, &resultbuf,
48906a99fe3SHajimu UMEMOTO 				    		&resultbuflen);
49006a99fe3SHajimu UMEMOTO 					if (rv) {
49106a99fe3SHajimu UMEMOTO 						rv = NS_NOTFOUND;
49206a99fe3SHajimu UMEMOTO 						goto fin;
49306a99fe3SHajimu UMEMOTO 					}
49406a99fe3SHajimu UMEMOTO 					st->stepping = 1;
49506a99fe3SHajimu UMEMOTO 				} else {
49606a99fe3SHajimu UMEMOTO 					lastkey = st->current;
49706a99fe3SHajimu UMEMOTO 					rv = yp_next(st->domain, "rpc.bynumber",
49806a99fe3SHajimu UMEMOTO 				    		st->current,
49906a99fe3SHajimu UMEMOTO 						st->currentlen, &st->current,
50006a99fe3SHajimu UMEMOTO 				    		&st->currentlen,
50106a99fe3SHajimu UMEMOTO 						&resultbuf,	&resultbuflen);
50206a99fe3SHajimu UMEMOTO 					free(lastkey);
50306a99fe3SHajimu UMEMOTO 					if (rv) {
50406a99fe3SHajimu UMEMOTO 						st->stepping = 0;
50506a99fe3SHajimu UMEMOTO 						rv = NS_NOTFOUND;
50606a99fe3SHajimu UMEMOTO 						goto fin;
50706a99fe3SHajimu UMEMOTO 					}
50806a99fe3SHajimu UMEMOTO 				}
50906a99fe3SHajimu UMEMOTO 			break;
51006a99fe3SHajimu UMEMOTO 		}
51106a99fe3SHajimu UMEMOTO 
51206a99fe3SHajimu UMEMOTO 		/* we need a room for additional \n symbol */
51306a99fe3SHajimu UMEMOTO 		if (bufsize <= resultbuflen + 1 + _ALIGNBYTES +
51406a99fe3SHajimu UMEMOTO 		    sizeof(char *)) {
51506a99fe3SHajimu UMEMOTO 			*errnop = ERANGE;
51606a99fe3SHajimu UMEMOTO 			rv = NS_RETURN;
517f1209420SEnji Cooper 			free(resultbuf);
51806a99fe3SHajimu UMEMOTO 			break;
51906a99fe3SHajimu UMEMOTO 		}
52006a99fe3SHajimu UMEMOTO 
52106a99fe3SHajimu UMEMOTO 		aliases=(char **)_ALIGN(&buffer[resultbuflen+2]);
52206a99fe3SHajimu UMEMOTO 		aliases_size = (buffer + bufsize - (char *)aliases) /
52306a99fe3SHajimu UMEMOTO 			sizeof(char *);
52406a99fe3SHajimu UMEMOTO 		if (aliases_size < 1) {
52506a99fe3SHajimu UMEMOTO 			*errnop = ERANGE;
52606a99fe3SHajimu UMEMOTO 			rv = NS_RETURN;
527f1209420SEnji Cooper 			free(resultbuf);
52806a99fe3SHajimu UMEMOTO 			break;
52906a99fe3SHajimu UMEMOTO 		}
53006a99fe3SHajimu UMEMOTO 
53106a99fe3SHajimu UMEMOTO 		/*
53206a99fe3SHajimu UMEMOTO 		 * rpcent_unpack expects lines terminated with \n -- make it happy
53306a99fe3SHajimu UMEMOTO 		 */
53406a99fe3SHajimu UMEMOTO 		memcpy(buffer, resultbuf, resultbuflen);
53506a99fe3SHajimu UMEMOTO 		buffer[resultbuflen] = '\n';
53606a99fe3SHajimu UMEMOTO 		buffer[resultbuflen+1] = '\0';
53706a99fe3SHajimu UMEMOTO 		free(resultbuf);
53806a99fe3SHajimu UMEMOTO 
53906a99fe3SHajimu UMEMOTO 		if (rpcent_unpack(buffer, rpc, aliases, aliases_size,
54006a99fe3SHajimu UMEMOTO 		    errnop) != 0) {
54106a99fe3SHajimu UMEMOTO 			if (*errnop == 0)
54206a99fe3SHajimu UMEMOTO 				rv = NS_NOTFOUND;
54306a99fe3SHajimu UMEMOTO 			else
54406a99fe3SHajimu UMEMOTO 				rv = NS_RETURN;
54506a99fe3SHajimu UMEMOTO 		} else {
54606a99fe3SHajimu UMEMOTO 			if ((how == nss_lt_all) && (no_name_active != 0)) {
54706a99fe3SHajimu UMEMOTO 				if (strcmp(rpc->r_name, name) == 0)
54806a99fe3SHajimu UMEMOTO 					goto done;
54906a99fe3SHajimu UMEMOTO 				for (rp = rpc->r_aliases; *rp != NULL; rp++) {
55006a99fe3SHajimu UMEMOTO 					if (strcmp(*rp, name) == 0)
55106a99fe3SHajimu UMEMOTO 						goto done;
55206a99fe3SHajimu UMEMOTO 				}
55306a99fe3SHajimu UMEMOTO 				rv = NS_NOTFOUND;
55406a99fe3SHajimu UMEMOTO 				continue;
55506a99fe3SHajimu UMEMOTO done:
55606a99fe3SHajimu UMEMOTO 				rv = NS_SUCCESS;
55706a99fe3SHajimu UMEMOTO 			} else
55806a99fe3SHajimu UMEMOTO 				rv = NS_SUCCESS;
55906a99fe3SHajimu UMEMOTO 		}
56006a99fe3SHajimu UMEMOTO 
56106a99fe3SHajimu UMEMOTO 	} while (!(rv & NS_TERMINATE) && (how == nss_lt_all));
56206a99fe3SHajimu UMEMOTO 
56306a99fe3SHajimu UMEMOTO fin:
5646b462d27SKonstantin Belousov 	free(buf);
56506a99fe3SHajimu UMEMOTO 	if ((rv == NS_SUCCESS) && (retval != NULL))
56606a99fe3SHajimu UMEMOTO 		*((struct rpcent **)retval) = rpc;
56706a99fe3SHajimu UMEMOTO 
56806a99fe3SHajimu UMEMOTO 	return (rv);
56906a99fe3SHajimu UMEMOTO }
57006a99fe3SHajimu UMEMOTO 
57106a99fe3SHajimu UMEMOTO static int
nis_setrpcent(void * retval,void * mdata,va_list ap)57206a99fe3SHajimu UMEMOTO nis_setrpcent(void *retval, void *mdata, va_list ap)
57306a99fe3SHajimu UMEMOTO {
57406a99fe3SHajimu UMEMOTO 	struct nis_state	*st;
57506a99fe3SHajimu UMEMOTO 	int	rv;
57606a99fe3SHajimu UMEMOTO 
57706a99fe3SHajimu UMEMOTO 	rv = nis_getstate(&st);
57806a99fe3SHajimu UMEMOTO 	if (rv != 0)
57906a99fe3SHajimu UMEMOTO 		return (NS_UNAVAIL);
58006a99fe3SHajimu UMEMOTO 
5816671366aSBrooks Davis 	switch ((enum constants)(uintptr_t)mdata)
58206a99fe3SHajimu UMEMOTO 	{
58306a99fe3SHajimu UMEMOTO 	case SETRPCENT:
58406a99fe3SHajimu UMEMOTO 	case ENDRPCENT:
58506a99fe3SHajimu UMEMOTO 		free(st->current);
58606a99fe3SHajimu UMEMOTO 		st->current = NULL;
58706a99fe3SHajimu UMEMOTO 		st->stepping = 0;
58806a99fe3SHajimu UMEMOTO 		break;
58906a99fe3SHajimu UMEMOTO 	default:
59006a99fe3SHajimu UMEMOTO 		break;
59106a99fe3SHajimu UMEMOTO 	}
59206a99fe3SHajimu UMEMOTO 
59306a99fe3SHajimu UMEMOTO 	return (NS_UNAVAIL);
59406a99fe3SHajimu UMEMOTO }
59506a99fe3SHajimu UMEMOTO #endif
59606a99fe3SHajimu UMEMOTO 
59706a99fe3SHajimu UMEMOTO #ifdef NS_CACHING
59806a99fe3SHajimu UMEMOTO static int
rpc_id_func(char * buffer,size_t * buffer_size,va_list ap,void * cache_mdata)59906a99fe3SHajimu UMEMOTO rpc_id_func(char *buffer, size_t *buffer_size, va_list ap, void *cache_mdata)
60006a99fe3SHajimu UMEMOTO {
60106a99fe3SHajimu UMEMOTO 	char *name;
60206a99fe3SHajimu UMEMOTO 	int rpc;
60306a99fe3SHajimu UMEMOTO 
60406a99fe3SHajimu UMEMOTO 	size_t desired_size, size;
60506a99fe3SHajimu UMEMOTO 	enum nss_lookup_type lookup_type;
60606a99fe3SHajimu UMEMOTO 	int res = NS_UNAVAIL;
60706a99fe3SHajimu UMEMOTO 
6086671366aSBrooks Davis 	lookup_type = (enum nss_lookup_type)(uintptr_t)cache_mdata;
60906a99fe3SHajimu UMEMOTO 	switch (lookup_type) {
61006a99fe3SHajimu UMEMOTO 	case nss_lt_name:
61106a99fe3SHajimu UMEMOTO 		name = va_arg(ap, char *);
61206a99fe3SHajimu UMEMOTO 
61306a99fe3SHajimu UMEMOTO 		size = strlen(name);
61406a99fe3SHajimu UMEMOTO 		desired_size = sizeof(enum nss_lookup_type) + size + 1;
61506a99fe3SHajimu UMEMOTO 		if (desired_size > *buffer_size) {
61606a99fe3SHajimu UMEMOTO 			res = NS_RETURN;
61706a99fe3SHajimu UMEMOTO 			goto fin;
61806a99fe3SHajimu UMEMOTO 		}
61906a99fe3SHajimu UMEMOTO 
62006a99fe3SHajimu UMEMOTO 		memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type));
62106a99fe3SHajimu UMEMOTO 		memcpy(buffer + sizeof(enum nss_lookup_type), name, size + 1);
62206a99fe3SHajimu UMEMOTO 
62306a99fe3SHajimu UMEMOTO 		res = NS_SUCCESS;
62406a99fe3SHajimu UMEMOTO 		break;
62506a99fe3SHajimu UMEMOTO 	case nss_lt_id:
62606a99fe3SHajimu UMEMOTO 		rpc = va_arg(ap, int);
62706a99fe3SHajimu UMEMOTO 
62806a99fe3SHajimu UMEMOTO 		desired_size = sizeof(enum nss_lookup_type) + sizeof(int);
62906a99fe3SHajimu UMEMOTO 		if (desired_size > *buffer_size) {
63006a99fe3SHajimu UMEMOTO 			res = NS_RETURN;
63106a99fe3SHajimu UMEMOTO 			goto fin;
63206a99fe3SHajimu UMEMOTO 		}
63306a99fe3SHajimu UMEMOTO 
63406a99fe3SHajimu UMEMOTO 		memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type));
63506a99fe3SHajimu UMEMOTO 		memcpy(buffer + sizeof(enum nss_lookup_type), &rpc,
63606a99fe3SHajimu UMEMOTO 		    sizeof(int));
63706a99fe3SHajimu UMEMOTO 
63806a99fe3SHajimu UMEMOTO 		res = NS_SUCCESS;
63906a99fe3SHajimu UMEMOTO 		break;
64006a99fe3SHajimu UMEMOTO 	default:
64106a99fe3SHajimu UMEMOTO 		/* should be unreachable */
64206a99fe3SHajimu UMEMOTO 		return (NS_UNAVAIL);
64306a99fe3SHajimu UMEMOTO 	}
64406a99fe3SHajimu UMEMOTO 
64506a99fe3SHajimu UMEMOTO fin:
64606a99fe3SHajimu UMEMOTO 	*buffer_size = desired_size;
64706a99fe3SHajimu UMEMOTO 	return (res);
64806a99fe3SHajimu UMEMOTO }
64906a99fe3SHajimu UMEMOTO 
65006a99fe3SHajimu UMEMOTO static int
rpc_marshal_func(char * buffer,size_t * buffer_size,void * retval,va_list ap,void * cache_mdata)65106a99fe3SHajimu UMEMOTO rpc_marshal_func(char *buffer, size_t *buffer_size, void *retval, va_list ap,
65206a99fe3SHajimu UMEMOTO     void *cache_mdata)
65306a99fe3SHajimu UMEMOTO {
654*16b238b7SKonstantin Belousov 	char *name __unused;
655*16b238b7SKonstantin Belousov 	int num __unused;
65606a99fe3SHajimu UMEMOTO 	struct rpcent *rpc;
657*16b238b7SKonstantin Belousov 	char *orig_buf __unused;
658*16b238b7SKonstantin Belousov 	size_t orig_buf_size __unused;
65906a99fe3SHajimu UMEMOTO 
66006a99fe3SHajimu UMEMOTO 	struct rpcent new_rpc;
66106a99fe3SHajimu UMEMOTO 	size_t desired_size, size, aliases_size;
66206a99fe3SHajimu UMEMOTO 	char *p;
66306a99fe3SHajimu UMEMOTO 	char **alias;
66406a99fe3SHajimu UMEMOTO 
6656671366aSBrooks Davis 	switch ((enum nss_lookup_type)(uintptr_t)cache_mdata) {
66606a99fe3SHajimu UMEMOTO 	case nss_lt_name:
66706a99fe3SHajimu UMEMOTO 		name = va_arg(ap, char *);
66806a99fe3SHajimu UMEMOTO 		break;
66906a99fe3SHajimu UMEMOTO 	case nss_lt_id:
67006a99fe3SHajimu UMEMOTO 		num = va_arg(ap, int);
67106a99fe3SHajimu UMEMOTO 		break;
67206a99fe3SHajimu UMEMOTO 	case nss_lt_all:
67306a99fe3SHajimu UMEMOTO 		break;
67406a99fe3SHajimu UMEMOTO 	default:
67506a99fe3SHajimu UMEMOTO 		/* should be unreachable */
67606a99fe3SHajimu UMEMOTO 		return (NS_UNAVAIL);
67706a99fe3SHajimu UMEMOTO 	}
67806a99fe3SHajimu UMEMOTO 
67906a99fe3SHajimu UMEMOTO 	rpc = va_arg(ap, struct rpcent *);
68006a99fe3SHajimu UMEMOTO 	orig_buf = va_arg(ap, char *);
68106a99fe3SHajimu UMEMOTO 	orig_buf_size = va_arg(ap, size_t);
68206a99fe3SHajimu UMEMOTO 
68306a99fe3SHajimu UMEMOTO 	desired_size = _ALIGNBYTES + sizeof(struct rpcent) + sizeof(char *);
68406a99fe3SHajimu UMEMOTO 	if (rpc->r_name != NULL)
68506a99fe3SHajimu UMEMOTO 		desired_size += strlen(rpc->r_name) + 1;
68606a99fe3SHajimu UMEMOTO 
68706a99fe3SHajimu UMEMOTO 	if (rpc->r_aliases != NULL) {
68806a99fe3SHajimu UMEMOTO 		aliases_size = 0;
68906a99fe3SHajimu UMEMOTO 		for (alias = rpc->r_aliases; *alias; ++alias) {
69006a99fe3SHajimu UMEMOTO 			desired_size += strlen(*alias) + 1;
69106a99fe3SHajimu UMEMOTO 			++aliases_size;
69206a99fe3SHajimu UMEMOTO 		}
69306a99fe3SHajimu UMEMOTO 
69406a99fe3SHajimu UMEMOTO 		desired_size += _ALIGNBYTES + (aliases_size + 1) *
69506a99fe3SHajimu UMEMOTO 		    sizeof(char *);
69606a99fe3SHajimu UMEMOTO 	}
69706a99fe3SHajimu UMEMOTO 
69806a99fe3SHajimu UMEMOTO 	if (*buffer_size < desired_size) {
69906a99fe3SHajimu UMEMOTO 		/* this assignment is here for future use */
70006a99fe3SHajimu UMEMOTO 		*buffer_size = desired_size;
70106a99fe3SHajimu UMEMOTO 		return (NS_RETURN);
70206a99fe3SHajimu UMEMOTO 	}
70306a99fe3SHajimu UMEMOTO 
70487541d31SGarrett Wollman 	new_rpc = *rpc;
70506a99fe3SHajimu UMEMOTO 
70606a99fe3SHajimu UMEMOTO 	*buffer_size = desired_size;
70706a99fe3SHajimu UMEMOTO 	memset(buffer, 0, desired_size);
70806a99fe3SHajimu UMEMOTO 	p = buffer + sizeof(struct rpcent) + sizeof(char *);
70906a99fe3SHajimu UMEMOTO 	memcpy(buffer + sizeof(struct rpcent), &p, sizeof(char *));
71006a99fe3SHajimu UMEMOTO 	p = (char *)_ALIGN(p);
71106a99fe3SHajimu UMEMOTO 
71206a99fe3SHajimu UMEMOTO 	if (new_rpc.r_name != NULL) {
71306a99fe3SHajimu UMEMOTO 		size = strlen(new_rpc.r_name);
71406a99fe3SHajimu UMEMOTO 		memcpy(p, new_rpc.r_name, size);
71506a99fe3SHajimu UMEMOTO 		new_rpc.r_name = p;
71606a99fe3SHajimu UMEMOTO 		p += size + 1;
71706a99fe3SHajimu UMEMOTO 	}
71806a99fe3SHajimu UMEMOTO 
71906a99fe3SHajimu UMEMOTO 	if (new_rpc.r_aliases != NULL) {
72006a99fe3SHajimu UMEMOTO 		p = (char *)_ALIGN(p);
72106a99fe3SHajimu UMEMOTO 		memcpy(p, new_rpc.r_aliases, sizeof(char *) * aliases_size);
72206a99fe3SHajimu UMEMOTO 		new_rpc.r_aliases = (char **)p;
72306a99fe3SHajimu UMEMOTO 		p += sizeof(char *) * (aliases_size + 1);
72406a99fe3SHajimu UMEMOTO 
72506a99fe3SHajimu UMEMOTO 		for (alias = new_rpc.r_aliases; *alias; ++alias) {
72606a99fe3SHajimu UMEMOTO 			size = strlen(*alias);
72706a99fe3SHajimu UMEMOTO 			memcpy(p, *alias, size);
72806a99fe3SHajimu UMEMOTO 			*alias = p;
72906a99fe3SHajimu UMEMOTO 			p += size + 1;
73006a99fe3SHajimu UMEMOTO 		}
73106a99fe3SHajimu UMEMOTO 	}
73206a99fe3SHajimu UMEMOTO 
73306a99fe3SHajimu UMEMOTO 	memcpy(buffer, &new_rpc, sizeof(struct rpcent));
73406a99fe3SHajimu UMEMOTO 	return (NS_SUCCESS);
73506a99fe3SHajimu UMEMOTO }
73606a99fe3SHajimu UMEMOTO 
73706a99fe3SHajimu UMEMOTO static int
rpc_unmarshal_func(char * buffer,size_t buffer_size,void * retval,va_list ap,void * cache_mdata)73806a99fe3SHajimu UMEMOTO rpc_unmarshal_func(char *buffer, size_t buffer_size, void *retval, va_list ap,
73906a99fe3SHajimu UMEMOTO     void *cache_mdata)
74006a99fe3SHajimu UMEMOTO {
741*16b238b7SKonstantin Belousov 	char *name __unused;
742*16b238b7SKonstantin Belousov 	int num __unused;
74306a99fe3SHajimu UMEMOTO 	struct rpcent *rpc;
74406a99fe3SHajimu UMEMOTO 	char *orig_buf;
74506a99fe3SHajimu UMEMOTO 	size_t orig_buf_size;
74606a99fe3SHajimu UMEMOTO 	int *ret_errno;
74706a99fe3SHajimu UMEMOTO 
74806a99fe3SHajimu UMEMOTO 	char *p;
74906a99fe3SHajimu UMEMOTO 	char **alias;
75006a99fe3SHajimu UMEMOTO 
7516671366aSBrooks Davis 	switch ((enum nss_lookup_type)(uintptr_t)cache_mdata) {
75206a99fe3SHajimu UMEMOTO 	case nss_lt_name:
75306a99fe3SHajimu UMEMOTO 		name = va_arg(ap, char *);
75406a99fe3SHajimu UMEMOTO 		break;
75506a99fe3SHajimu UMEMOTO 	case nss_lt_id:
75606a99fe3SHajimu UMEMOTO 		num = va_arg(ap, int);
75706a99fe3SHajimu UMEMOTO 		break;
75806a99fe3SHajimu UMEMOTO 	case nss_lt_all:
75906a99fe3SHajimu UMEMOTO 		break;
76006a99fe3SHajimu UMEMOTO 	default:
76106a99fe3SHajimu UMEMOTO 		/* should be unreachable */
76206a99fe3SHajimu UMEMOTO 		return (NS_UNAVAIL);
76306a99fe3SHajimu UMEMOTO 	}
76406a99fe3SHajimu UMEMOTO 
76506a99fe3SHajimu UMEMOTO 	rpc = va_arg(ap, struct rpcent *);
76606a99fe3SHajimu UMEMOTO 	orig_buf = va_arg(ap, char *);
76706a99fe3SHajimu UMEMOTO 	orig_buf_size = va_arg(ap, size_t);
76806a99fe3SHajimu UMEMOTO 	ret_errno = va_arg(ap, int *);
76906a99fe3SHajimu UMEMOTO 
77006a99fe3SHajimu UMEMOTO 	if (orig_buf_size <
77106a99fe3SHajimu UMEMOTO 	    buffer_size - sizeof(struct rpcent) - sizeof(char *)) {
77206a99fe3SHajimu UMEMOTO 		*ret_errno = ERANGE;
77306a99fe3SHajimu UMEMOTO 		return (NS_RETURN);
77406a99fe3SHajimu UMEMOTO 	}
77506a99fe3SHajimu UMEMOTO 
77606a99fe3SHajimu UMEMOTO 	memcpy(rpc, buffer, sizeof(struct rpcent));
77706a99fe3SHajimu UMEMOTO 	memcpy(&p, buffer + sizeof(struct rpcent), sizeof(char *));
77806a99fe3SHajimu UMEMOTO 
77906a99fe3SHajimu UMEMOTO 	orig_buf = (char *)_ALIGN(orig_buf);
78006a99fe3SHajimu UMEMOTO 	memcpy(orig_buf, buffer + sizeof(struct rpcent) + sizeof(char *) +
78106a99fe3SHajimu UMEMOTO 	    _ALIGN(p) - (size_t)p,
78206a99fe3SHajimu UMEMOTO 	    buffer_size - sizeof(struct rpcent) - sizeof(char *) -
78306a99fe3SHajimu UMEMOTO 	    _ALIGN(p) + (size_t)p);
78406a99fe3SHajimu UMEMOTO 	p = (char *)_ALIGN(p);
78506a99fe3SHajimu UMEMOTO 
78606a99fe3SHajimu UMEMOTO 	NS_APPLY_OFFSET(rpc->r_name, orig_buf, p, char *);
78706a99fe3SHajimu UMEMOTO 	if (rpc->r_aliases != NULL) {
78806a99fe3SHajimu UMEMOTO 		NS_APPLY_OFFSET(rpc->r_aliases, orig_buf, p, char **);
78906a99fe3SHajimu UMEMOTO 
79006a99fe3SHajimu UMEMOTO 		for (alias = rpc->r_aliases	; *alias; ++alias)
79106a99fe3SHajimu UMEMOTO 			NS_APPLY_OFFSET(*alias, orig_buf, p, char *);
79206a99fe3SHajimu UMEMOTO 	}
79306a99fe3SHajimu UMEMOTO 
79406a99fe3SHajimu UMEMOTO 	if (retval != NULL)
79506a99fe3SHajimu UMEMOTO 		*((struct rpcent **)retval) = rpc;
79606a99fe3SHajimu UMEMOTO 
79706a99fe3SHajimu UMEMOTO 	return (NS_SUCCESS);
79806a99fe3SHajimu UMEMOTO }
79906a99fe3SHajimu UMEMOTO 
80006a99fe3SHajimu UMEMOTO NSS_MP_CACHE_HANDLING(rpc);
80106a99fe3SHajimu UMEMOTO #endif /* NS_CACHING */
80206a99fe3SHajimu UMEMOTO 
80306a99fe3SHajimu UMEMOTO 
80406a99fe3SHajimu UMEMOTO /* get**_r functions implementation */
80506a99fe3SHajimu UMEMOTO static int
getrpcbyname_r(const char * name,struct rpcent * rpc,char * buffer,size_t bufsize,struct rpcent ** result)80606a99fe3SHajimu UMEMOTO getrpcbyname_r(const char *name, struct rpcent *rpc, char *buffer,
80706a99fe3SHajimu UMEMOTO 	size_t bufsize, struct rpcent **result)
80806a99fe3SHajimu UMEMOTO {
80906a99fe3SHajimu UMEMOTO #ifdef NS_CACHING
81006a99fe3SHajimu UMEMOTO 	static const nss_cache_info cache_info =
81106a99fe3SHajimu UMEMOTO     		NS_COMMON_CACHE_INFO_INITIALIZER(
81206a99fe3SHajimu UMEMOTO 		rpc, (void *)nss_lt_name,
81306a99fe3SHajimu UMEMOTO 		rpc_id_func, rpc_marshal_func, rpc_unmarshal_func);
81406a99fe3SHajimu UMEMOTO #endif
81506a99fe3SHajimu UMEMOTO 	static const ns_dtab dtab[] = {
81606a99fe3SHajimu UMEMOTO 		{ NSSRC_FILES, files_rpcent, (void *)nss_lt_name },
81706a99fe3SHajimu UMEMOTO #ifdef YP
81806a99fe3SHajimu UMEMOTO 		{ NSSRC_NIS, nis_rpcent, (void *)nss_lt_name },
81906a99fe3SHajimu UMEMOTO #endif
82006a99fe3SHajimu UMEMOTO #ifdef NS_CACHING
82106a99fe3SHajimu UMEMOTO 		NS_CACHE_CB(&cache_info)
82206a99fe3SHajimu UMEMOTO #endif
82306a99fe3SHajimu UMEMOTO 		{ NULL, NULL, NULL }
82406a99fe3SHajimu UMEMOTO 	};
82506a99fe3SHajimu UMEMOTO 	int rv, ret_errno;
82606a99fe3SHajimu UMEMOTO 
82706a99fe3SHajimu UMEMOTO 	ret_errno = 0;
82806a99fe3SHajimu UMEMOTO 	*result = NULL;
82906a99fe3SHajimu UMEMOTO 	rv = nsdispatch(result, dtab, NSDB_RPC, "getrpcbyname_r", defaultsrc,
83006a99fe3SHajimu UMEMOTO 	    name, rpc, buffer, bufsize, &ret_errno);
83106a99fe3SHajimu UMEMOTO 
83206a99fe3SHajimu UMEMOTO 	if (rv == NS_SUCCESS)
83306a99fe3SHajimu UMEMOTO 		return (0);
83406a99fe3SHajimu UMEMOTO 	else
83506a99fe3SHajimu UMEMOTO 		return (ret_errno);
83606a99fe3SHajimu UMEMOTO }
83706a99fe3SHajimu UMEMOTO 
83806a99fe3SHajimu UMEMOTO static int
getrpcbynumber_r(int number,struct rpcent * rpc,char * buffer,size_t bufsize,struct rpcent ** result)83906a99fe3SHajimu UMEMOTO getrpcbynumber_r(int number, struct rpcent *rpc, char *buffer,
84006a99fe3SHajimu UMEMOTO 	size_t bufsize, struct rpcent **result)
84106a99fe3SHajimu UMEMOTO {
84206a99fe3SHajimu UMEMOTO #ifdef NS_CACHING
84306a99fe3SHajimu UMEMOTO 	static const nss_cache_info cache_info =
84406a99fe3SHajimu UMEMOTO     		NS_COMMON_CACHE_INFO_INITIALIZER(
84506a99fe3SHajimu UMEMOTO 		rpc, (void *)nss_lt_id,
84606a99fe3SHajimu UMEMOTO 		rpc_id_func, rpc_marshal_func, rpc_unmarshal_func);
84706a99fe3SHajimu UMEMOTO #endif
84806a99fe3SHajimu UMEMOTO 	static const ns_dtab dtab[] = {
84906a99fe3SHajimu UMEMOTO 		{ NSSRC_FILES, files_rpcent, (void *)nss_lt_id },
85006a99fe3SHajimu UMEMOTO #ifdef YP
85106a99fe3SHajimu UMEMOTO 		{ NSSRC_NIS, nis_rpcent, (void *)nss_lt_id },
85206a99fe3SHajimu UMEMOTO #endif
85306a99fe3SHajimu UMEMOTO #ifdef NS_CACHING
85406a99fe3SHajimu UMEMOTO 		NS_CACHE_CB(&cache_info)
85506a99fe3SHajimu UMEMOTO #endif
85606a99fe3SHajimu UMEMOTO 		{ NULL, NULL, NULL }
85706a99fe3SHajimu UMEMOTO 	};
85806a99fe3SHajimu UMEMOTO 	int rv, ret_errno;
85906a99fe3SHajimu UMEMOTO 
86006a99fe3SHajimu UMEMOTO 	ret_errno = 0;
86106a99fe3SHajimu UMEMOTO 	*result = NULL;
86206a99fe3SHajimu UMEMOTO 	rv = nsdispatch(result, dtab, NSDB_RPC, "getrpcbynumber_r", defaultsrc,
86306a99fe3SHajimu UMEMOTO 	    number, rpc, buffer, bufsize, &ret_errno);
86406a99fe3SHajimu UMEMOTO 
86506a99fe3SHajimu UMEMOTO 	if (rv == NS_SUCCESS)
86606a99fe3SHajimu UMEMOTO 		return (0);
86706a99fe3SHajimu UMEMOTO 	else
86806a99fe3SHajimu UMEMOTO 		return (ret_errno);
86906a99fe3SHajimu UMEMOTO }
87006a99fe3SHajimu UMEMOTO 
87106a99fe3SHajimu UMEMOTO static int
getrpcent_r(struct rpcent * rpc,char * buffer,size_t bufsize,struct rpcent ** result)87206a99fe3SHajimu UMEMOTO getrpcent_r(struct rpcent *rpc, char *buffer, size_t bufsize,
87306a99fe3SHajimu UMEMOTO 	struct rpcent **result)
87406a99fe3SHajimu UMEMOTO {
87506a99fe3SHajimu UMEMOTO #ifdef NS_CACHING
87606a99fe3SHajimu UMEMOTO 	static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER(
87706a99fe3SHajimu UMEMOTO 		rpc, (void *)nss_lt_all,
87806a99fe3SHajimu UMEMOTO 		rpc_marshal_func, rpc_unmarshal_func);
87906a99fe3SHajimu UMEMOTO #endif
88006a99fe3SHajimu UMEMOTO 	static const ns_dtab dtab[] = {
88106a99fe3SHajimu UMEMOTO 		{ NSSRC_FILES, files_rpcent, (void *)nss_lt_all },
88206a99fe3SHajimu UMEMOTO #ifdef YP
88306a99fe3SHajimu UMEMOTO 		{ NSSRC_NIS, nis_rpcent, (void *)nss_lt_all },
88406a99fe3SHajimu UMEMOTO #endif
88506a99fe3SHajimu UMEMOTO #ifdef NS_CACHING
88606a99fe3SHajimu UMEMOTO 		NS_CACHE_CB(&cache_info)
88706a99fe3SHajimu UMEMOTO #endif
88806a99fe3SHajimu UMEMOTO 		{ NULL, NULL, NULL }
88906a99fe3SHajimu UMEMOTO 	};
89006a99fe3SHajimu UMEMOTO 	int rv, ret_errno;
89106a99fe3SHajimu UMEMOTO 
89206a99fe3SHajimu UMEMOTO 	ret_errno = 0;
89306a99fe3SHajimu UMEMOTO 	*result = NULL;
89406a99fe3SHajimu UMEMOTO 	rv = nsdispatch(result, dtab, NSDB_RPC, "getrpcent_r", defaultsrc,
89506a99fe3SHajimu UMEMOTO 	    rpc, buffer, bufsize, &ret_errno);
89606a99fe3SHajimu UMEMOTO 
89706a99fe3SHajimu UMEMOTO 	if (rv == NS_SUCCESS)
89806a99fe3SHajimu UMEMOTO 		return (0);
89906a99fe3SHajimu UMEMOTO 	else
90006a99fe3SHajimu UMEMOTO 		return (ret_errno);
90106a99fe3SHajimu UMEMOTO }
90206a99fe3SHajimu UMEMOTO 
90306a99fe3SHajimu UMEMOTO /* get** wrappers for get**_r functions implementation */
90406a99fe3SHajimu UMEMOTO static 	void
rpcent_endstate(void * p)90506a99fe3SHajimu UMEMOTO rpcent_endstate(void *p)
90606a99fe3SHajimu UMEMOTO {
90706a99fe3SHajimu UMEMOTO 	if (p == NULL)
90806a99fe3SHajimu UMEMOTO 		return;
90906a99fe3SHajimu UMEMOTO 
91006a99fe3SHajimu UMEMOTO 	free(((struct rpcent_state *)p)->buffer);
91106a99fe3SHajimu UMEMOTO 	free(p);
91206a99fe3SHajimu UMEMOTO }
91306a99fe3SHajimu UMEMOTO 
91406a99fe3SHajimu UMEMOTO static	int
wrap_getrpcbyname_r(union key key,struct rpcent * rpc,char * buffer,size_t bufsize,struct rpcent ** res)91506a99fe3SHajimu UMEMOTO wrap_getrpcbyname_r(union key key, struct rpcent *rpc, char *buffer,
91606a99fe3SHajimu UMEMOTO     size_t bufsize, struct rpcent **res)
91706a99fe3SHajimu UMEMOTO {
91806a99fe3SHajimu UMEMOTO 	return (getrpcbyname_r(key.name, rpc, buffer, bufsize, res));
91906a99fe3SHajimu UMEMOTO }
92006a99fe3SHajimu UMEMOTO 
92106a99fe3SHajimu UMEMOTO static	int
wrap_getrpcbynumber_r(union key key,struct rpcent * rpc,char * buffer,size_t bufsize,struct rpcent ** res)92206a99fe3SHajimu UMEMOTO wrap_getrpcbynumber_r(union key key, struct rpcent *rpc, char *buffer,
92306a99fe3SHajimu UMEMOTO     size_t bufsize, struct rpcent **res)
92406a99fe3SHajimu UMEMOTO {
92506a99fe3SHajimu UMEMOTO 	return (getrpcbynumber_r(key.number, rpc, buffer, bufsize, res));
92606a99fe3SHajimu UMEMOTO }
92706a99fe3SHajimu UMEMOTO 
92806a99fe3SHajimu UMEMOTO static	int
wrap_getrpcent_r(union key key __unused,struct rpcent * rpc,char * buffer,size_t bufsize,struct rpcent ** res)92906a99fe3SHajimu UMEMOTO wrap_getrpcent_r(union key key __unused, struct rpcent *rpc, char *buffer,
93006a99fe3SHajimu UMEMOTO     size_t bufsize, struct rpcent **res)
93106a99fe3SHajimu UMEMOTO {
93206a99fe3SHajimu UMEMOTO 	return (getrpcent_r(rpc, buffer, bufsize, res));
93306a99fe3SHajimu UMEMOTO }
93406a99fe3SHajimu UMEMOTO 
93506a99fe3SHajimu UMEMOTO static struct rpcent *
getrpc(int (* fn)(union key,struct rpcent *,char *,size_t,struct rpcent **),union key key)93606a99fe3SHajimu UMEMOTO getrpc(int (*fn)(union key, struct rpcent *, char *, size_t, struct rpcent **),
93706a99fe3SHajimu UMEMOTO     union key key)
93806a99fe3SHajimu UMEMOTO {
93906a99fe3SHajimu UMEMOTO 	int		 rv;
94006a99fe3SHajimu UMEMOTO 	struct rpcent	*res;
94106a99fe3SHajimu UMEMOTO 	struct rpcent_state * st;
94206a99fe3SHajimu UMEMOTO 
94306a99fe3SHajimu UMEMOTO 	rv=rpcent_getstate(&st);
94406a99fe3SHajimu UMEMOTO 	if (rv != 0) {
94506a99fe3SHajimu UMEMOTO 		errno = rv;
94606a99fe3SHajimu UMEMOTO 		return NULL;
94706a99fe3SHajimu UMEMOTO 	}
94806a99fe3SHajimu UMEMOTO 
94906a99fe3SHajimu UMEMOTO 	if (st->buffer == NULL) {
95006a99fe3SHajimu UMEMOTO 		st->buffer = malloc(RPCENT_STORAGE_INITIAL);
95106a99fe3SHajimu UMEMOTO 		if (st->buffer == NULL)
95206a99fe3SHajimu UMEMOTO 			return (NULL);
95306a99fe3SHajimu UMEMOTO 		st->bufsize = RPCENT_STORAGE_INITIAL;
95406a99fe3SHajimu UMEMOTO 	}
95506a99fe3SHajimu UMEMOTO 	do {
95606a99fe3SHajimu UMEMOTO 		rv = fn(key, &st->rpc, st->buffer, st->bufsize, &res);
95706a99fe3SHajimu UMEMOTO 		if (res == NULL && rv == ERANGE) {
95806a99fe3SHajimu UMEMOTO 			free(st->buffer);
95906a99fe3SHajimu UMEMOTO 			if ((st->bufsize << 1) > RPCENT_STORAGE_MAX) {
96006a99fe3SHajimu UMEMOTO 				st->buffer = NULL;
96106a99fe3SHajimu UMEMOTO 				errno = ERANGE;
96206a99fe3SHajimu UMEMOTO 				return (NULL);
96306a99fe3SHajimu UMEMOTO 			}
96406a99fe3SHajimu UMEMOTO 			st->bufsize <<= 1;
96506a99fe3SHajimu UMEMOTO 			st->buffer = malloc(st->bufsize);
96606a99fe3SHajimu UMEMOTO 			if (st->buffer == NULL)
96706a99fe3SHajimu UMEMOTO 				return (NULL);
96806a99fe3SHajimu UMEMOTO 		}
96906a99fe3SHajimu UMEMOTO 	} while (res == NULL && rv == ERANGE);
97006a99fe3SHajimu UMEMOTO 	if (rv != 0)
97106a99fe3SHajimu UMEMOTO 		errno = rv;
97206a99fe3SHajimu UMEMOTO 
97306a99fe3SHajimu UMEMOTO 	return (res);
97406a99fe3SHajimu UMEMOTO }
97506a99fe3SHajimu UMEMOTO 
97606a99fe3SHajimu UMEMOTO struct rpcent *
getrpcbyname(const char * name)977283970e8SPedro F. Giffuni getrpcbyname(const char *name)
97806a99fe3SHajimu UMEMOTO {
97906a99fe3SHajimu UMEMOTO 	union key key;
98006a99fe3SHajimu UMEMOTO 
98106a99fe3SHajimu UMEMOTO 	key.name = name;
98206a99fe3SHajimu UMEMOTO 
98306a99fe3SHajimu UMEMOTO 	return (getrpc(wrap_getrpcbyname_r, key));
98406a99fe3SHajimu UMEMOTO }
98506a99fe3SHajimu UMEMOTO 
98606a99fe3SHajimu UMEMOTO struct rpcent *
getrpcbynumber(int number)98706a99fe3SHajimu UMEMOTO getrpcbynumber(int number)
98806a99fe3SHajimu UMEMOTO {
98906a99fe3SHajimu UMEMOTO 	union key key;
99006a99fe3SHajimu UMEMOTO 
99106a99fe3SHajimu UMEMOTO 	key.number = number;
99206a99fe3SHajimu UMEMOTO 
99306a99fe3SHajimu UMEMOTO 	return (getrpc(wrap_getrpcbynumber_r, key));
99406a99fe3SHajimu UMEMOTO }
99506a99fe3SHajimu UMEMOTO 
99606a99fe3SHajimu UMEMOTO struct rpcent *
getrpcent(void)997587cf682SCraig Rodrigues getrpcent(void)
99806a99fe3SHajimu UMEMOTO {
99906a99fe3SHajimu UMEMOTO 	union key key;
100006a99fe3SHajimu UMEMOTO 
100106a99fe3SHajimu UMEMOTO 	key.number = 0;	/* not used */
100206a99fe3SHajimu UMEMOTO 
100306a99fe3SHajimu UMEMOTO 	return (getrpc(wrap_getrpcent_r, key));
100406a99fe3SHajimu UMEMOTO }
100506a99fe3SHajimu UMEMOTO 
100606a99fe3SHajimu UMEMOTO void
setrpcent(int stayopen)100706a99fe3SHajimu UMEMOTO setrpcent(int stayopen)
100806a99fe3SHajimu UMEMOTO {
100906a99fe3SHajimu UMEMOTO #ifdef NS_CACHING
101006a99fe3SHajimu UMEMOTO 	static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER(
101106a99fe3SHajimu UMEMOTO 		rpc, (void *)nss_lt_all,
101206a99fe3SHajimu UMEMOTO 		NULL, NULL);
101306a99fe3SHajimu UMEMOTO #endif
101406a99fe3SHajimu UMEMOTO 
101506a99fe3SHajimu UMEMOTO 	static const ns_dtab dtab[] = {
101606a99fe3SHajimu UMEMOTO 		{ NSSRC_FILES, files_setrpcent, (void *)SETRPCENT },
101706a99fe3SHajimu UMEMOTO #ifdef YP
101806a99fe3SHajimu UMEMOTO 		{ NSSRC_NIS, nis_setrpcent, (void *)SETRPCENT },
101906a99fe3SHajimu UMEMOTO #endif
102006a99fe3SHajimu UMEMOTO #ifdef NS_CACHING
102106a99fe3SHajimu UMEMOTO 		NS_CACHE_CB(&cache_info)
102206a99fe3SHajimu UMEMOTO #endif
102306a99fe3SHajimu UMEMOTO 		{ NULL, NULL, NULL }
102406a99fe3SHajimu UMEMOTO 	};
102506a99fe3SHajimu UMEMOTO 
102606a99fe3SHajimu UMEMOTO 	(void)nsdispatch(NULL, dtab, NSDB_RPC, "setrpcent", defaultsrc,
102706a99fe3SHajimu UMEMOTO 		stayopen);
102806a99fe3SHajimu UMEMOTO }
102906a99fe3SHajimu UMEMOTO 
103006a99fe3SHajimu UMEMOTO void
endrpcent(void)1031587cf682SCraig Rodrigues endrpcent(void)
103206a99fe3SHajimu UMEMOTO {
103306a99fe3SHajimu UMEMOTO #ifdef NS_CACHING
103406a99fe3SHajimu UMEMOTO 	static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER(
103506a99fe3SHajimu UMEMOTO 		rpc, (void *)nss_lt_all,
103606a99fe3SHajimu UMEMOTO 		NULL, NULL);
103706a99fe3SHajimu UMEMOTO #endif
103806a99fe3SHajimu UMEMOTO 
103906a99fe3SHajimu UMEMOTO 	static const ns_dtab dtab[] = {
104006a99fe3SHajimu UMEMOTO 		{ NSSRC_FILES, files_setrpcent, (void *)ENDRPCENT },
104106a99fe3SHajimu UMEMOTO #ifdef YP
104206a99fe3SHajimu UMEMOTO 		{ NSSRC_NIS, nis_setrpcent, (void *)ENDRPCENT },
104306a99fe3SHajimu UMEMOTO #endif
104406a99fe3SHajimu UMEMOTO #ifdef NS_CACHING
104506a99fe3SHajimu UMEMOTO 		NS_CACHE_CB(&cache_info)
104606a99fe3SHajimu UMEMOTO #endif
104706a99fe3SHajimu UMEMOTO 		{ NULL, NULL, NULL }
104806a99fe3SHajimu UMEMOTO 	};
104906a99fe3SHajimu UMEMOTO 
10504ea86771SJonathan Chen 	(void)nsdispatch(NULL, dtab, NSDB_RPC, "endrpcent", defaultsrc);
105106a99fe3SHajimu UMEMOTO }
1052