usr/src/lib/libc/port/gen/getnetgrent.c
author Jon Tibble <meths@btinternet.com>
Thu, 09 Dec 2010 22:32:39 +0100
changeset 13255 4afa820d78b9
parent 6812 febeba71273d
permissions -rw-r--r--
298 SPARC build fails in smt_pause.o 478 Build needs fixing for pkgdepend flag day Reviewed by: [email protected] Reviewed by: [email protected] Reviewed by: [email protected] Approved by: [email protected]
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
4843
5b42fe9ae29d 6590401 fixes for 6418491, 6518780 and 6570016 conspire to break java
raf
parents: 2830
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 5002
diff changeset
    23
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
 * getnetgrent.c
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
 *	- name-service switch frontend routines for the netgroup API.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
 * Policy decision:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
 *	If netgroup A refers to netgroup B, both must occur in the same
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
 *	source (any other choice gives very confusing semantics).  This
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
 *	assumption is deeply embedded in the code below and in the backends.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
 * innetgr() is implemented on top of something called __multi_innetgr(),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
 * which replaces each (char *) argument of innetgr() with a counted vector
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
 * of (char *).  The semantics are the same as an OR of the results of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
 * innetgr() operations on each possible 4-tuple picked from the arguments,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
 * but it's possible to implement some cases more efficiently.  This is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
 * important for mountd, which used to read YP netgroup.byhost directly in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
 * order to determine efficiently whether a given host belonged to any one
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
 * of a long list of netgroups.  Wildcarded arguments are indicated by a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
 * count of zero.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 5002
diff changeset
    50
#include "lint.h"
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#include <synch.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#include <nss_dbdefs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#include <mtlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
#include <libc.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
static DEFINE_NSS_DB_ROOT(db_root);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
_nss_initf_netgroup(p)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
	nss_db_params_t	*p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
	p->name	= NSS_DBNAM_NETGROUP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
	p->default_config = NSS_DEFCONF_NETGROUP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
 * The netgroup routines aren't quite like the majority of the switch clients.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
 *   innetgr() more-or-less fits the getXXXbyYYY mould, but for the others:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
 *	- setnetgrent("netgroup") is really a getXXXbyYYY routine, i.e. it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
 *	  searches the sources until it finds an entry with the given name.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
 *	  Rather than returning the (potentially large) entry, it simply
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
 *	  initializes a cursor, and then...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
 *      - getnetgrent(...) is repeatedly invoked by the user to extract the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
 *	  contents of the entry found by setnetgrent().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
 *	- endnetgrent() is almost like a real endXXXent routine.
2830
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    77
 * The behaviour in NSS was:
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    78
 *  If we were certain that all the backends could provide netgroup information
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    79
 *  in a common form, we could make the setnetgrent() backend return the entire
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    80
 *  entry to the frontend, then implement getnetgrent() and endnetgrent()
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    81
 *  strictly in the frontend (aka here).  But we're not certain, so we won't.
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    82
 * In NSS2:
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    83
 *  Since nscd returns the results, and it is nscd that accumulates
5228d1267a01 PSARC 2005/133 Sparks: Name Service Switch 2
djl
parents: 0
diff changeset
    84
 *  the results, then we can return the entire result on the setnetgrent.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
 * NOTE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
 *	In the SunOS 4.x (YP) version of this code, innetgr() did not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
 *	affect the state of {set,get,end}netgrent().  Somewhere out
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
 *	there probably lurks a program that depends on this behaviour,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
 *	so this version (both frontend and backends) had better
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
 *	behave the same way.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
