1*0Sstevel@tonic-gate /*
2*0Sstevel@tonic-gate  * CDDL HEADER START
3*0Sstevel@tonic-gate  *
4*0Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*0Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
6*0Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
7*0Sstevel@tonic-gate  * with the License.
8*0Sstevel@tonic-gate  *
9*0Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*0Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
11*0Sstevel@tonic-gate  * See the License for the specific language governing permissions
12*0Sstevel@tonic-gate  * and limitations under the License.
13*0Sstevel@tonic-gate  *
14*0Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
15*0Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*0Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
17*0Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
18*0Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
19*0Sstevel@tonic-gate  *
20*0Sstevel@tonic-gate  * CDDL HEADER END
21*0Sstevel@tonic-gate  */
22*0Sstevel@tonic-gate /*
23*0Sstevel@tonic-gate  *	Copyright (c) 1988-1995 Sun Microsystems Inc
24*0Sstevel@tonic-gate  *	All Rights Reserved.
25*0Sstevel@tonic-gate  *
26*0Sstevel@tonic-gate  *	files/getgrent.c -- "files" backend for nsswitch "group" database
27*0Sstevel@tonic-gate  */
28*0Sstevel@tonic-gate 
29*0Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
30*0Sstevel@tonic-gate 
31*0Sstevel@tonic-gate #include <grp.h>
32*0Sstevel@tonic-gate #include <unistd.h>		/* for GF_PATH */
33*0Sstevel@tonic-gate #include "files_common.h"
34*0Sstevel@tonic-gate #include <strings.h>
35*0Sstevel@tonic-gate 
36*0Sstevel@tonic-gate static u_int
37*0Sstevel@tonic-gate hash_grname(nss_XbyY_args_t *argp, int keyhash)
38*0Sstevel@tonic-gate {
39*0Sstevel@tonic-gate 	struct group *g = argp->returnval;
40*0Sstevel@tonic-gate 	const char *name = keyhash ? argp->key.name : g->gr_name;
41*0Sstevel@tonic-gate 	u_int hash = 0;
42*0Sstevel@tonic-gate 
43*0Sstevel@tonic-gate 	while (*name != 0)
44*0Sstevel@tonic-gate 		hash = hash * 15 + *name++;
45*0Sstevel@tonic-gate 
46*0Sstevel@tonic-gate 	return (hash);
47*0Sstevel@tonic-gate }
48*0Sstevel@tonic-gate 
49*0Sstevel@tonic-gate static u_int
50*0Sstevel@tonic-gate hash_grgid(nss_XbyY_args_t *argp, int keyhash)
51*0Sstevel@tonic-gate {
52*0Sstevel@tonic-gate 	struct group *g = argp->returnval;
53*0Sstevel@tonic-gate 	return (keyhash ? (u_int)argp->key.gid : (u_int)g->gr_gid);
54*0Sstevel@tonic-gate }
55*0Sstevel@tonic-gate 
56*0Sstevel@tonic-gate static files_hash_func hash_gr[2] = { hash_grname, hash_grgid };
57*0Sstevel@tonic-gate 
58*0Sstevel@tonic-gate static files_hash_t hashinfo = {
59*0Sstevel@tonic-gate 	DEFAULTMUTEX,
60*0Sstevel@tonic-gate 	sizeof (struct group),
61*0Sstevel@tonic-gate 	NSS_BUFLEN_GROUP,
62*0Sstevel@tonic-gate 	2,
63*0Sstevel@tonic-gate 	hash_gr
64*0Sstevel@tonic-gate };
65*0Sstevel@tonic-gate 
66*0Sstevel@tonic-gate static int
67*0Sstevel@tonic-gate check_grname(argp)
68*0Sstevel@tonic-gate 	nss_XbyY_args_t		*argp;
69*0Sstevel@tonic-gate {
70*0Sstevel@tonic-gate 	struct group		*g = (struct group *)argp->returnval;
71*0Sstevel@tonic-gate 
72*0Sstevel@tonic-gate 	/* +/- entries only valid in compat source */
73*0Sstevel@tonic-gate 	if (g->gr_name != 0 && (g->gr_name[0] == '+' || g->gr_name[0] == '-'))
74*0Sstevel@tonic-gate 		return (0);
75*0Sstevel@tonic-gate 	return (strcmp(g->gr_name, argp->key.name) == 0);
76*0Sstevel@tonic-gate }
77*0Sstevel@tonic-gate 
78*0Sstevel@tonic-gate static nss_status_t
79*0Sstevel@tonic-gate getbyname(be, a)
80*0Sstevel@tonic-gate 	files_backend_ptr_t	be;
81*0Sstevel@tonic-gate 	void			*a;
82*0Sstevel@tonic-gate {
83*0Sstevel@tonic-gate 	return (_nss_files_XY_hash(be, a, 0, &hashinfo, 0, check_grname));
84*0Sstevel@tonic-gate }
85*0Sstevel@tonic-gate 
86*0Sstevel@tonic-gate static int
87*0Sstevel@tonic-gate check_grgid(argp)
88*0Sstevel@tonic-gate 	nss_XbyY_args_t		*argp;
89*0Sstevel@tonic-gate {
90*0Sstevel@tonic-gate 	struct group		*g = (struct group *)argp->returnval;
91*0Sstevel@tonic-gate 
92*0Sstevel@tonic-gate 	/* +/- entries only valid in compat source */
93*0Sstevel@tonic-gate 	if (g->gr_name != 0 && (g->gr_name[0] == '+' || g->gr_name[0] == '-'))
94*0Sstevel@tonic-gate 		return (0);
95*0Sstevel@tonic-gate 	return (g->gr_gid == argp->key.gid);
96*0Sstevel@tonic-gate }
97*0Sstevel@tonic-gate 
98*0Sstevel@tonic-gate static nss_status_t
99*0Sstevel@tonic-gate getbygid(be, a)
100*0Sstevel@tonic-gate 	files_backend_ptr_t	be;
101*0Sstevel@tonic-gate 	void			*a;
102*0Sstevel@tonic-gate {
103*0Sstevel@tonic-gate 	return (_nss_files_XY_hash(be, a, 0, &hashinfo, 1, check_grgid));
104*0Sstevel@tonic-gate }
105*0Sstevel@tonic-gate 
106*0Sstevel@tonic-gate static nss_status_t
107*0Sstevel@tonic-gate getbymember(be, a)
108*0Sstevel@tonic-gate 	files_backend_ptr_t	be;
109*0Sstevel@tonic-gate 	void			*a;
110*0Sstevel@tonic-gate {
111*0Sstevel@tonic-gate 	struct nss_groupsbymem	*argp = (struct nss_groupsbymem *) a;
112*0Sstevel@tonic-gate 
113*0Sstevel@tonic-gate 	return (_nss_files_do_all(be, argp, argp->username,
114*0Sstevel@tonic-gate 				(files_do_all_func_t)argp->process_cstr));
115*0Sstevel@tonic-gate }
116*0Sstevel@tonic-gate 
117*0Sstevel@tonic-gate static files_backend_op_t group_ops[] = {
118*0Sstevel@tonic-gate 	_nss_files_destr,
119*0Sstevel@tonic-gate 	_nss_files_endent,
120*0Sstevel@tonic-gate 	_nss_files_setent,
121*0Sstevel@tonic-gate 	_nss_files_getent_rigid,
122*0Sstevel@tonic-gate 	getbyname,
123*0Sstevel@tonic-gate 	getbygid,
124*0Sstevel@tonic-gate 	getbymember
125*0Sstevel@tonic-gate };
126*0Sstevel@tonic-gate 
127*0Sstevel@tonic-gate /*ARGSUSED*/
128*0Sstevel@tonic-gate nss_backend_t *
129*0Sstevel@tonic-gate _nss_files_group_constr(dummy1, dummy2, dummy3)
130*0Sstevel@tonic-gate 	const char	*dummy1, *dummy2, *dummy3;
131*0Sstevel@tonic-gate {
132*0Sstevel@tonic-gate 	return (_nss_files_constr(group_ops,
133*0Sstevel@tonic-gate 				sizeof (group_ops) / sizeof (group_ops[0]),
134*0Sstevel@tonic-gate 				GF_PATH,
135*0Sstevel@tonic-gate 				NSS_LINELEN_GROUP,
136*0Sstevel@tonic-gate 				&hashinfo));
137*0Sstevel@tonic-gate }
138