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