xref: /freebsd/contrib/netbsd-tests/usr.bin/id/pwgr.c (revision 9268022b74279434ed6300244e3f977e56a8ceb5)
1*57718be8SEnji Cooper /* $NetBSD: pwgr.c,v 1.1 2012/03/17 16:33:14 jruoho Exp $ */
2*57718be8SEnji Cooper /*
3*57718be8SEnji Cooper  * Copyright (c) 2007 The NetBSD Foundation, Inc.
4*57718be8SEnji Cooper  * All rights reserved.
5*57718be8SEnji Cooper  *
6*57718be8SEnji Cooper  * Redistribution and use in source and binary forms, with or without
7*57718be8SEnji Cooper  * modification, are permitted provided that the following conditions
8*57718be8SEnji Cooper  * are met:
9*57718be8SEnji Cooper  * 1. Redistributions of source code must retain the above copyright
10*57718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer.
11*57718be8SEnji Cooper  * 2. Redistributions in binary form must reproduce the above copyright
12*57718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer in the
13*57718be8SEnji Cooper  *    documentation and/or other materials provided with the distribution.
14*57718be8SEnji Cooper  *
15*57718be8SEnji Cooper  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16*57718be8SEnji Cooper  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17*57718be8SEnji Cooper  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18*57718be8SEnji Cooper  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19*57718be8SEnji Cooper  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20*57718be8SEnji Cooper  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21*57718be8SEnji Cooper  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22*57718be8SEnji Cooper  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23*57718be8SEnji Cooper  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24*57718be8SEnji Cooper  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25*57718be8SEnji Cooper  * POSSIBILITY OF SUCH DAMAGE.
26*57718be8SEnji Cooper  */
27*57718be8SEnji Cooper 
28*57718be8SEnji Cooper /*
29*57718be8SEnji Cooper  * This file implements replacements for all user/group-related functions
30*57718be8SEnji Cooper  * called by id(1).  It provides fake but deterministic user and group
31*57718be8SEnji Cooper  * information.  The details are as such:
32*57718be8SEnji Cooper  * User root, uid 0, primary group 0 (wheel).
33*57718be8SEnji Cooper  * User test, uid 100, primary group 100 (users), secondary group 0 (wheel).
34*57718be8SEnji Cooper  */
35*57718be8SEnji Cooper 
36*57718be8SEnji Cooper #include <sys/types.h>
37*57718be8SEnji Cooper 
38*57718be8SEnji Cooper #include <errno.h>
39*57718be8SEnji Cooper #include <grp.h>
40*57718be8SEnji Cooper #include <pwd.h>
41*57718be8SEnji Cooper #include <stdlib.h>
42*57718be8SEnji Cooper #include <unistd.h>
43*57718be8SEnji Cooper #include <string.h>
44*57718be8SEnji Cooper 
45*57718be8SEnji Cooper char Login[16];
46*57718be8SEnji Cooper struct group GrEntry;
47*57718be8SEnji Cooper struct passwd PwEntry;
48*57718be8SEnji Cooper 
49*57718be8SEnji Cooper gid_t
getgid(void)50*57718be8SEnji Cooper getgid(void)
51*57718be8SEnji Cooper {
52*57718be8SEnji Cooper 	return 100;
53*57718be8SEnji Cooper }
54*57718be8SEnji Cooper 
55*57718be8SEnji Cooper gid_t
getegid(void)56*57718be8SEnji Cooper getegid(void)
57*57718be8SEnji Cooper {
58*57718be8SEnji Cooper 	if (getenv("LIBFAKE_EGID_ROOT") != NULL)
59*57718be8SEnji Cooper 		return 0;
60*57718be8SEnji Cooper 	else
61*57718be8SEnji Cooper 		return 100;
62*57718be8SEnji Cooper }
63*57718be8SEnji Cooper 
64*57718be8SEnji Cooper uid_t
getuid(void)65*57718be8SEnji Cooper getuid(void)
66*57718be8SEnji Cooper {
67*57718be8SEnji Cooper 	return 100;
68*57718be8SEnji Cooper }
69*57718be8SEnji Cooper 
70*57718be8SEnji Cooper uid_t
geteuid(void)71*57718be8SEnji Cooper geteuid(void)
72*57718be8SEnji Cooper {
73*57718be8SEnji Cooper 	if (getenv("LIBFAKE_EUID_ROOT") != NULL)
74*57718be8SEnji Cooper 		return 0;
75*57718be8SEnji Cooper 	else
76*57718be8SEnji Cooper 		return 100;
77*57718be8SEnji Cooper }
78*57718be8SEnji Cooper 
79*57718be8SEnji Cooper char *
getlogin(void)80*57718be8SEnji Cooper getlogin(void)
81*57718be8SEnji Cooper {
82*57718be8SEnji Cooper 	strcpy(Login, "test");
83*57718be8SEnji Cooper 	return Login;
84*57718be8SEnji Cooper }
85*57718be8SEnji Cooper 
86*57718be8SEnji Cooper struct group *
getgrgid(gid_t gid)87*57718be8SEnji Cooper getgrgid(gid_t gid)
88*57718be8SEnji Cooper {
89*57718be8SEnji Cooper 	struct group *g = &GrEntry;
90*57718be8SEnji Cooper 
91*57718be8SEnji Cooper 	memset(g, 0, sizeof(*g));
92*57718be8SEnji Cooper 	if (gid == 0) {
93*57718be8SEnji Cooper 		g->gr_name = __UNCONST("wheel");
94*57718be8SEnji Cooper 		g->gr_gid = 0;
95*57718be8SEnji Cooper 	} else if (gid == 100) {
96*57718be8SEnji Cooper 		g->gr_name = __UNCONST("users");
97*57718be8SEnji Cooper 		g->gr_gid = 100;
98*57718be8SEnji Cooper 	} else
99*57718be8SEnji Cooper 		g = NULL;
100*57718be8SEnji Cooper 
101*57718be8SEnji Cooper 	return g;
102*57718be8SEnji Cooper }
103*57718be8SEnji Cooper 
104*57718be8SEnji Cooper int
getgrouplist(const char * name,gid_t basegid,gid_t * groups,int * ngroups)105*57718be8SEnji Cooper getgrouplist(const char *name, gid_t basegid, gid_t *groups, int *ngroups)
106*57718be8SEnji Cooper {
107*57718be8SEnji Cooper 	int cnt, ret;
108*57718be8SEnji Cooper 
109*57718be8SEnji Cooper 	if (strcmp(name, "root") == 0) {
110*57718be8SEnji Cooper 		if (*ngroups >= 1) {
111*57718be8SEnji Cooper 			groups[0] = basegid;
112*57718be8SEnji Cooper 			cnt = 1;
113*57718be8SEnji Cooper 		}
114*57718be8SEnji Cooper 
115*57718be8SEnji Cooper 		ret = (*ngroups >= cnt) ? 0 : -1;
116*57718be8SEnji Cooper 		*ngroups = cnt;
117*57718be8SEnji Cooper 	} else if (strcmp(name, "test") == 0) {
118*57718be8SEnji Cooper 		if (*ngroups >= 1) {
119*57718be8SEnji Cooper 			groups[0] = basegid;
120*57718be8SEnji Cooper 			cnt = 1;
121*57718be8SEnji Cooper 		}
122*57718be8SEnji Cooper 
123*57718be8SEnji Cooper 		if (*ngroups >= 2) {
124*57718be8SEnji Cooper 			groups[1] = 0;
125*57718be8SEnji Cooper 			cnt = 2;
126*57718be8SEnji Cooper 		}
127*57718be8SEnji Cooper 
128*57718be8SEnji Cooper 		ret = (*ngroups >= cnt) ? 0 : -1;
129*57718be8SEnji Cooper 		*ngroups = cnt;
130*57718be8SEnji Cooper 	} else
131*57718be8SEnji Cooper 		ret = -1;
132*57718be8SEnji Cooper 
133*57718be8SEnji Cooper 	return ret;
134*57718be8SEnji Cooper }
135*57718be8SEnji Cooper 
136*57718be8SEnji Cooper int
getgroups(int gidsetlen,gid_t * gidset)137*57718be8SEnji Cooper getgroups(int gidsetlen, gid_t *gidset)
138*57718be8SEnji Cooper {
139*57718be8SEnji Cooper 	if (gidsetlen < 2) {
140*57718be8SEnji Cooper 		errno = EINVAL;
141*57718be8SEnji Cooper 		return -1;
142*57718be8SEnji Cooper 	}
143*57718be8SEnji Cooper 
144*57718be8SEnji Cooper 	gidset[0] = 100;
145*57718be8SEnji Cooper 	gidset[1] = 0;
146*57718be8SEnji Cooper 	return 2;
147*57718be8SEnji Cooper }
148*57718be8SEnji Cooper 
149*57718be8SEnji Cooper struct passwd *
getpwnam(const char * login)150*57718be8SEnji Cooper getpwnam(const char *login)
151*57718be8SEnji Cooper {
152*57718be8SEnji Cooper 	struct passwd *p = &PwEntry;
153*57718be8SEnji Cooper 
154*57718be8SEnji Cooper 	memset(p, 0, sizeof(*p));
155*57718be8SEnji Cooper 	if (strcmp(login, "root") == 0) {
156*57718be8SEnji Cooper 		p->pw_name = __UNCONST("root");
157*57718be8SEnji Cooper 		p->pw_uid = 0;
158*57718be8SEnji Cooper 		p->pw_gid = 0;
159*57718be8SEnji Cooper 	} else if (strcmp(login, "test") == 0) {
160*57718be8SEnji Cooper 		p->pw_name = __UNCONST("test");
161*57718be8SEnji Cooper 		p->pw_uid = 100;
162*57718be8SEnji Cooper 		p->pw_gid = 100;
163*57718be8SEnji Cooper 	} else
164*57718be8SEnji Cooper 		p = NULL;
165*57718be8SEnji Cooper 
166*57718be8SEnji Cooper 	return p;
167*57718be8SEnji Cooper }
168*57718be8SEnji Cooper 
169*57718be8SEnji Cooper struct passwd *
getpwuid(uid_t uid)170*57718be8SEnji Cooper getpwuid(uid_t uid)
171*57718be8SEnji Cooper {
172*57718be8SEnji Cooper 	struct passwd *p = &PwEntry;
173*57718be8SEnji Cooper 
174*57718be8SEnji Cooper 	memset(p, 0, sizeof(*p));
175*57718be8SEnji Cooper 	if (uid == 0) {
176*57718be8SEnji Cooper 		p->pw_name = __UNCONST("root");
177*57718be8SEnji Cooper 		p->pw_uid = 0;
178*57718be8SEnji Cooper 		p->pw_gid = 0;
179*57718be8SEnji Cooper 	} else if (uid == 100) {
180*57718be8SEnji Cooper 		p->pw_name = __UNCONST("test");
181*57718be8SEnji Cooper 		p->pw_uid = 100;
182*57718be8SEnji Cooper 		p->pw_gid = 100;
183*57718be8SEnji Cooper 	} else
184*57718be8SEnji Cooper 		p = NULL;
185*57718be8SEnji Cooper 
186*57718be8SEnji Cooper 	return p;
187*57718be8SEnji Cooper }
188