1/* $NetBSD: src/lib/libc/rpc/mt_misc.c,v 1.7 2008-04-28 20:23:00 martin Exp $ */ 2 3/*- 4 * Copyright (c) 2004 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Frank van der Linden. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32/* 33 * Define and initialize MT data for libnsl. 34 * The _libnsl_lock_init() function below is the library's .init handler. 35 */ 36 37/* #pragma ident "@(#)mt_misc.c 1.24 93/04/29 SMI" */ 38 39#include <sys/cdefs.h> 40#if defined(LIBC_SCCS) && !defined(lint) 41__RCSID("$NetBSD: src/lib/libc/rpc/mt_misc.c,v 1.7 2008-04-28 20:23:00 martin Exp $"); 42#endif 43 44#include "namespace.h" 45#include "reentrant.h" 46#include <rpc/rpc.h> 47#include <sys/time.h> 48#include <stdlib.h> 49#include <string.h> 50 51#ifdef _REENTRANT 52 53/* protects the services list (svc.c) */ 54rwlock_t svc_lock = RWLOCK_INITIALIZER; 55/* protects svc_fdset and the xports[] array */ 56rwlock_t svc_fd_lock = RWLOCK_INITIALIZER; 57/* protects the RPCBIND address cache */ 58rwlock_t rpcbaddr_cache_lock = RWLOCK_INITIALIZER; 59 60/* protects authdes cache (svcauth_des.c) */ 61mutex_t authdes_lock = MUTEX_INITIALIZER; 62/* auth_none.c serialization */ 63mutex_t authnone_lock = MUTEX_INITIALIZER; 64/* protects the Auths list (svc_auth.c) */ 65mutex_t authsvc_lock = MUTEX_INITIALIZER; 66/* protects client-side fd lock array */ 67mutex_t clnt_fd_lock = MUTEX_INITIALIZER; 68/* clnt_raw.c serialization */ 69mutex_t clntraw_lock = MUTEX_INITIALIZER; 70/* domainname and domain_fd (getdname.c) and default_domain (rpcdname.c) */ 71mutex_t dname_lock = MUTEX_INITIALIZER; 72/* dupreq variables (svc_dg.c) */ 73mutex_t dupreq_lock = MUTEX_INITIALIZER; 74/* protects first_time and hostname (key_call.c) */ 75mutex_t keyserv_lock = MUTEX_INITIALIZER; 76/* serializes rpc_trace() (rpc_trace.c) */ 77mutex_t libnsl_trace_lock = MUTEX_INITIALIZER; 78/* loopnconf (rpcb_clnt.c) */ 79mutex_t loopnconf_lock = MUTEX_INITIALIZER; 80/* serializes ops initializations */ 81mutex_t ops_lock = MUTEX_INITIALIZER; 82/* protects ``port'' static in bindresvport() */ 83mutex_t portnum_lock = MUTEX_INITIALIZER; 84/* protects proglst list (svc_simple.c) */ 85mutex_t proglst_lock = MUTEX_INITIALIZER; 86/* serializes clnt_com_create() (rpc_soc.c) */ 87mutex_t rpcsoc_lock = MUTEX_INITIALIZER; 88/* svc_raw.c serialization */ 89mutex_t svcraw_lock = MUTEX_INITIALIZER; 90/* xprtlist (svc_generic.c) */ 91mutex_t xprtlist_lock = MUTEX_INITIALIZER; 92/* serializes calls to public key routines */ 93mutex_t serialize_pkey = MUTEX_INITIALIZER; 94 95#endif /* _REENTRANT */ 96 97 98#undef rpc_createerr 99 100struct rpc_createerr rpc_createerr; 101 102#ifdef _REENTRANT 103static thread_key_t rce_key; 104static once_t rce_once = ONCE_INITIALIZER; 105 106static void 107__rpc_createerr_setup(void) 108{ 109 110 thr_keycreate(&rce_key, free); 111} 112#endif /* _REENTRANT */ 113 114struct rpc_createerr* 115__rpc_createerr() 116{ 117#ifdef _REENTRANT 118 struct rpc_createerr *rce_addr = 0; 119 120 if (__isthreaded == 0) 121 return (&rpc_createerr); 122 thr_once(&rce_once, __rpc_createerr_setup); 123 rce_addr = thr_getspecific(rce_key); 124 if (rce_addr == NULL) { 125 rce_addr = malloc(sizeof(*rce_addr)); 126 if (rce_addr == NULL) 127 return &rpc_createerr; 128 thr_setspecific(rce_key, (void *) rce_addr); 129 memset(rce_addr, 0, sizeof (struct rpc_createerr)); 130 } 131 132 return (rce_addr); 133#else 134 return &rpc_createerr; 135#endif 136} 137 138