18360efbdSAlfred Perlstein /* $NetBSD: getrpcent.c,v 1.17 2000/01/22 22:19:17 mycroft Exp $ */ 28360efbdSAlfred Perlstein 32e322d37SHiroki Sato /*- 4*8a16b7a1SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 5*8a16b7a1SPedro 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 #if defined(LIBC_SCCS) && !defined(lint) 348360efbdSAlfred Perlstein static char *sccsid = "@(#)getrpcent.c 1.14 91/03/11 Copyr 1984 Sun Micro"; 3599064799SGarrett Wollman #endif 36d3d20c82SDavid E. O'Brien #include <sys/cdefs.h> 37d3d20c82SDavid E. O'Brien __FBSDID("$FreeBSD$"); 3899064799SGarrett Wollman 3999064799SGarrett Wollman /* 4099064799SGarrett Wollman * Copyright (c) 1984 by Sun Microsystems, Inc. 4199064799SGarrett Wollman */ 4299064799SGarrett Wollman 4306a99fe3SHajimu UMEMOTO #include <sys/param.h> 4406a99fe3SHajimu UMEMOTO #include <sys/socket.h> 458360efbdSAlfred Perlstein #include <arpa/inet.h> 468360efbdSAlfred Perlstein #include <assert.h> 4706a99fe3SHajimu UMEMOTO #include <errno.h> 4806a99fe3SHajimu UMEMOTO #include <nsswitch.h> 4906a99fe3SHajimu UMEMOTO #include <netinet/in.h> 5099064799SGarrett Wollman #include <stdio.h> 5199064799SGarrett Wollman #include <string.h> 5206a99fe3SHajimu UMEMOTO #include <stdarg.h> 5306a99fe3SHajimu UMEMOTO #include <stdlib.h> 5499064799SGarrett Wollman #include <rpc/rpc.h> 5599064799SGarrett Wollman #ifdef YP 5699064799SGarrett Wollman #include <rpcsvc/yp_prot.h> 5799064799SGarrett Wollman #include <rpcsvc/ypclnt.h> 5899064799SGarrett Wollman #endif 5906a99fe3SHajimu UMEMOTO #include <unistd.h> 6006a99fe3SHajimu UMEMOTO #include "namespace.h" 6106a99fe3SHajimu UMEMOTO #include "reentrant.h" 628360efbdSAlfred Perlstein #include "un-namespace.h" 632bbd7cf8SJacques Vidrine #include "libc_private.h" 6406a99fe3SHajimu UMEMOTO #include "nss_tls.h" 6506a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 6606a99fe3SHajimu UMEMOTO #include "nscache.h" 6799064799SGarrett Wollman #endif 6899064799SGarrett Wollman 698360efbdSAlfred Perlstein #define RPCDB "/etc/rpc" 7099064799SGarrett Wollman 7106a99fe3SHajimu UMEMOTO /* nsswitch declarations */ 7206a99fe3SHajimu UMEMOTO enum constants 7399064799SGarrett Wollman { 7406a99fe3SHajimu UMEMOTO SETRPCENT = 1, 7506a99fe3SHajimu UMEMOTO ENDRPCENT = 2, 7606a99fe3SHajimu UMEMOTO RPCENT_STORAGE_INITIAL = 1 << 10, /* 1 KByte */ 7706a99fe3SHajimu UMEMOTO RPCENT_STORAGE_MAX = 1 << 20, /* 1 MByte */ 7806a99fe3SHajimu UMEMOTO }; 7999064799SGarrett Wollman 8006a99fe3SHajimu UMEMOTO static const ns_src defaultsrc[] = { 8106a99fe3SHajimu UMEMOTO { NSSRC_FILES, NS_SUCCESS }, 8206a99fe3SHajimu UMEMOTO #ifdef YP 8306a99fe3SHajimu UMEMOTO { NSSRC_NIS, NS_SUCCESS }, 8406a99fe3SHajimu UMEMOTO #endif 8506a99fe3SHajimu UMEMOTO { NULL, 0 } 8606a99fe3SHajimu UMEMOTO }; 8799064799SGarrett Wollman 8806a99fe3SHajimu UMEMOTO /* files backend declarations */ 8906a99fe3SHajimu UMEMOTO struct files_state { 9006a99fe3SHajimu UMEMOTO FILE *fp; 9106a99fe3SHajimu UMEMOTO int stayopen; 9206a99fe3SHajimu UMEMOTO }; 9306a99fe3SHajimu UMEMOTO 9406a99fe3SHajimu UMEMOTO static int files_rpcent(void *, void *, va_list); 9506a99fe3SHajimu UMEMOTO static int files_setrpcent(void *, void *, va_list); 9606a99fe3SHajimu UMEMOTO 9706a99fe3SHajimu UMEMOTO static void files_endstate(void *); 9806a99fe3SHajimu UMEMOTO NSS_TLS_HANDLING(files); 9906a99fe3SHajimu UMEMOTO 10006a99fe3SHajimu UMEMOTO /* nis backend declarations */ 10106a99fe3SHajimu UMEMOTO #ifdef YP 10206a99fe3SHajimu UMEMOTO struct nis_state { 10306a99fe3SHajimu UMEMOTO char domain[MAXHOSTNAMELEN]; 10406a99fe3SHajimu UMEMOTO char *current; 10506a99fe3SHajimu UMEMOTO int currentlen; 10606a99fe3SHajimu UMEMOTO int stepping; 10706a99fe3SHajimu UMEMOTO int no_name_map; 10806a99fe3SHajimu UMEMOTO }; 10906a99fe3SHajimu UMEMOTO 11006a99fe3SHajimu UMEMOTO static int nis_rpcent(void *, void *, va_list); 11106a99fe3SHajimu UMEMOTO static int nis_setrpcent(void *, void *, va_list); 11206a99fe3SHajimu UMEMOTO 11306a99fe3SHajimu UMEMOTO static void nis_endstate(void *); 11406a99fe3SHajimu UMEMOTO NSS_TLS_HANDLING(nis); 11506a99fe3SHajimu UMEMOTO #endif 11606a99fe3SHajimu UMEMOTO 11706a99fe3SHajimu UMEMOTO /* get** wrappers for get**_r functions declarations */ 11806a99fe3SHajimu UMEMOTO struct rpcent_state { 11906a99fe3SHajimu UMEMOTO struct rpcent rpc; 12006a99fe3SHajimu UMEMOTO char *buffer; 12106a99fe3SHajimu UMEMOTO size_t bufsize; 12206a99fe3SHajimu UMEMOTO }; 12306a99fe3SHajimu UMEMOTO static void rpcent_endstate(void *); 12406a99fe3SHajimu UMEMOTO NSS_TLS_HANDLING(rpcent); 12506a99fe3SHajimu UMEMOTO 12606a99fe3SHajimu UMEMOTO union key { 12706a99fe3SHajimu UMEMOTO const char *name; 1288360efbdSAlfred Perlstein int number; 12906a99fe3SHajimu UMEMOTO }; 13099064799SGarrett Wollman 13106a99fe3SHajimu UMEMOTO static int wrap_getrpcbyname_r(union key, struct rpcent *, char *, 13206a99fe3SHajimu UMEMOTO size_t, struct rpcent **); 13306a99fe3SHajimu UMEMOTO static int wrap_getrpcbynumber_r(union key, struct rpcent *, char *, 13406a99fe3SHajimu UMEMOTO size_t, struct rpcent **); 13506a99fe3SHajimu UMEMOTO static int wrap_getrpcent_r(union key, struct rpcent *, char *, 13606a99fe3SHajimu UMEMOTO size_t, struct rpcent **); 13706a99fe3SHajimu UMEMOTO static struct rpcent *getrpc(int (*fn)(union key, struct rpcent *, char *, 13806a99fe3SHajimu UMEMOTO size_t, struct rpcent **), union key); 1398360efbdSAlfred Perlstein 14006a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 14106a99fe3SHajimu UMEMOTO static int rpc_id_func(char *, size_t *, va_list, void *); 14206a99fe3SHajimu UMEMOTO static int rpc_marshal_func(char *, size_t *, void *, va_list, void *); 14306a99fe3SHajimu UMEMOTO static int rpc_unmarshal_func(char *, size_t, void *, va_list, void *); 14499064799SGarrett Wollman #endif 14599064799SGarrett Wollman 14606a99fe3SHajimu UMEMOTO static int 14706a99fe3SHajimu UMEMOTO rpcent_unpack(char *p, struct rpcent *rpc, char **r_aliases, 14806a99fe3SHajimu UMEMOTO size_t aliases_size, int *errnop) 14999064799SGarrett Wollman { 1508360efbdSAlfred Perlstein char *cp, **q; 1518360efbdSAlfred Perlstein 15206a99fe3SHajimu UMEMOTO assert(p != NULL); 15399064799SGarrett Wollman 15499064799SGarrett Wollman if (*p == '#') 15506a99fe3SHajimu UMEMOTO return (-1); 15699064799SGarrett Wollman cp = strpbrk(p, "#\n"); 15799064799SGarrett Wollman if (cp == NULL) 15806a99fe3SHajimu UMEMOTO return (-1); 15999064799SGarrett Wollman *cp = '\0'; 16099064799SGarrett Wollman cp = strpbrk(p, " \t"); 16199064799SGarrett Wollman if (cp == NULL) 16206a99fe3SHajimu UMEMOTO return (-1); 16399064799SGarrett Wollman *cp++ = '\0'; 16499064799SGarrett Wollman /* THIS STUFF IS INTERNET SPECIFIC */ 16506a99fe3SHajimu UMEMOTO rpc->r_name = p; 16699064799SGarrett Wollman while (*cp == ' ' || *cp == '\t') 16799064799SGarrett Wollman cp++; 16806a99fe3SHajimu UMEMOTO rpc->r_number = atoi(cp); 16906a99fe3SHajimu UMEMOTO q = rpc->r_aliases = r_aliases; 17099064799SGarrett Wollman cp = strpbrk(cp, " \t"); 17199064799SGarrett Wollman if (cp != NULL) 17299064799SGarrett Wollman *cp++ = '\0'; 17399064799SGarrett Wollman while (cp && *cp) { 17499064799SGarrett Wollman if (*cp == ' ' || *cp == '\t') { 17599064799SGarrett Wollman cp++; 17699064799SGarrett Wollman continue; 17799064799SGarrett Wollman } 17806a99fe3SHajimu UMEMOTO if (q < &(r_aliases[aliases_size - 1])) 17999064799SGarrett Wollman *q++ = cp; 18006a99fe3SHajimu UMEMOTO else { 18106a99fe3SHajimu UMEMOTO *errnop = ERANGE; 18206a99fe3SHajimu UMEMOTO return -1; 18306a99fe3SHajimu UMEMOTO } 18406a99fe3SHajimu UMEMOTO 18599064799SGarrett Wollman cp = strpbrk(cp, " \t"); 18699064799SGarrett Wollman if (cp != NULL) 18799064799SGarrett Wollman *cp++ = '\0'; 18899064799SGarrett Wollman } 18999064799SGarrett Wollman *q = NULL; 19006a99fe3SHajimu UMEMOTO return 0; 19199064799SGarrett Wollman } 19299064799SGarrett Wollman 19306a99fe3SHajimu UMEMOTO /* files backend implementation */ 19406a99fe3SHajimu UMEMOTO static void 19506a99fe3SHajimu UMEMOTO files_endstate(void *p) 19606a99fe3SHajimu UMEMOTO { 19706a99fe3SHajimu UMEMOTO FILE * f; 19806a99fe3SHajimu UMEMOTO 19906a99fe3SHajimu UMEMOTO if (p == NULL) 20006a99fe3SHajimu UMEMOTO return; 20106a99fe3SHajimu UMEMOTO 20206a99fe3SHajimu UMEMOTO f = ((struct files_state *)p)->fp; 20306a99fe3SHajimu UMEMOTO if (f != NULL) 20406a99fe3SHajimu UMEMOTO fclose(f); 20506a99fe3SHajimu UMEMOTO 20606a99fe3SHajimu UMEMOTO free(p); 20706a99fe3SHajimu UMEMOTO } 20806a99fe3SHajimu UMEMOTO 20906a99fe3SHajimu UMEMOTO static int 21006a99fe3SHajimu UMEMOTO files_rpcent(void *retval, void *mdata, va_list ap) 21106a99fe3SHajimu UMEMOTO { 21206a99fe3SHajimu UMEMOTO char *name; 21306a99fe3SHajimu UMEMOTO int number; 21406a99fe3SHajimu UMEMOTO struct rpcent *rpc; 21506a99fe3SHajimu UMEMOTO char *buffer; 21606a99fe3SHajimu UMEMOTO size_t bufsize; 21706a99fe3SHajimu UMEMOTO int *errnop; 21806a99fe3SHajimu UMEMOTO 21906a99fe3SHajimu UMEMOTO char *line; 22006a99fe3SHajimu UMEMOTO size_t linesize; 22106a99fe3SHajimu UMEMOTO char **aliases; 22206a99fe3SHajimu UMEMOTO int aliases_size; 22306a99fe3SHajimu UMEMOTO char **rp; 22406a99fe3SHajimu UMEMOTO 22506a99fe3SHajimu UMEMOTO struct files_state *st; 22606a99fe3SHajimu UMEMOTO int rv; 22706a99fe3SHajimu UMEMOTO int stayopen; 22806a99fe3SHajimu UMEMOTO enum nss_lookup_type how; 22906a99fe3SHajimu UMEMOTO 23006a99fe3SHajimu UMEMOTO how = (enum nss_lookup_type)mdata; 23106a99fe3SHajimu UMEMOTO switch (how) 23206a99fe3SHajimu UMEMOTO { 23306a99fe3SHajimu UMEMOTO case nss_lt_name: 23406a99fe3SHajimu UMEMOTO name = va_arg(ap, char *); 23506a99fe3SHajimu UMEMOTO break; 23606a99fe3SHajimu UMEMOTO case nss_lt_id: 23706a99fe3SHajimu UMEMOTO number = va_arg(ap, int); 23806a99fe3SHajimu UMEMOTO break; 23906a99fe3SHajimu UMEMOTO case nss_lt_all: 24006a99fe3SHajimu UMEMOTO break; 24106a99fe3SHajimu UMEMOTO default: 24206a99fe3SHajimu UMEMOTO return (NS_NOTFOUND); 24306a99fe3SHajimu UMEMOTO } 24406a99fe3SHajimu UMEMOTO 24506a99fe3SHajimu UMEMOTO rpc = va_arg(ap, struct rpcent *); 24606a99fe3SHajimu UMEMOTO buffer = va_arg(ap, char *); 24706a99fe3SHajimu UMEMOTO bufsize = va_arg(ap, size_t); 24806a99fe3SHajimu UMEMOTO errnop = va_arg(ap, int *); 24906a99fe3SHajimu UMEMOTO 25006a99fe3SHajimu UMEMOTO *errnop = files_getstate(&st); 25106a99fe3SHajimu UMEMOTO if (*errnop != 0) 25206a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 25306a99fe3SHajimu UMEMOTO 25406a99fe3SHajimu UMEMOTO if (st->fp == NULL && (st->fp = fopen(RPCDB, "r")) == NULL) { 25506a99fe3SHajimu UMEMOTO *errnop = errno; 25606a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 25706a99fe3SHajimu UMEMOTO } 25806a99fe3SHajimu UMEMOTO 25906a99fe3SHajimu UMEMOTO if (how == nss_lt_all) 26006a99fe3SHajimu UMEMOTO stayopen = 1; 26106a99fe3SHajimu UMEMOTO else { 26206a99fe3SHajimu UMEMOTO rewind(st->fp); 26306a99fe3SHajimu UMEMOTO stayopen = st->stayopen; 26406a99fe3SHajimu UMEMOTO } 26506a99fe3SHajimu UMEMOTO 26606a99fe3SHajimu UMEMOTO do { 26706a99fe3SHajimu UMEMOTO if ((line = fgetln(st->fp, &linesize)) == NULL) { 26806a99fe3SHajimu UMEMOTO *errnop = errno; 26906a99fe3SHajimu UMEMOTO rv = NS_RETURN; 27006a99fe3SHajimu UMEMOTO break; 27106a99fe3SHajimu UMEMOTO } 27206a99fe3SHajimu UMEMOTO 27306a99fe3SHajimu UMEMOTO if (bufsize <= linesize + _ALIGNBYTES + sizeof(char *)) { 27406a99fe3SHajimu UMEMOTO *errnop = ERANGE; 27506a99fe3SHajimu UMEMOTO rv = NS_RETURN; 27606a99fe3SHajimu UMEMOTO break; 27706a99fe3SHajimu UMEMOTO } 27806a99fe3SHajimu UMEMOTO 27906a99fe3SHajimu UMEMOTO aliases = (char **)_ALIGN(&buffer[linesize+1]); 28006a99fe3SHajimu UMEMOTO aliases_size = (buffer + bufsize - 28106a99fe3SHajimu UMEMOTO (char *)aliases)/sizeof(char *); 28206a99fe3SHajimu UMEMOTO if (aliases_size < 1) { 28306a99fe3SHajimu UMEMOTO *errnop = ERANGE; 28406a99fe3SHajimu UMEMOTO rv = NS_RETURN; 28506a99fe3SHajimu UMEMOTO break; 28606a99fe3SHajimu UMEMOTO } 28706a99fe3SHajimu UMEMOTO 28806a99fe3SHajimu UMEMOTO memcpy(buffer, line, linesize); 28906a99fe3SHajimu UMEMOTO buffer[linesize] = '\0'; 29006a99fe3SHajimu UMEMOTO 29106a99fe3SHajimu UMEMOTO rv = rpcent_unpack(buffer, rpc, aliases, aliases_size, errnop); 29206a99fe3SHajimu UMEMOTO if (rv != 0) { 29306a99fe3SHajimu UMEMOTO if (*errnop == 0) { 29406a99fe3SHajimu UMEMOTO rv = NS_NOTFOUND; 29506a99fe3SHajimu UMEMOTO continue; 29606a99fe3SHajimu UMEMOTO } 29706a99fe3SHajimu UMEMOTO else { 29806a99fe3SHajimu UMEMOTO rv = NS_RETURN; 29906a99fe3SHajimu UMEMOTO break; 30006a99fe3SHajimu UMEMOTO } 30106a99fe3SHajimu UMEMOTO } 30206a99fe3SHajimu UMEMOTO 30306a99fe3SHajimu UMEMOTO switch (how) 30406a99fe3SHajimu UMEMOTO { 30506a99fe3SHajimu UMEMOTO case nss_lt_name: 30606a99fe3SHajimu UMEMOTO if (strcmp(rpc->r_name, name) == 0) 30706a99fe3SHajimu UMEMOTO goto done; 30806a99fe3SHajimu UMEMOTO for (rp = rpc->r_aliases; *rp != NULL; rp++) { 30906a99fe3SHajimu UMEMOTO if (strcmp(*rp, name) == 0) 31006a99fe3SHajimu UMEMOTO goto done; 31106a99fe3SHajimu UMEMOTO } 31206a99fe3SHajimu UMEMOTO rv = NS_NOTFOUND; 31306a99fe3SHajimu UMEMOTO continue; 31406a99fe3SHajimu UMEMOTO done: 31506a99fe3SHajimu UMEMOTO rv = NS_SUCCESS; 31606a99fe3SHajimu UMEMOTO break; 31706a99fe3SHajimu UMEMOTO case nss_lt_id: 31806a99fe3SHajimu UMEMOTO rv = (rpc->r_number == number) ? NS_SUCCESS : 31906a99fe3SHajimu UMEMOTO NS_NOTFOUND; 32006a99fe3SHajimu UMEMOTO break; 32106a99fe3SHajimu UMEMOTO case nss_lt_all: 32206a99fe3SHajimu UMEMOTO rv = NS_SUCCESS; 32306a99fe3SHajimu UMEMOTO break; 32406a99fe3SHajimu UMEMOTO } 32506a99fe3SHajimu UMEMOTO 32606a99fe3SHajimu UMEMOTO } while (!(rv & NS_TERMINATE)); 32706a99fe3SHajimu UMEMOTO 32806a99fe3SHajimu UMEMOTO if (!stayopen && st->fp!=NULL) { 32906a99fe3SHajimu UMEMOTO fclose(st->fp); 33006a99fe3SHajimu UMEMOTO st->fp = NULL; 33106a99fe3SHajimu UMEMOTO } 33206a99fe3SHajimu UMEMOTO 33306a99fe3SHajimu UMEMOTO if ((rv == NS_SUCCESS) && (retval != NULL)) 33406a99fe3SHajimu UMEMOTO *((struct rpcent **)retval) = rpc; 33506a99fe3SHajimu UMEMOTO 33606a99fe3SHajimu UMEMOTO return (rv); 33706a99fe3SHajimu UMEMOTO } 33806a99fe3SHajimu UMEMOTO 33906a99fe3SHajimu UMEMOTO static int 34006a99fe3SHajimu UMEMOTO files_setrpcent(void *retval, void *mdata, va_list ap) 34106a99fe3SHajimu UMEMOTO { 34206a99fe3SHajimu UMEMOTO struct files_state *st; 34306a99fe3SHajimu UMEMOTO int rv; 34406a99fe3SHajimu UMEMOTO int f; 34506a99fe3SHajimu UMEMOTO 34606a99fe3SHajimu UMEMOTO rv = files_getstate(&st); 34706a99fe3SHajimu UMEMOTO if (rv != 0) 34806a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 34906a99fe3SHajimu UMEMOTO 35006a99fe3SHajimu UMEMOTO switch ((enum constants)mdata) 35106a99fe3SHajimu UMEMOTO { 35206a99fe3SHajimu UMEMOTO case SETRPCENT: 35306a99fe3SHajimu UMEMOTO f = va_arg(ap,int); 35406a99fe3SHajimu UMEMOTO if (st->fp == NULL) 35506a99fe3SHajimu UMEMOTO st->fp = fopen(RPCDB, "r"); 35606a99fe3SHajimu UMEMOTO else 35706a99fe3SHajimu UMEMOTO rewind(st->fp); 35806a99fe3SHajimu UMEMOTO st->stayopen |= f; 35906a99fe3SHajimu UMEMOTO break; 36006a99fe3SHajimu UMEMOTO case ENDRPCENT: 36106a99fe3SHajimu UMEMOTO if (st->fp != NULL) { 36206a99fe3SHajimu UMEMOTO fclose(st->fp); 36306a99fe3SHajimu UMEMOTO st->fp = NULL; 36406a99fe3SHajimu UMEMOTO } 36506a99fe3SHajimu UMEMOTO st->stayopen = 0; 36606a99fe3SHajimu UMEMOTO break; 36706a99fe3SHajimu UMEMOTO default: 36806a99fe3SHajimu UMEMOTO break; 36906a99fe3SHajimu UMEMOTO } 37006a99fe3SHajimu UMEMOTO 37106a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 37206a99fe3SHajimu UMEMOTO } 37306a99fe3SHajimu UMEMOTO 37406a99fe3SHajimu UMEMOTO /* nis backend implementation */ 37506a99fe3SHajimu UMEMOTO #ifdef YP 37606a99fe3SHajimu UMEMOTO static void 37706a99fe3SHajimu UMEMOTO nis_endstate(void *p) 37806a99fe3SHajimu UMEMOTO { 37906a99fe3SHajimu UMEMOTO if (p == NULL) 38006a99fe3SHajimu UMEMOTO return; 38106a99fe3SHajimu UMEMOTO 38206a99fe3SHajimu UMEMOTO free(((struct nis_state *)p)->current); 38306a99fe3SHajimu UMEMOTO free(p); 38406a99fe3SHajimu UMEMOTO } 38506a99fe3SHajimu UMEMOTO 38606a99fe3SHajimu UMEMOTO static int 38706a99fe3SHajimu UMEMOTO nis_rpcent(void *retval, void *mdata, va_list ap) 38806a99fe3SHajimu UMEMOTO { 38906a99fe3SHajimu UMEMOTO char *name; 39006a99fe3SHajimu UMEMOTO int number; 39106a99fe3SHajimu UMEMOTO struct rpcent *rpc; 39206a99fe3SHajimu UMEMOTO char *buffer; 39306a99fe3SHajimu UMEMOTO size_t bufsize; 39406a99fe3SHajimu UMEMOTO int *errnop; 39506a99fe3SHajimu UMEMOTO 39606a99fe3SHajimu UMEMOTO char **rp; 39706a99fe3SHajimu UMEMOTO char **aliases; 39806a99fe3SHajimu UMEMOTO int aliases_size; 39906a99fe3SHajimu UMEMOTO 40006a99fe3SHajimu UMEMOTO char *lastkey; 40106a99fe3SHajimu UMEMOTO char *resultbuf; 40206a99fe3SHajimu UMEMOTO int resultbuflen; 40306a99fe3SHajimu UMEMOTO char buf[YPMAXRECORD + 2]; 40406a99fe3SHajimu UMEMOTO 40506a99fe3SHajimu UMEMOTO struct nis_state *st; 40606a99fe3SHajimu UMEMOTO int rv; 40706a99fe3SHajimu UMEMOTO enum nss_lookup_type how; 40806a99fe3SHajimu UMEMOTO int no_name_active; 40906a99fe3SHajimu UMEMOTO 41006a99fe3SHajimu UMEMOTO how = (enum nss_lookup_type)mdata; 41106a99fe3SHajimu UMEMOTO switch (how) 41206a99fe3SHajimu UMEMOTO { 41306a99fe3SHajimu UMEMOTO case nss_lt_name: 41406a99fe3SHajimu UMEMOTO name = va_arg(ap, char *); 41506a99fe3SHajimu UMEMOTO break; 41606a99fe3SHajimu UMEMOTO case nss_lt_id: 41706a99fe3SHajimu UMEMOTO number = va_arg(ap, int); 41806a99fe3SHajimu UMEMOTO break; 41906a99fe3SHajimu UMEMOTO case nss_lt_all: 42006a99fe3SHajimu UMEMOTO break; 42106a99fe3SHajimu UMEMOTO default: 42206a99fe3SHajimu UMEMOTO return (NS_NOTFOUND); 42306a99fe3SHajimu UMEMOTO } 42406a99fe3SHajimu UMEMOTO 42506a99fe3SHajimu UMEMOTO rpc = va_arg(ap, struct rpcent *); 42606a99fe3SHajimu UMEMOTO buffer = va_arg(ap, char *); 42706a99fe3SHajimu UMEMOTO bufsize = va_arg(ap, size_t); 42806a99fe3SHajimu UMEMOTO errnop = va_arg(ap, int *); 42906a99fe3SHajimu UMEMOTO 43006a99fe3SHajimu UMEMOTO *errnop = nis_getstate(&st); 43106a99fe3SHajimu UMEMOTO if (*errnop != 0) 43206a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 43306a99fe3SHajimu UMEMOTO 43406a99fe3SHajimu UMEMOTO if (st->domain[0] == '\0') { 43506a99fe3SHajimu UMEMOTO if (getdomainname(st->domain, sizeof(st->domain)) != 0) { 43606a99fe3SHajimu UMEMOTO *errnop = errno; 43706a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 43806a99fe3SHajimu UMEMOTO } 43906a99fe3SHajimu UMEMOTO } 44006a99fe3SHajimu UMEMOTO 44106a99fe3SHajimu UMEMOTO no_name_active = 0; 44206a99fe3SHajimu UMEMOTO do { 44306a99fe3SHajimu UMEMOTO switch (how) 44406a99fe3SHajimu UMEMOTO { 44506a99fe3SHajimu UMEMOTO case nss_lt_name: 44606a99fe3SHajimu UMEMOTO if (!st->no_name_map) 44706a99fe3SHajimu UMEMOTO { 44806a99fe3SHajimu UMEMOTO snprintf(buf, sizeof buf, "%s", name); 44906a99fe3SHajimu UMEMOTO rv = yp_match(st->domain, "rpc.byname", buf, 45006a99fe3SHajimu UMEMOTO strlen(buf), &resultbuf, &resultbuflen); 45106a99fe3SHajimu UMEMOTO 45206a99fe3SHajimu UMEMOTO switch (rv) { 45306a99fe3SHajimu UMEMOTO case 0: 45406a99fe3SHajimu UMEMOTO break; 45506a99fe3SHajimu UMEMOTO case YPERR_MAP: 45606a99fe3SHajimu UMEMOTO st->stepping = 0; 45706a99fe3SHajimu UMEMOTO no_name_active = 1; 45806a99fe3SHajimu UMEMOTO how = nss_lt_all; 45906a99fe3SHajimu UMEMOTO 46006a99fe3SHajimu UMEMOTO rv = NS_NOTFOUND; 46106a99fe3SHajimu UMEMOTO continue; 46206a99fe3SHajimu UMEMOTO default: 46306a99fe3SHajimu UMEMOTO rv = NS_NOTFOUND; 46406a99fe3SHajimu UMEMOTO goto fin; 46506a99fe3SHajimu UMEMOTO } 46606a99fe3SHajimu UMEMOTO } else { 46706a99fe3SHajimu UMEMOTO st->stepping = 0; 46806a99fe3SHajimu UMEMOTO no_name_active = 1; 46906a99fe3SHajimu UMEMOTO how = nss_lt_all; 47006a99fe3SHajimu UMEMOTO 47106a99fe3SHajimu UMEMOTO rv = NS_NOTFOUND; 47206a99fe3SHajimu UMEMOTO continue; 47306a99fe3SHajimu UMEMOTO } 47406a99fe3SHajimu UMEMOTO break; 47506a99fe3SHajimu UMEMOTO case nss_lt_id: 47606a99fe3SHajimu UMEMOTO snprintf(buf, sizeof buf, "%d", number); 47706a99fe3SHajimu UMEMOTO if (yp_match(st->domain, "rpc.bynumber", buf, 47806a99fe3SHajimu UMEMOTO strlen(buf), &resultbuf, &resultbuflen)) { 47906a99fe3SHajimu UMEMOTO rv = NS_NOTFOUND; 48006a99fe3SHajimu UMEMOTO goto fin; 48106a99fe3SHajimu UMEMOTO } 48206a99fe3SHajimu UMEMOTO break; 48306a99fe3SHajimu UMEMOTO case nss_lt_all: 48406a99fe3SHajimu UMEMOTO if (!st->stepping) { 48506a99fe3SHajimu UMEMOTO rv = yp_first(st->domain, "rpc.bynumber", 48606a99fe3SHajimu UMEMOTO &st->current, 48706a99fe3SHajimu UMEMOTO &st->currentlen, &resultbuf, 48806a99fe3SHajimu UMEMOTO &resultbuflen); 48906a99fe3SHajimu UMEMOTO if (rv) { 49006a99fe3SHajimu UMEMOTO rv = NS_NOTFOUND; 49106a99fe3SHajimu UMEMOTO goto fin; 49206a99fe3SHajimu UMEMOTO } 49306a99fe3SHajimu UMEMOTO st->stepping = 1; 49406a99fe3SHajimu UMEMOTO } else { 49506a99fe3SHajimu UMEMOTO lastkey = st->current; 49606a99fe3SHajimu UMEMOTO rv = yp_next(st->domain, "rpc.bynumber", 49706a99fe3SHajimu UMEMOTO st->current, 49806a99fe3SHajimu UMEMOTO st->currentlen, &st->current, 49906a99fe3SHajimu UMEMOTO &st->currentlen, 50006a99fe3SHajimu UMEMOTO &resultbuf, &resultbuflen); 50106a99fe3SHajimu UMEMOTO free(lastkey); 50206a99fe3SHajimu UMEMOTO if (rv) { 50306a99fe3SHajimu UMEMOTO st->stepping = 0; 50406a99fe3SHajimu UMEMOTO rv = NS_NOTFOUND; 50506a99fe3SHajimu UMEMOTO goto fin; 50606a99fe3SHajimu UMEMOTO } 50706a99fe3SHajimu UMEMOTO } 50806a99fe3SHajimu UMEMOTO break; 50906a99fe3SHajimu UMEMOTO } 51006a99fe3SHajimu UMEMOTO 51106a99fe3SHajimu UMEMOTO /* we need a room for additional \n symbol */ 51206a99fe3SHajimu UMEMOTO if (bufsize <= resultbuflen + 1 + _ALIGNBYTES + 51306a99fe3SHajimu UMEMOTO sizeof(char *)) { 51406a99fe3SHajimu UMEMOTO *errnop = ERANGE; 51506a99fe3SHajimu UMEMOTO rv = NS_RETURN; 516f1209420SEnji Cooper free(resultbuf); 51706a99fe3SHajimu UMEMOTO break; 51806a99fe3SHajimu UMEMOTO } 51906a99fe3SHajimu UMEMOTO 52006a99fe3SHajimu UMEMOTO aliases=(char **)_ALIGN(&buffer[resultbuflen+2]); 52106a99fe3SHajimu UMEMOTO aliases_size = (buffer + bufsize - (char *)aliases) / 52206a99fe3SHajimu UMEMOTO sizeof(char *); 52306a99fe3SHajimu UMEMOTO if (aliases_size < 1) { 52406a99fe3SHajimu UMEMOTO *errnop = ERANGE; 52506a99fe3SHajimu UMEMOTO rv = NS_RETURN; 526f1209420SEnji Cooper free(resultbuf); 52706a99fe3SHajimu UMEMOTO break; 52806a99fe3SHajimu UMEMOTO } 52906a99fe3SHajimu UMEMOTO 53006a99fe3SHajimu UMEMOTO /* 53106a99fe3SHajimu UMEMOTO * rpcent_unpack expects lines terminated with \n -- make it happy 53206a99fe3SHajimu UMEMOTO */ 53306a99fe3SHajimu UMEMOTO memcpy(buffer, resultbuf, resultbuflen); 53406a99fe3SHajimu UMEMOTO buffer[resultbuflen] = '\n'; 53506a99fe3SHajimu UMEMOTO buffer[resultbuflen+1] = '\0'; 53606a99fe3SHajimu UMEMOTO free(resultbuf); 53706a99fe3SHajimu UMEMOTO 53806a99fe3SHajimu UMEMOTO if (rpcent_unpack(buffer, rpc, aliases, aliases_size, 53906a99fe3SHajimu UMEMOTO errnop) != 0) { 54006a99fe3SHajimu UMEMOTO if (*errnop == 0) 54106a99fe3SHajimu UMEMOTO rv = NS_NOTFOUND; 54206a99fe3SHajimu UMEMOTO else 54306a99fe3SHajimu UMEMOTO rv = NS_RETURN; 54406a99fe3SHajimu UMEMOTO } else { 54506a99fe3SHajimu UMEMOTO if ((how == nss_lt_all) && (no_name_active != 0)) { 54606a99fe3SHajimu UMEMOTO if (strcmp(rpc->r_name, name) == 0) 54706a99fe3SHajimu UMEMOTO goto done; 54806a99fe3SHajimu UMEMOTO for (rp = rpc->r_aliases; *rp != NULL; rp++) { 54906a99fe3SHajimu UMEMOTO if (strcmp(*rp, name) == 0) 55006a99fe3SHajimu UMEMOTO goto done; 55106a99fe3SHajimu UMEMOTO } 55206a99fe3SHajimu UMEMOTO rv = NS_NOTFOUND; 55306a99fe3SHajimu UMEMOTO continue; 55406a99fe3SHajimu UMEMOTO done: 55506a99fe3SHajimu UMEMOTO rv = NS_SUCCESS; 55606a99fe3SHajimu UMEMOTO } else 55706a99fe3SHajimu UMEMOTO rv = NS_SUCCESS; 55806a99fe3SHajimu UMEMOTO } 55906a99fe3SHajimu UMEMOTO 56006a99fe3SHajimu UMEMOTO } while (!(rv & NS_TERMINATE) && (how == nss_lt_all)); 56106a99fe3SHajimu UMEMOTO 56206a99fe3SHajimu UMEMOTO fin: 56306a99fe3SHajimu UMEMOTO if ((rv == NS_SUCCESS) && (retval != NULL)) 56406a99fe3SHajimu UMEMOTO *((struct rpcent **)retval) = rpc; 56506a99fe3SHajimu UMEMOTO 56606a99fe3SHajimu UMEMOTO return (rv); 56706a99fe3SHajimu UMEMOTO } 56806a99fe3SHajimu UMEMOTO 56906a99fe3SHajimu UMEMOTO static int 57006a99fe3SHajimu UMEMOTO nis_setrpcent(void *retval, void *mdata, va_list ap) 57106a99fe3SHajimu UMEMOTO { 57206a99fe3SHajimu UMEMOTO struct nis_state *st; 57306a99fe3SHajimu UMEMOTO int rv; 57406a99fe3SHajimu UMEMOTO 57506a99fe3SHajimu UMEMOTO rv = nis_getstate(&st); 57606a99fe3SHajimu UMEMOTO if (rv != 0) 57706a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 57806a99fe3SHajimu UMEMOTO 57906a99fe3SHajimu UMEMOTO switch ((enum constants)mdata) 58006a99fe3SHajimu UMEMOTO { 58106a99fe3SHajimu UMEMOTO case SETRPCENT: 58206a99fe3SHajimu UMEMOTO case ENDRPCENT: 58306a99fe3SHajimu UMEMOTO free(st->current); 58406a99fe3SHajimu UMEMOTO st->current = NULL; 58506a99fe3SHajimu UMEMOTO st->stepping = 0; 58606a99fe3SHajimu UMEMOTO break; 58706a99fe3SHajimu UMEMOTO default: 58806a99fe3SHajimu UMEMOTO break; 58906a99fe3SHajimu UMEMOTO } 59006a99fe3SHajimu UMEMOTO 59106a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 59206a99fe3SHajimu UMEMOTO } 59306a99fe3SHajimu UMEMOTO #endif 59406a99fe3SHajimu UMEMOTO 59506a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 59606a99fe3SHajimu UMEMOTO static int 59706a99fe3SHajimu UMEMOTO rpc_id_func(char *buffer, size_t *buffer_size, va_list ap, void *cache_mdata) 59806a99fe3SHajimu UMEMOTO { 59906a99fe3SHajimu UMEMOTO char *name; 60006a99fe3SHajimu UMEMOTO int rpc; 60106a99fe3SHajimu UMEMOTO 60206a99fe3SHajimu UMEMOTO size_t desired_size, size; 60306a99fe3SHajimu UMEMOTO enum nss_lookup_type lookup_type; 60406a99fe3SHajimu UMEMOTO int res = NS_UNAVAIL; 60506a99fe3SHajimu UMEMOTO 60606a99fe3SHajimu UMEMOTO lookup_type = (enum nss_lookup_type)cache_mdata; 60706a99fe3SHajimu UMEMOTO switch (lookup_type) { 60806a99fe3SHajimu UMEMOTO case nss_lt_name: 60906a99fe3SHajimu UMEMOTO name = va_arg(ap, char *); 61006a99fe3SHajimu UMEMOTO 61106a99fe3SHajimu UMEMOTO size = strlen(name); 61206a99fe3SHajimu UMEMOTO desired_size = sizeof(enum nss_lookup_type) + size + 1; 61306a99fe3SHajimu UMEMOTO if (desired_size > *buffer_size) { 61406a99fe3SHajimu UMEMOTO res = NS_RETURN; 61506a99fe3SHajimu UMEMOTO goto fin; 61606a99fe3SHajimu UMEMOTO } 61706a99fe3SHajimu UMEMOTO 61806a99fe3SHajimu UMEMOTO memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type)); 61906a99fe3SHajimu UMEMOTO memcpy(buffer + sizeof(enum nss_lookup_type), name, size + 1); 62006a99fe3SHajimu UMEMOTO 62106a99fe3SHajimu UMEMOTO res = NS_SUCCESS; 62206a99fe3SHajimu UMEMOTO break; 62306a99fe3SHajimu UMEMOTO case nss_lt_id: 62406a99fe3SHajimu UMEMOTO rpc = va_arg(ap, int); 62506a99fe3SHajimu UMEMOTO 62606a99fe3SHajimu UMEMOTO desired_size = sizeof(enum nss_lookup_type) + sizeof(int); 62706a99fe3SHajimu UMEMOTO if (desired_size > *buffer_size) { 62806a99fe3SHajimu UMEMOTO res = NS_RETURN; 62906a99fe3SHajimu UMEMOTO goto fin; 63006a99fe3SHajimu UMEMOTO } 63106a99fe3SHajimu UMEMOTO 63206a99fe3SHajimu UMEMOTO memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type)); 63306a99fe3SHajimu UMEMOTO memcpy(buffer + sizeof(enum nss_lookup_type), &rpc, 63406a99fe3SHajimu UMEMOTO sizeof(int)); 63506a99fe3SHajimu UMEMOTO 63606a99fe3SHajimu UMEMOTO res = NS_SUCCESS; 63706a99fe3SHajimu UMEMOTO break; 63806a99fe3SHajimu UMEMOTO default: 63906a99fe3SHajimu UMEMOTO /* should be unreachable */ 64006a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 64106a99fe3SHajimu UMEMOTO } 64206a99fe3SHajimu UMEMOTO 64306a99fe3SHajimu UMEMOTO fin: 64406a99fe3SHajimu UMEMOTO *buffer_size = desired_size; 64506a99fe3SHajimu UMEMOTO return (res); 64606a99fe3SHajimu UMEMOTO } 64706a99fe3SHajimu UMEMOTO 64806a99fe3SHajimu UMEMOTO static int 64906a99fe3SHajimu UMEMOTO rpc_marshal_func(char *buffer, size_t *buffer_size, void *retval, va_list ap, 65006a99fe3SHajimu UMEMOTO void *cache_mdata) 65106a99fe3SHajimu UMEMOTO { 65206a99fe3SHajimu UMEMOTO char *name; 65306a99fe3SHajimu UMEMOTO int num; 65406a99fe3SHajimu UMEMOTO struct rpcent *rpc; 65506a99fe3SHajimu UMEMOTO char *orig_buf; 65606a99fe3SHajimu UMEMOTO size_t orig_buf_size; 65706a99fe3SHajimu UMEMOTO 65806a99fe3SHajimu UMEMOTO struct rpcent new_rpc; 65906a99fe3SHajimu UMEMOTO size_t desired_size, size, aliases_size; 66006a99fe3SHajimu UMEMOTO char *p; 66106a99fe3SHajimu UMEMOTO char **alias; 66206a99fe3SHajimu UMEMOTO 66306a99fe3SHajimu UMEMOTO switch ((enum nss_lookup_type)cache_mdata) { 66406a99fe3SHajimu UMEMOTO case nss_lt_name: 66506a99fe3SHajimu UMEMOTO name = va_arg(ap, char *); 66606a99fe3SHajimu UMEMOTO break; 66706a99fe3SHajimu UMEMOTO case nss_lt_id: 66806a99fe3SHajimu UMEMOTO num = va_arg(ap, int); 66906a99fe3SHajimu UMEMOTO break; 67006a99fe3SHajimu UMEMOTO case nss_lt_all: 67106a99fe3SHajimu UMEMOTO break; 67206a99fe3SHajimu UMEMOTO default: 67306a99fe3SHajimu UMEMOTO /* should be unreachable */ 67406a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 67506a99fe3SHajimu UMEMOTO } 67606a99fe3SHajimu UMEMOTO 67706a99fe3SHajimu UMEMOTO rpc = va_arg(ap, struct rpcent *); 67806a99fe3SHajimu UMEMOTO orig_buf = va_arg(ap, char *); 67906a99fe3SHajimu UMEMOTO orig_buf_size = va_arg(ap, size_t); 68006a99fe3SHajimu UMEMOTO 68106a99fe3SHajimu UMEMOTO desired_size = _ALIGNBYTES + sizeof(struct rpcent) + sizeof(char *); 68206a99fe3SHajimu UMEMOTO if (rpc->r_name != NULL) 68306a99fe3SHajimu UMEMOTO desired_size += strlen(rpc->r_name) + 1; 68406a99fe3SHajimu UMEMOTO 68506a99fe3SHajimu UMEMOTO if (rpc->r_aliases != NULL) { 68606a99fe3SHajimu UMEMOTO aliases_size = 0; 68706a99fe3SHajimu UMEMOTO for (alias = rpc->r_aliases; *alias; ++alias) { 68806a99fe3SHajimu UMEMOTO desired_size += strlen(*alias) + 1; 68906a99fe3SHajimu UMEMOTO ++aliases_size; 69006a99fe3SHajimu UMEMOTO } 69106a99fe3SHajimu UMEMOTO 69206a99fe3SHajimu UMEMOTO desired_size += _ALIGNBYTES + (aliases_size + 1) * 69306a99fe3SHajimu UMEMOTO sizeof(char *); 69406a99fe3SHajimu UMEMOTO } 69506a99fe3SHajimu UMEMOTO 69606a99fe3SHajimu UMEMOTO if (*buffer_size < desired_size) { 69706a99fe3SHajimu UMEMOTO /* this assignment is here for future use */ 69806a99fe3SHajimu UMEMOTO *buffer_size = desired_size; 69906a99fe3SHajimu UMEMOTO return (NS_RETURN); 70006a99fe3SHajimu UMEMOTO } 70106a99fe3SHajimu UMEMOTO 70287541d31SGarrett Wollman new_rpc = *rpc; 70306a99fe3SHajimu UMEMOTO 70406a99fe3SHajimu UMEMOTO *buffer_size = desired_size; 70506a99fe3SHajimu UMEMOTO memset(buffer, 0, desired_size); 70606a99fe3SHajimu UMEMOTO p = buffer + sizeof(struct rpcent) + sizeof(char *); 70706a99fe3SHajimu UMEMOTO memcpy(buffer + sizeof(struct rpcent), &p, sizeof(char *)); 70806a99fe3SHajimu UMEMOTO p = (char *)_ALIGN(p); 70906a99fe3SHajimu UMEMOTO 71006a99fe3SHajimu UMEMOTO if (new_rpc.r_name != NULL) { 71106a99fe3SHajimu UMEMOTO size = strlen(new_rpc.r_name); 71206a99fe3SHajimu UMEMOTO memcpy(p, new_rpc.r_name, size); 71306a99fe3SHajimu UMEMOTO new_rpc.r_name = p; 71406a99fe3SHajimu UMEMOTO p += size + 1; 71506a99fe3SHajimu UMEMOTO } 71606a99fe3SHajimu UMEMOTO 71706a99fe3SHajimu UMEMOTO if (new_rpc.r_aliases != NULL) { 71806a99fe3SHajimu UMEMOTO p = (char *)_ALIGN(p); 71906a99fe3SHajimu UMEMOTO memcpy(p, new_rpc.r_aliases, sizeof(char *) * aliases_size); 72006a99fe3SHajimu UMEMOTO new_rpc.r_aliases = (char **)p; 72106a99fe3SHajimu UMEMOTO p += sizeof(char *) * (aliases_size + 1); 72206a99fe3SHajimu UMEMOTO 72306a99fe3SHajimu UMEMOTO for (alias = new_rpc.r_aliases; *alias; ++alias) { 72406a99fe3SHajimu UMEMOTO size = strlen(*alias); 72506a99fe3SHajimu UMEMOTO memcpy(p, *alias, size); 72606a99fe3SHajimu UMEMOTO *alias = p; 72706a99fe3SHajimu UMEMOTO p += size + 1; 72806a99fe3SHajimu UMEMOTO } 72906a99fe3SHajimu UMEMOTO } 73006a99fe3SHajimu UMEMOTO 73106a99fe3SHajimu UMEMOTO memcpy(buffer, &new_rpc, sizeof(struct rpcent)); 73206a99fe3SHajimu UMEMOTO return (NS_SUCCESS); 73306a99fe3SHajimu UMEMOTO } 73406a99fe3SHajimu UMEMOTO 73506a99fe3SHajimu UMEMOTO static int 73606a99fe3SHajimu UMEMOTO rpc_unmarshal_func(char *buffer, size_t buffer_size, void *retval, va_list ap, 73706a99fe3SHajimu UMEMOTO void *cache_mdata) 73806a99fe3SHajimu UMEMOTO { 73906a99fe3SHajimu UMEMOTO char *name; 74006a99fe3SHajimu UMEMOTO int num; 74106a99fe3SHajimu UMEMOTO struct rpcent *rpc; 74206a99fe3SHajimu UMEMOTO char *orig_buf; 74306a99fe3SHajimu UMEMOTO size_t orig_buf_size; 74406a99fe3SHajimu UMEMOTO int *ret_errno; 74506a99fe3SHajimu UMEMOTO 74606a99fe3SHajimu UMEMOTO char *p; 74706a99fe3SHajimu UMEMOTO char **alias; 74806a99fe3SHajimu UMEMOTO 74906a99fe3SHajimu UMEMOTO switch ((enum nss_lookup_type)cache_mdata) { 75006a99fe3SHajimu UMEMOTO case nss_lt_name: 75106a99fe3SHajimu UMEMOTO name = va_arg(ap, char *); 75206a99fe3SHajimu UMEMOTO break; 75306a99fe3SHajimu UMEMOTO case nss_lt_id: 75406a99fe3SHajimu UMEMOTO num = va_arg(ap, int); 75506a99fe3SHajimu UMEMOTO break; 75606a99fe3SHajimu UMEMOTO case nss_lt_all: 75706a99fe3SHajimu UMEMOTO break; 75806a99fe3SHajimu UMEMOTO default: 75906a99fe3SHajimu UMEMOTO /* should be unreachable */ 76006a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 76106a99fe3SHajimu UMEMOTO } 76206a99fe3SHajimu UMEMOTO 76306a99fe3SHajimu UMEMOTO rpc = va_arg(ap, struct rpcent *); 76406a99fe3SHajimu UMEMOTO orig_buf = va_arg(ap, char *); 76506a99fe3SHajimu UMEMOTO orig_buf_size = va_arg(ap, size_t); 76606a99fe3SHajimu UMEMOTO ret_errno = va_arg(ap, int *); 76706a99fe3SHajimu UMEMOTO 76806a99fe3SHajimu UMEMOTO if (orig_buf_size < 76906a99fe3SHajimu UMEMOTO buffer_size - sizeof(struct rpcent) - sizeof(char *)) { 77006a99fe3SHajimu UMEMOTO *ret_errno = ERANGE; 77106a99fe3SHajimu UMEMOTO return (NS_RETURN); 77206a99fe3SHajimu UMEMOTO } 77306a99fe3SHajimu UMEMOTO 77406a99fe3SHajimu UMEMOTO memcpy(rpc, buffer, sizeof(struct rpcent)); 77506a99fe3SHajimu UMEMOTO memcpy(&p, buffer + sizeof(struct rpcent), sizeof(char *)); 77606a99fe3SHajimu UMEMOTO 77706a99fe3SHajimu UMEMOTO orig_buf = (char *)_ALIGN(orig_buf); 77806a99fe3SHajimu UMEMOTO memcpy(orig_buf, buffer + sizeof(struct rpcent) + sizeof(char *) + 77906a99fe3SHajimu UMEMOTO _ALIGN(p) - (size_t)p, 78006a99fe3SHajimu UMEMOTO buffer_size - sizeof(struct rpcent) - sizeof(char *) - 78106a99fe3SHajimu UMEMOTO _ALIGN(p) + (size_t)p); 78206a99fe3SHajimu UMEMOTO p = (char *)_ALIGN(p); 78306a99fe3SHajimu UMEMOTO 78406a99fe3SHajimu UMEMOTO NS_APPLY_OFFSET(rpc->r_name, orig_buf, p, char *); 78506a99fe3SHajimu UMEMOTO if (rpc->r_aliases != NULL) { 78606a99fe3SHajimu UMEMOTO NS_APPLY_OFFSET(rpc->r_aliases, orig_buf, p, char **); 78706a99fe3SHajimu UMEMOTO 78806a99fe3SHajimu UMEMOTO for (alias = rpc->r_aliases ; *alias; ++alias) 78906a99fe3SHajimu UMEMOTO NS_APPLY_OFFSET(*alias, orig_buf, p, char *); 79006a99fe3SHajimu UMEMOTO } 79106a99fe3SHajimu UMEMOTO 79206a99fe3SHajimu UMEMOTO if (retval != NULL) 79306a99fe3SHajimu UMEMOTO *((struct rpcent **)retval) = rpc; 79406a99fe3SHajimu UMEMOTO 79506a99fe3SHajimu UMEMOTO return (NS_SUCCESS); 79606a99fe3SHajimu UMEMOTO } 79706a99fe3SHajimu UMEMOTO 79806a99fe3SHajimu UMEMOTO NSS_MP_CACHE_HANDLING(rpc); 79906a99fe3SHajimu UMEMOTO #endif /* NS_CACHING */ 80006a99fe3SHajimu UMEMOTO 80106a99fe3SHajimu UMEMOTO 80206a99fe3SHajimu UMEMOTO /* get**_r functions implementation */ 80306a99fe3SHajimu UMEMOTO static int 80406a99fe3SHajimu UMEMOTO getrpcbyname_r(const char *name, struct rpcent *rpc, char *buffer, 80506a99fe3SHajimu UMEMOTO size_t bufsize, struct rpcent **result) 80606a99fe3SHajimu UMEMOTO { 80706a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 80806a99fe3SHajimu UMEMOTO static const nss_cache_info cache_info = 80906a99fe3SHajimu UMEMOTO NS_COMMON_CACHE_INFO_INITIALIZER( 81006a99fe3SHajimu UMEMOTO rpc, (void *)nss_lt_name, 81106a99fe3SHajimu UMEMOTO rpc_id_func, rpc_marshal_func, rpc_unmarshal_func); 81206a99fe3SHajimu UMEMOTO #endif 81306a99fe3SHajimu UMEMOTO static const ns_dtab dtab[] = { 81406a99fe3SHajimu UMEMOTO { NSSRC_FILES, files_rpcent, (void *)nss_lt_name }, 81506a99fe3SHajimu UMEMOTO #ifdef YP 81606a99fe3SHajimu UMEMOTO { NSSRC_NIS, nis_rpcent, (void *)nss_lt_name }, 81706a99fe3SHajimu UMEMOTO #endif 81806a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 81906a99fe3SHajimu UMEMOTO NS_CACHE_CB(&cache_info) 82006a99fe3SHajimu UMEMOTO #endif 82106a99fe3SHajimu UMEMOTO { NULL, NULL, NULL } 82206a99fe3SHajimu UMEMOTO }; 82306a99fe3SHajimu UMEMOTO int rv, ret_errno; 82406a99fe3SHajimu UMEMOTO 82506a99fe3SHajimu UMEMOTO ret_errno = 0; 82606a99fe3SHajimu UMEMOTO *result = NULL; 82706a99fe3SHajimu UMEMOTO rv = nsdispatch(result, dtab, NSDB_RPC, "getrpcbyname_r", defaultsrc, 82806a99fe3SHajimu UMEMOTO name, rpc, buffer, bufsize, &ret_errno); 82906a99fe3SHajimu UMEMOTO 83006a99fe3SHajimu UMEMOTO if (rv == NS_SUCCESS) 83106a99fe3SHajimu UMEMOTO return (0); 83206a99fe3SHajimu UMEMOTO else 83306a99fe3SHajimu UMEMOTO return (ret_errno); 83406a99fe3SHajimu UMEMOTO } 83506a99fe3SHajimu UMEMOTO 83606a99fe3SHajimu UMEMOTO static int 83706a99fe3SHajimu UMEMOTO getrpcbynumber_r(int number, struct rpcent *rpc, char *buffer, 83806a99fe3SHajimu UMEMOTO size_t bufsize, struct rpcent **result) 83906a99fe3SHajimu UMEMOTO { 84006a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 84106a99fe3SHajimu UMEMOTO static const nss_cache_info cache_info = 84206a99fe3SHajimu UMEMOTO NS_COMMON_CACHE_INFO_INITIALIZER( 84306a99fe3SHajimu UMEMOTO rpc, (void *)nss_lt_id, 84406a99fe3SHajimu UMEMOTO rpc_id_func, rpc_marshal_func, rpc_unmarshal_func); 84506a99fe3SHajimu UMEMOTO #endif 84606a99fe3SHajimu UMEMOTO static const ns_dtab dtab[] = { 84706a99fe3SHajimu UMEMOTO { NSSRC_FILES, files_rpcent, (void *)nss_lt_id }, 84806a99fe3SHajimu UMEMOTO #ifdef YP 84906a99fe3SHajimu UMEMOTO { NSSRC_NIS, nis_rpcent, (void *)nss_lt_id }, 85006a99fe3SHajimu UMEMOTO #endif 85106a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 85206a99fe3SHajimu UMEMOTO NS_CACHE_CB(&cache_info) 85306a99fe3SHajimu UMEMOTO #endif 85406a99fe3SHajimu UMEMOTO { NULL, NULL, NULL } 85506a99fe3SHajimu UMEMOTO }; 85606a99fe3SHajimu UMEMOTO int rv, ret_errno; 85706a99fe3SHajimu UMEMOTO 85806a99fe3SHajimu UMEMOTO ret_errno = 0; 85906a99fe3SHajimu UMEMOTO *result = NULL; 86006a99fe3SHajimu UMEMOTO rv = nsdispatch(result, dtab, NSDB_RPC, "getrpcbynumber_r", defaultsrc, 86106a99fe3SHajimu UMEMOTO number, rpc, buffer, bufsize, &ret_errno); 86206a99fe3SHajimu UMEMOTO 86306a99fe3SHajimu UMEMOTO if (rv == NS_SUCCESS) 86406a99fe3SHajimu UMEMOTO return (0); 86506a99fe3SHajimu UMEMOTO else 86606a99fe3SHajimu UMEMOTO return (ret_errno); 86706a99fe3SHajimu UMEMOTO } 86806a99fe3SHajimu UMEMOTO 86906a99fe3SHajimu UMEMOTO static int 87006a99fe3SHajimu UMEMOTO getrpcent_r(struct rpcent *rpc, char *buffer, size_t bufsize, 87106a99fe3SHajimu UMEMOTO struct rpcent **result) 87206a99fe3SHajimu UMEMOTO { 87306a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 87406a99fe3SHajimu UMEMOTO static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER( 87506a99fe3SHajimu UMEMOTO rpc, (void *)nss_lt_all, 87606a99fe3SHajimu UMEMOTO rpc_marshal_func, rpc_unmarshal_func); 87706a99fe3SHajimu UMEMOTO #endif 87806a99fe3SHajimu UMEMOTO static const ns_dtab dtab[] = { 87906a99fe3SHajimu UMEMOTO { NSSRC_FILES, files_rpcent, (void *)nss_lt_all }, 88006a99fe3SHajimu UMEMOTO #ifdef YP 88106a99fe3SHajimu UMEMOTO { NSSRC_NIS, nis_rpcent, (void *)nss_lt_all }, 88206a99fe3SHajimu UMEMOTO #endif 88306a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 88406a99fe3SHajimu UMEMOTO NS_CACHE_CB(&cache_info) 88506a99fe3SHajimu UMEMOTO #endif 88606a99fe3SHajimu UMEMOTO { NULL, NULL, NULL } 88706a99fe3SHajimu UMEMOTO }; 88806a99fe3SHajimu UMEMOTO int rv, ret_errno; 88906a99fe3SHajimu UMEMOTO 89006a99fe3SHajimu UMEMOTO ret_errno = 0; 89106a99fe3SHajimu UMEMOTO *result = NULL; 89206a99fe3SHajimu UMEMOTO rv = nsdispatch(result, dtab, NSDB_RPC, "getrpcent_r", defaultsrc, 89306a99fe3SHajimu UMEMOTO rpc, buffer, bufsize, &ret_errno); 89406a99fe3SHajimu UMEMOTO 89506a99fe3SHajimu UMEMOTO if (rv == NS_SUCCESS) 89606a99fe3SHajimu UMEMOTO return (0); 89706a99fe3SHajimu UMEMOTO else 89806a99fe3SHajimu UMEMOTO return (ret_errno); 89906a99fe3SHajimu UMEMOTO } 90006a99fe3SHajimu UMEMOTO 90106a99fe3SHajimu UMEMOTO /* get** wrappers for get**_r functions implementation */ 90206a99fe3SHajimu UMEMOTO static void 90306a99fe3SHajimu UMEMOTO rpcent_endstate(void *p) 90406a99fe3SHajimu UMEMOTO { 90506a99fe3SHajimu UMEMOTO if (p == NULL) 90606a99fe3SHajimu UMEMOTO return; 90706a99fe3SHajimu UMEMOTO 90806a99fe3SHajimu UMEMOTO free(((struct rpcent_state *)p)->buffer); 90906a99fe3SHajimu UMEMOTO free(p); 91006a99fe3SHajimu UMEMOTO } 91106a99fe3SHajimu UMEMOTO 91206a99fe3SHajimu UMEMOTO static int 91306a99fe3SHajimu UMEMOTO wrap_getrpcbyname_r(union key key, struct rpcent *rpc, char *buffer, 91406a99fe3SHajimu UMEMOTO size_t bufsize, struct rpcent **res) 91506a99fe3SHajimu UMEMOTO { 91606a99fe3SHajimu UMEMOTO return (getrpcbyname_r(key.name, rpc, buffer, bufsize, res)); 91706a99fe3SHajimu UMEMOTO } 91806a99fe3SHajimu UMEMOTO 91906a99fe3SHajimu UMEMOTO static int 92006a99fe3SHajimu UMEMOTO wrap_getrpcbynumber_r(union key key, struct rpcent *rpc, char *buffer, 92106a99fe3SHajimu UMEMOTO size_t bufsize, struct rpcent **res) 92206a99fe3SHajimu UMEMOTO { 92306a99fe3SHajimu UMEMOTO return (getrpcbynumber_r(key.number, rpc, buffer, bufsize, res)); 92406a99fe3SHajimu UMEMOTO } 92506a99fe3SHajimu UMEMOTO 92606a99fe3SHajimu UMEMOTO static int 92706a99fe3SHajimu UMEMOTO wrap_getrpcent_r(union key key __unused, struct rpcent *rpc, char *buffer, 92806a99fe3SHajimu UMEMOTO size_t bufsize, struct rpcent **res) 92906a99fe3SHajimu UMEMOTO { 93006a99fe3SHajimu UMEMOTO return (getrpcent_r(rpc, buffer, bufsize, res)); 93106a99fe3SHajimu UMEMOTO } 93206a99fe3SHajimu UMEMOTO 93306a99fe3SHajimu UMEMOTO static struct rpcent * 93406a99fe3SHajimu UMEMOTO getrpc(int (*fn)(union key, struct rpcent *, char *, size_t, struct rpcent **), 93506a99fe3SHajimu UMEMOTO union key key) 93606a99fe3SHajimu UMEMOTO { 93706a99fe3SHajimu UMEMOTO int rv; 93806a99fe3SHajimu UMEMOTO struct rpcent *res; 93906a99fe3SHajimu UMEMOTO struct rpcent_state * st; 94006a99fe3SHajimu UMEMOTO 94106a99fe3SHajimu UMEMOTO rv=rpcent_getstate(&st); 94206a99fe3SHajimu UMEMOTO if (rv != 0) { 94306a99fe3SHajimu UMEMOTO errno = rv; 94406a99fe3SHajimu UMEMOTO return NULL; 94506a99fe3SHajimu UMEMOTO } 94606a99fe3SHajimu UMEMOTO 94706a99fe3SHajimu UMEMOTO if (st->buffer == NULL) { 94806a99fe3SHajimu UMEMOTO st->buffer = malloc(RPCENT_STORAGE_INITIAL); 94906a99fe3SHajimu UMEMOTO if (st->buffer == NULL) 95006a99fe3SHajimu UMEMOTO return (NULL); 95106a99fe3SHajimu UMEMOTO st->bufsize = RPCENT_STORAGE_INITIAL; 95206a99fe3SHajimu UMEMOTO } 95306a99fe3SHajimu UMEMOTO do { 95406a99fe3SHajimu UMEMOTO rv = fn(key, &st->rpc, st->buffer, st->bufsize, &res); 95506a99fe3SHajimu UMEMOTO if (res == NULL && rv == ERANGE) { 95606a99fe3SHajimu UMEMOTO free(st->buffer); 95706a99fe3SHajimu UMEMOTO if ((st->bufsize << 1) > RPCENT_STORAGE_MAX) { 95806a99fe3SHajimu UMEMOTO st->buffer = NULL; 95906a99fe3SHajimu UMEMOTO errno = ERANGE; 96006a99fe3SHajimu UMEMOTO return (NULL); 96106a99fe3SHajimu UMEMOTO } 96206a99fe3SHajimu UMEMOTO st->bufsize <<= 1; 96306a99fe3SHajimu UMEMOTO st->buffer = malloc(st->bufsize); 96406a99fe3SHajimu UMEMOTO if (st->buffer == NULL) 96506a99fe3SHajimu UMEMOTO return (NULL); 96606a99fe3SHajimu UMEMOTO } 96706a99fe3SHajimu UMEMOTO } while (res == NULL && rv == ERANGE); 96806a99fe3SHajimu UMEMOTO if (rv != 0) 96906a99fe3SHajimu UMEMOTO errno = rv; 97006a99fe3SHajimu UMEMOTO 97106a99fe3SHajimu UMEMOTO return (res); 97206a99fe3SHajimu UMEMOTO } 97306a99fe3SHajimu UMEMOTO 97406a99fe3SHajimu UMEMOTO struct rpcent * 975283970e8SPedro F. Giffuni getrpcbyname(const char *name) 97606a99fe3SHajimu UMEMOTO { 97706a99fe3SHajimu UMEMOTO union key key; 97806a99fe3SHajimu UMEMOTO 97906a99fe3SHajimu UMEMOTO key.name = name; 98006a99fe3SHajimu UMEMOTO 98106a99fe3SHajimu UMEMOTO return (getrpc(wrap_getrpcbyname_r, key)); 98206a99fe3SHajimu UMEMOTO } 98306a99fe3SHajimu UMEMOTO 98406a99fe3SHajimu UMEMOTO struct rpcent * 98506a99fe3SHajimu UMEMOTO getrpcbynumber(int number) 98606a99fe3SHajimu UMEMOTO { 98706a99fe3SHajimu UMEMOTO union key key; 98806a99fe3SHajimu UMEMOTO 98906a99fe3SHajimu UMEMOTO key.number = number; 99006a99fe3SHajimu UMEMOTO 99106a99fe3SHajimu UMEMOTO return (getrpc(wrap_getrpcbynumber_r, key)); 99206a99fe3SHajimu UMEMOTO } 99306a99fe3SHajimu UMEMOTO 99406a99fe3SHajimu UMEMOTO struct rpcent * 995587cf682SCraig Rodrigues getrpcent(void) 99606a99fe3SHajimu UMEMOTO { 99706a99fe3SHajimu UMEMOTO union key key; 99806a99fe3SHajimu UMEMOTO 99906a99fe3SHajimu UMEMOTO key.number = 0; /* not used */ 100006a99fe3SHajimu UMEMOTO 100106a99fe3SHajimu UMEMOTO return (getrpc(wrap_getrpcent_r, key)); 100206a99fe3SHajimu UMEMOTO } 100306a99fe3SHajimu UMEMOTO 100406a99fe3SHajimu UMEMOTO void 100506a99fe3SHajimu UMEMOTO setrpcent(int stayopen) 100606a99fe3SHajimu UMEMOTO { 100706a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 100806a99fe3SHajimu UMEMOTO static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER( 100906a99fe3SHajimu UMEMOTO rpc, (void *)nss_lt_all, 101006a99fe3SHajimu UMEMOTO NULL, NULL); 101106a99fe3SHajimu UMEMOTO #endif 101206a99fe3SHajimu UMEMOTO 101306a99fe3SHajimu UMEMOTO static const ns_dtab dtab[] = { 101406a99fe3SHajimu UMEMOTO { NSSRC_FILES, files_setrpcent, (void *)SETRPCENT }, 101506a99fe3SHajimu UMEMOTO #ifdef YP 101606a99fe3SHajimu UMEMOTO { NSSRC_NIS, nis_setrpcent, (void *)SETRPCENT }, 101706a99fe3SHajimu UMEMOTO #endif 101806a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 101906a99fe3SHajimu UMEMOTO NS_CACHE_CB(&cache_info) 102006a99fe3SHajimu UMEMOTO #endif 102106a99fe3SHajimu UMEMOTO { NULL, NULL, NULL } 102206a99fe3SHajimu UMEMOTO }; 102306a99fe3SHajimu UMEMOTO 102406a99fe3SHajimu UMEMOTO (void)nsdispatch(NULL, dtab, NSDB_RPC, "setrpcent", defaultsrc, 102506a99fe3SHajimu UMEMOTO stayopen); 102606a99fe3SHajimu UMEMOTO } 102706a99fe3SHajimu UMEMOTO 102806a99fe3SHajimu UMEMOTO void 1029587cf682SCraig Rodrigues endrpcent(void) 103006a99fe3SHajimu UMEMOTO { 103106a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 103206a99fe3SHajimu UMEMOTO static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER( 103306a99fe3SHajimu UMEMOTO rpc, (void *)nss_lt_all, 103406a99fe3SHajimu UMEMOTO NULL, NULL); 103506a99fe3SHajimu UMEMOTO #endif 103606a99fe3SHajimu UMEMOTO 103706a99fe3SHajimu UMEMOTO static const ns_dtab dtab[] = { 103806a99fe3SHajimu UMEMOTO { NSSRC_FILES, files_setrpcent, (void *)ENDRPCENT }, 103906a99fe3SHajimu UMEMOTO #ifdef YP 104006a99fe3SHajimu UMEMOTO { NSSRC_NIS, nis_setrpcent, (void *)ENDRPCENT }, 104106a99fe3SHajimu UMEMOTO #endif 104206a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 104306a99fe3SHajimu UMEMOTO NS_CACHE_CB(&cache_info) 104406a99fe3SHajimu UMEMOTO #endif 104506a99fe3SHajimu UMEMOTO { NULL, NULL, NULL } 104606a99fe3SHajimu UMEMOTO }; 104706a99fe3SHajimu UMEMOTO 10484ea86771SJonathan Chen (void)nsdispatch(NULL, dtab, NSDB_RPC, "endrpcent", defaultsrc); 104906a99fe3SHajimu UMEMOTO } 1050