/* ===> ?? fix "__" name */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
__multi_innetgr(ngroup,	pgroup,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
		nhost,	phost,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
		nuser,	puser,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
		ndomain, pdomain)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	nss_innetgr_argc	ngroup, nhost, nuser, ndomain;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	nss_innetgr_argv	pgroup, phost, puser, pdomain;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
	struct nss_innetgr_args	ia;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	if (ngroup == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
		return (0);	/* One thing fewer to worry backends */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	ia.groups.argc			= ngroup;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	ia.groups.argv			= pgroup;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
	ia.arg[NSS_NETGR_MACHINE].argc	= nhost;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	ia.arg[NSS_NETGR_MACHINE].argv	= phost;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	ia.arg[NSS_NETGR_USER].argc	= nuser;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	ia.arg[NSS_NETGR_USER].argv	= puser;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	ia.arg[NSS_NETGR_DOMAIN].argc	= ndomain;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
	ia.arg[NSS_NETGR_DOMAIN].argv	= pdomain;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	ia.status			= NSS_NETGR_NO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
	(void) nss_search(&db_root, _nss_initf_netgroup,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	    NSS_DBOP_NETGROUP_IN, &ia);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	return (ia.status == NSS_NETGR_FOUND);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
innetgr(group, host, user, domain)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	const char *group, *host, *user, *domain;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
#define	IA(charp)	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
	(nss_innetgr_argc)((charp) != 0), (nss_innetgr_argv)(&(charp))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
	return (__multi_innetgr(IA(group), IA(host), IA(user), IA(domain)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
 * Context for setnetgrent()/getnetgrent().  If the user is being sensible
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
 * the requests will be serialized anyway, but let's play safe and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
 * serialize them ourselves (anything to prevent a coredump)...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
 * We can't use lmutex_lock() here because we don't know what the backends
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
 * that we call may call in turn.  They might call malloc()/free().
5002
0bbdb60e9732 6599934 deadlock by atfork lock and user's mutex
raf
parents: 4914
diff changeset
   140
 * So we use the brute-force callout_lock_enter() instead.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
static nss_backend_t	*getnetgrent_backend;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
setnetgrent(const char *netgroup)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	nss_backend_t	*be;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
	if (netgroup == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
		/* Prevent coredump, otherwise don't do anything profound */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
		netgroup = "";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
5002
0bbdb60e9732 6599934 deadlock by atfork lock and user's mutex
raf
parents: 4914
diff changeset
   154
	callout_lock_enter();
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	be = getnetgrent_backend;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
	if (be != NULL && NSS_INVOKE_DBOP(be, NSS_DBOP_SETENT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	    (void *)netgroup) != NSS_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
		(void) NSS_INVOKE_DBOP(be, NSS_DBOP_DESTRUCTOR, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
		be = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	if (be == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
		struct nss_setnetgrent_args	args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
		args.netgroup	= netgroup;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
		args.iterator	= 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
		(void) nss_search(&db_root, _nss_initf_netgroup,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
		    NSS_DBOP_NETGROUP_SET, &args);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
		be = args.iterator;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	getnetgrent_backend = be;
5002
0bbdb60e9732 6599934 deadlock by atfork lock and user's mutex
raf
parents: 4914
diff changeset
   171
	callout_lock_exit();
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
getnetgrent_r(machinep, namep, domainp, buffer, buflen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	char		**machinep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	char		**namep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	char		**domainp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	char		*buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	int		buflen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	struct nss_getnetgrent_args	args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	args.buffer	= buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
	args.buflen	= buflen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	args.status	= NSS_NETGR_NO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
5002
0bbdb60e9732 6599934 deadlock by atfork lock and user's mutex
raf
parents: 4914
diff changeset
   189
	callout_lock_enter();
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
	if (getnetgrent_backend != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
		(void) NSS_INVOKE_DBOP(getnetgrent_backend,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
			NSS_DBOP_GETENT, &args);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
	}
5002
0bbdb60e9732 6599934 deadlock by atfork lock and user's mutex
raf
parents: 4914
diff changeset
   194
	callout_lock_exit();
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	if (args.status == NSS_NETGR_FOUND) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
		*machinep = args.retp[NSS_NETGR_MACHINE];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
		*namep	  = args.retp[NSS_NETGR_USER];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
		*domainp  = args.retp[NSS_NETGR_DOMAIN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
static nss_XbyY_buf_t *buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
getnetgrent(machinep, namep, domainp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	char		**machinep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
	char		**namep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	char		**domainp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	(void) NSS_XbyY_ALLOC(&buf, 0, NSS_BUFLEN_NETGROUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	return (getnetgrent_r(machinep, namep, domainp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
	    buf->buffer, buf->buflen));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
endnetgrent()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
{
5002
0bbdb60e9732 6599934 deadlock by atfork lock and user's mutex
raf
parents: 4914
diff changeset
   222
	callout_lock_enter();
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
	if (getnetgrent_backend != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
		(void) NSS_INVOKE_DBOP(getnetgrent_backend,
4843
5b42fe9ae29d 6590401 fixes for 6418491, 6518780 and 6570016 conspire to break java
raf
parents: 2830
diff changeset
   225
		    NSS_DBOP_DESTRUCTOR, 0);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
		getnetgrent_backend = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
	}
5002
0bbdb60e9732 6599934 deadlock by atfork lock and user's mutex
raf
parents: 4914
diff changeset
   228
	callout_lock_exit();
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
	nss_delete(&db_root);	/* === ? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
	NSS_XbyY_FREE(&buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
}