xref: /illumos-gate/usr/src/test/libsec-tests/cmd/lib_stubs.c (revision 42920ac8f798accb1375a7faa38ddefa674abf63)
1*42920ac8SGordon Ross /*
2*42920ac8SGordon Ross  * This file and its contents are supplied under the terms of the
3*42920ac8SGordon Ross  * Common Development and Distribution License ("CDDL"), version 1.0.
4*42920ac8SGordon Ross  * You may only use this file in accordance with the terms of version
5*42920ac8SGordon Ross  * 1.0 of the CDDL.
6*42920ac8SGordon Ross  *
7*42920ac8SGordon Ross  * A full copy of the text of the CDDL should have accompanied this
8*42920ac8SGordon Ross  * source.  A copy of the CDDL is also available via the Internet at
9*42920ac8SGordon Ross  * http://www.illumos.org/license/CDDL.
10*42920ac8SGordon Ross  */
11*42920ac8SGordon Ross 
12*42920ac8SGordon Ross /*
13*42920ac8SGordon Ross  * Copyright 2024 RackTop Systems, Inc.
14*42920ac8SGordon Ross  */
15*42920ac8SGordon Ross 
16*42920ac8SGordon Ross /*
17*42920ac8SGordon Ross  * Stubs to replace libidmap and libc calls for these test programs.
18*42920ac8SGordon Ross  * See -Wl,-zinterpose in Makefile
19*42920ac8SGordon Ross  */
20*42920ac8SGordon Ross 
21*42920ac8SGordon Ross 
22*42920ac8SGordon Ross #include <stdio.h>
23*42920ac8SGordon Ross #include <stdlib.h>
24*42920ac8SGordon Ross #include <strings.h>
25*42920ac8SGordon Ross #include <pwd.h>
26*42920ac8SGordon Ross #include <grp.h>
27*42920ac8SGordon Ross #include "idmap.h"
28*42920ac8SGordon Ross 
29*42920ac8SGordon Ross struct mapping {
30*42920ac8SGordon Ross 	uid_t pid;
31*42920ac8SGordon Ross 	int is_user;
32*42920ac8SGordon Ross 	char *sid;	/* may be NULL */
33*42920ac8SGordon Ross 	char *name;
34*42920ac8SGordon Ross 	char *domain;	/* may be NULL */
35*42920ac8SGordon Ross };
36*42920ac8SGordon Ross 
37*42920ac8SGordon Ross struct mapping mappings[] = {
38*42920ac8SGordon Ross 	/* User and group with no SID, no domain */
39*42920ac8SGordon Ross 	{
40*42920ac8SGordon Ross 		.pid = 501,
41*42920ac8SGordon Ross 		.is_user = 1,
42*42920ac8SGordon Ross 		.sid = NULL,
43*42920ac8SGordon Ross 		.name = "user501",
44*42920ac8SGordon Ross 		.domain = NULL
45*42920ac8SGordon Ross 	},
46*42920ac8SGordon Ross 	{
47*42920ac8SGordon Ross 		.pid = 502,
48*42920ac8SGordon Ross 		.is_user = 0,
49*42920ac8SGordon Ross 		.sid = NULL,
50*42920ac8SGordon Ross 		.name = "group502",
51*42920ac8SGordon Ross 		.domain = NULL
52*42920ac8SGordon Ross 	},
53*42920ac8SGordon Ross 	/* Users and groups with SID, names, domains of various length. */
54*42920ac8SGordon Ross 	{
55*42920ac8SGordon Ross 		.pid = 0x80000001,
56*42920ac8SGordon Ross 		.is_user = 1,
57*42920ac8SGordon Ross 		.sid = "S-1-5-21-1813420391-1960978090-3893453001-1001",
58*42920ac8SGordon Ross 		.name = "user1001",
59*42920ac8SGordon Ross 		.domain = "test-domain-name"
60*42920ac8SGordon Ross 	},
61*42920ac8SGordon Ross 	{
62*42920ac8SGordon Ross 		.pid = 0x80000002,
63*42920ac8SGordon Ross 		.is_user = 0,
64*42920ac8SGordon Ross 		.sid = "S-1-5-21-1813420391-1960978090-3893453001-1002",
65*42920ac8SGordon Ross 		.name = "group1002",
66*42920ac8SGordon Ross 		.domain = "test-domain-name"
67*42920ac8SGordon Ross 	},
68*42920ac8SGordon Ross 	{
69*42920ac8SGordon Ross 		.pid = 0x80000003,
70*42920ac8SGordon Ross 		.is_user = 0,
71*42920ac8SGordon Ross 		.sid = "S-1-5-21-1813420391-1960978090-3893453001-1003",
72*42920ac8SGordon Ross 		.name = "group1003-name-really-crazy-long-long"
73*42920ac8SGordon Ross 			"-long-long-long-long-long-long-long",
74*42920ac8SGordon Ross 		.domain = "test-domain-name"
75*42920ac8SGordon Ross 	},
76*42920ac8SGordon Ross 	{
77*42920ac8SGordon Ross 		.pid = 0x80000004,
78*42920ac8SGordon Ross 		.is_user = 0,
79*42920ac8SGordon Ross 		.sid = "S-1-5-21-1813420391-1960978090-3893453002-2002",
80*42920ac8SGordon Ross 		.name = "group2002",
81*42920ac8SGordon Ross 		.domain = "test-domain-name-somewhat-longer"
82*42920ac8SGordon Ross 	},
83*42920ac8SGordon Ross 	{
84*42920ac8SGordon Ross 		.pid = 0x80000005,
85*42920ac8SGordon Ross 		.is_user = 0,
86*42920ac8SGordon Ross 		.sid = "S-1-5-21-1813420391-1960978090-3893453003-3003",
87*42920ac8SGordon Ross 		.name = "group3003",
88*42920ac8SGordon Ross 		.domain = "test-domain-name-really-crazy-long"
89*42920ac8SGordon Ross 			"-long-long-long-long-long-long-long-long"
90*42920ac8SGordon Ross 	},
91*42920ac8SGordon Ross 	{
92*42920ac8SGordon Ross 		.pid = 0
93*42920ac8SGordon Ross 	}
94*42920ac8SGordon Ross };
95*42920ac8SGordon Ross 
96*42920ac8SGordon Ross 
97*42920ac8SGordon Ross idmap_get_handle_t *stub_idmh = (idmap_get_handle_t *)0x40;
98*42920ac8SGordon Ross 
99*42920ac8SGordon Ross idmap_stat
idmap_get_create(idmap_get_handle_t ** gh)100*42920ac8SGordon Ross idmap_get_create(idmap_get_handle_t **gh)
101*42920ac8SGordon Ross {
102*42920ac8SGordon Ross 	*gh = stub_idmh;
103*42920ac8SGordon Ross 	return (0);
104*42920ac8SGordon Ross }
105*42920ac8SGordon Ross 
106*42920ac8SGordon Ross void
idmap_get_destroy(idmap_get_handle_t * gh)107*42920ac8SGordon Ross idmap_get_destroy(idmap_get_handle_t *gh)
108*42920ac8SGordon Ross {
109*42920ac8SGordon Ross }
110*42920ac8SGordon Ross 
111*42920ac8SGordon Ross idmap_stat
idmap_get_mappings(idmap_get_handle_t * gh)112*42920ac8SGordon Ross idmap_get_mappings(idmap_get_handle_t *gh)
113*42920ac8SGordon Ross {
114*42920ac8SGordon Ross 	if (gh != stub_idmh)
115*42920ac8SGordon Ross 		return (IDMAP_ERR_ARG);
116*42920ac8SGordon Ross 	return (0);
117*42920ac8SGordon Ross }
118*42920ac8SGordon Ross 
119*42920ac8SGordon Ross 
120*42920ac8SGordon Ross /*
121*42920ac8SGordon Ross  * Get winname given pid
122*42920ac8SGordon Ross  */
123*42920ac8SGordon Ross idmap_stat
idmap_getwinnamebypid(uid_t pid,int is_user,int flag,char ** name,char ** domain)124*42920ac8SGordon Ross idmap_getwinnamebypid(uid_t pid, int is_user, int flag, char **name,
125*42920ac8SGordon Ross     char **domain)
126*42920ac8SGordon Ross {
127*42920ac8SGordon Ross 	struct mapping	*mp;
128*42920ac8SGordon Ross 
129*42920ac8SGordon Ross 	if (name == NULL)
130*42920ac8SGordon Ross 		return (IDMAP_ERR_ARG);
131*42920ac8SGordon Ross 
132*42920ac8SGordon Ross 	/* Get mapping */
133*42920ac8SGordon Ross 	for (mp = mappings; mp->pid != 0; mp++) {
134*42920ac8SGordon Ross 		if (mp->is_user != is_user)
135*42920ac8SGordon Ross 			continue;
136*42920ac8SGordon Ross 		if (mp->pid == pid)
137*42920ac8SGordon Ross 			break;
138*42920ac8SGordon Ross 	}
139*42920ac8SGordon Ross 	if (mp->pid == 0 || mp->name == NULL || mp->domain == NULL)
140*42920ac8SGordon Ross 		return (IDMAP_ERR_NORESULT);
141*42920ac8SGordon Ross 
142*42920ac8SGordon Ross 	if (domain != NULL) {
143*42920ac8SGordon Ross 		*name = strdup(mp->name);
144*42920ac8SGordon Ross 		*domain = strdup(mp->domain);
145*42920ac8SGordon Ross 	} else {
146*42920ac8SGordon Ross 		(void) asprintf(name, "%s@%s", mp->name, mp->domain);
147*42920ac8SGordon Ross 	}
148*42920ac8SGordon Ross 
149*42920ac8SGordon Ross 	return (0);
150*42920ac8SGordon Ross }
151*42920ac8SGordon Ross 
152*42920ac8SGordon Ross idmap_stat
idmap_getwinnamebyuid(uid_t uid,int flag,char ** name,char ** domain)153*42920ac8SGordon Ross idmap_getwinnamebyuid(uid_t uid, int flag, char **name, char **domain)
154*42920ac8SGordon Ross {
155*42920ac8SGordon Ross 	return (idmap_getwinnamebypid(uid, 1, flag, name, domain));
156*42920ac8SGordon Ross }
157*42920ac8SGordon Ross 
158*42920ac8SGordon Ross idmap_stat
idmap_getwinnamebygid(gid_t gid,int flag,char ** name,char ** domain)159*42920ac8SGordon Ross idmap_getwinnamebygid(gid_t gid, int flag, char **name, char **domain)
160*42920ac8SGordon Ross {
161*42920ac8SGordon Ross 	return (idmap_getwinnamebypid(gid, 0, flag, name, domain));
162*42920ac8SGordon Ross }
163*42920ac8SGordon Ross 
164*42920ac8SGordon Ross idmap_stat
idmap_getpidbywinname(const char * name,const char * domain,int flag,uid_t * uid,int is_user)165*42920ac8SGordon Ross idmap_getpidbywinname(const char *name, const char *domain, int flag,
166*42920ac8SGordon Ross     uid_t *uid, int is_user)
167*42920ac8SGordon Ross {
168*42920ac8SGordon Ross 	struct mapping	*mp;
169*42920ac8SGordon Ross 
170*42920ac8SGordon Ross 	/* Get mapping */
171*42920ac8SGordon Ross 	for (mp = mappings; mp->pid != 0; mp++) {
172*42920ac8SGordon Ross 		if (mp->is_user != is_user)
173*42920ac8SGordon Ross 			continue;
174*42920ac8SGordon Ross 		if (mp->domain == NULL)
175*42920ac8SGordon Ross 			continue;
176*42920ac8SGordon Ross 		if (strcmp(mp->domain, domain) == 0 &&
177*42920ac8SGordon Ross 		    strcmp(mp->name, name) == 0)
178*42920ac8SGordon Ross 			break;
179*42920ac8SGordon Ross 	}
180*42920ac8SGordon Ross 	if (mp->pid == 0)
181*42920ac8SGordon Ross 		return (IDMAP_ERR_NORESULT);
182*42920ac8SGordon Ross 
183*42920ac8SGordon Ross 	*uid = mp->pid;
184*42920ac8SGordon Ross 	return (0);
185*42920ac8SGordon Ross }
186*42920ac8SGordon Ross 
187*42920ac8SGordon Ross 
188*42920ac8SGordon Ross idmap_stat
idmap_getuidbywinname(const char * name,const char * domain,int flag,uid_t * uid)189*42920ac8SGordon Ross idmap_getuidbywinname(const char *name, const char *domain, int flag,
190*42920ac8SGordon Ross     uid_t *uid)
191*42920ac8SGordon Ross {
192*42920ac8SGordon Ross 	return (idmap_getpidbywinname(name, domain, flag, uid, 1));
193*42920ac8SGordon Ross }
194*42920ac8SGordon Ross 
195*42920ac8SGordon Ross idmap_stat
idmap_getgidbywinname(const char * name,const char * domain,int flag,gid_t * gid)196*42920ac8SGordon Ross idmap_getgidbywinname(const char *name, const char *domain, int flag,
197*42920ac8SGordon Ross     gid_t *gid)
198*42920ac8SGordon Ross {
199*42920ac8SGordon Ross 	return (idmap_getpidbywinname(name, domain, flag, gid, 0));
200*42920ac8SGordon Ross }
201*42920ac8SGordon Ross 
202*42920ac8SGordon Ross 
203*42920ac8SGordon Ross idmap_stat
idmap_get_sidbypid(idmap_get_handle_t * gh,uid_t pid,int flag,char ** sidprefix,idmap_rid_t * rid,idmap_stat * stat,int is_user)204*42920ac8SGordon Ross idmap_get_sidbypid(idmap_get_handle_t *gh, uid_t pid, int flag,
205*42920ac8SGordon Ross     char **sidprefix, idmap_rid_t *rid, idmap_stat *stat, int is_user)
206*42920ac8SGordon Ross {
207*42920ac8SGordon Ross 	struct mapping	*mp;
208*42920ac8SGordon Ross 	char *p;
209*42920ac8SGordon Ross 	int len;
210*42920ac8SGordon Ross 
211*42920ac8SGordon Ross 	/* Get mapping */
212*42920ac8SGordon Ross 	for (mp = mappings; mp->pid != 0; mp++) {
213*42920ac8SGordon Ross 		if (mp->is_user != is_user)
214*42920ac8SGordon Ross 			continue;
215*42920ac8SGordon Ross 		if (mp->pid == pid)
216*42920ac8SGordon Ross 			break;
217*42920ac8SGordon Ross 	}
218*42920ac8SGordon Ross 	if (mp->pid == 0 || mp->sid == NULL)
219*42920ac8SGordon Ross 		goto errout;
220*42920ac8SGordon Ross 
221*42920ac8SGordon Ross 	p = strrchr(mp->sid, '-');
222*42920ac8SGordon Ross 	if (p == NULL)
223*42920ac8SGordon Ross 		goto errout;
224*42920ac8SGordon Ross 	len = p - mp->sid;
225*42920ac8SGordon Ross 	*sidprefix = malloc(len + 1);
226*42920ac8SGordon Ross 	if (*sidprefix == NULL)
227*42920ac8SGordon Ross 		goto errout;
228*42920ac8SGordon Ross 	(void) strlcpy(*sidprefix, mp->sid, len + 1);
229*42920ac8SGordon Ross 
230*42920ac8SGordon Ross 	*rid = strtol(p + 1, NULL, 10);
231*42920ac8SGordon Ross 	*stat = 0;
232*42920ac8SGordon Ross 	return (0);
233*42920ac8SGordon Ross 
234*42920ac8SGordon Ross errout:
235*42920ac8SGordon Ross 	*stat = IDMAP_ERR_NORESULT;
236*42920ac8SGordon Ross 	return (0);
237*42920ac8SGordon Ross }
238*42920ac8SGordon Ross 
239*42920ac8SGordon Ross idmap_stat
idmap_get_sidbyuid(idmap_get_handle_t * gh,uid_t uid,int flag,char ** sidprefix,idmap_rid_t * rid,idmap_stat * stat)240*42920ac8SGordon Ross idmap_get_sidbyuid(idmap_get_handle_t *gh, uid_t uid, int flag,
241*42920ac8SGordon Ross     char **sidprefix, idmap_rid_t *rid, idmap_stat *stat)
242*42920ac8SGordon Ross {
243*42920ac8SGordon Ross 	return (idmap_get_sidbypid(gh, uid, flag,
244*42920ac8SGordon Ross 	    sidprefix, rid, stat, 1));
245*42920ac8SGordon Ross }
246*42920ac8SGordon Ross 
247*42920ac8SGordon Ross idmap_stat
idmap_get_sidbygid(idmap_get_handle_t * gh,gid_t gid,int flag,char ** sidprefix,idmap_rid_t * rid,idmap_stat * stat)248*42920ac8SGordon Ross idmap_get_sidbygid(idmap_get_handle_t *gh, gid_t gid, int flag,
249*42920ac8SGordon Ross     char **sidprefix, idmap_rid_t *rid, idmap_stat *stat)
250*42920ac8SGordon Ross {
251*42920ac8SGordon Ross 	return (idmap_get_sidbypid(gh, gid, flag,
252*42920ac8SGordon Ross 	    sidprefix, rid, stat, 0));
253*42920ac8SGordon Ross }
254*42920ac8SGordon Ross 
255*42920ac8SGordon Ross idmap_stat
idmap_get_pidbysid(idmap_get_handle_t * gh,char * sidprefix,idmap_rid_t rid,int flag,uid_t * pid,int * is_user,idmap_stat * stat)256*42920ac8SGordon Ross idmap_get_pidbysid(idmap_get_handle_t *gh, char *sidprefix, idmap_rid_t rid,
257*42920ac8SGordon Ross     int flag, uid_t *pid, int *is_user, idmap_stat *stat)
258*42920ac8SGordon Ross {
259*42920ac8SGordon Ross 	char tmpsid[80];
260*42920ac8SGordon Ross 	struct mapping	*mp;
261*42920ac8SGordon Ross 
262*42920ac8SGordon Ross 	(void) snprintf(tmpsid, sizeof (tmpsid), "%s-%u", sidprefix, rid);
263*42920ac8SGordon Ross 
264*42920ac8SGordon Ross 	/* Get mapping */
265*42920ac8SGordon Ross 	for (mp = mappings; mp->pid != 0; mp++) {
266*42920ac8SGordon Ross 		if (mp->sid != NULL &&
267*42920ac8SGordon Ross 		    strcmp(mp->sid, tmpsid) == 0)
268*42920ac8SGordon Ross 			break;
269*42920ac8SGordon Ross 	}
270*42920ac8SGordon Ross 	if (mp->pid == 0)
271*42920ac8SGordon Ross 		return (IDMAP_ERR_NORESULT);
272*42920ac8SGordon Ross 
273*42920ac8SGordon Ross 	*pid = mp->pid;
274*42920ac8SGordon Ross 	*is_user = mp->is_user;
275*42920ac8SGordon Ross 	*stat = 0;
276*42920ac8SGordon Ross 
277*42920ac8SGordon Ross 	return (0);
278*42920ac8SGordon Ross }
279*42920ac8SGordon Ross 
280*42920ac8SGordon Ross idmap_stat
idmap_get_uidbysid(idmap_get_handle_t * gh,char * sidprefix,idmap_rid_t rid,int flag,uid_t * uid,idmap_stat * stat)281*42920ac8SGordon Ross idmap_get_uidbysid(idmap_get_handle_t *gh, char *sidprefix, idmap_rid_t rid,
282*42920ac8SGordon Ross     int flag, uid_t *uid, idmap_stat *stat)
283*42920ac8SGordon Ross {
284*42920ac8SGordon Ross 	idmap_stat rc;
285*42920ac8SGordon Ross 	uid_t pid;
286*42920ac8SGordon Ross 	int is_user;
287*42920ac8SGordon Ross 
288*42920ac8SGordon Ross 	rc = idmap_get_pidbysid(gh, sidprefix, rid, flag, &pid, &is_user, stat);
289*42920ac8SGordon Ross 	if (rc == 0) {
290*42920ac8SGordon Ross 		if (is_user != 1) {
291*42920ac8SGordon Ross 			*stat = IDMAP_ERR_NOTUSER;
292*42920ac8SGordon Ross 			return (0);
293*42920ac8SGordon Ross 		}
294*42920ac8SGordon Ross 		*uid = pid;
295*42920ac8SGordon Ross 	}
296*42920ac8SGordon Ross 
297*42920ac8SGordon Ross 	return (rc);
298*42920ac8SGordon Ross }
299*42920ac8SGordon Ross 
300*42920ac8SGordon Ross idmap_stat
idmap_get_gidbysid(idmap_get_handle_t * gh,char * sidprefix,idmap_rid_t rid,int flag,gid_t * gid,idmap_stat * stat)301*42920ac8SGordon Ross idmap_get_gidbysid(idmap_get_handle_t *gh, char *sidprefix, idmap_rid_t rid,
302*42920ac8SGordon Ross     int flag, gid_t *gid, idmap_stat *stat)
303*42920ac8SGordon Ross {
304*42920ac8SGordon Ross 	idmap_stat rc;
305*42920ac8SGordon Ross 	uid_t pid;
306*42920ac8SGordon Ross 	int is_user;
307*42920ac8SGordon Ross 
308*42920ac8SGordon Ross 	rc = idmap_get_pidbysid(gh, sidprefix, rid, flag, &pid, &is_user, stat);
309*42920ac8SGordon Ross 	if (rc == 0) {
310*42920ac8SGordon Ross 		if (is_user != 0) {
311*42920ac8SGordon Ross 			*stat = IDMAP_ERR_NOTGROUP;
312*42920ac8SGordon Ross 			return (rc);
313*42920ac8SGordon Ross 		}
314*42920ac8SGordon Ross 		*gid = pid;
315*42920ac8SGordon Ross 	}
316*42920ac8SGordon Ross 
317*42920ac8SGordon Ross 	return (rc);
318*42920ac8SGordon Ross }
319*42920ac8SGordon Ross 
320*42920ac8SGordon Ross struct passwd *
getpwnam(const char * nam)321*42920ac8SGordon Ross getpwnam(const char *nam)
322*42920ac8SGordon Ross {
323*42920ac8SGordon Ross 	static char pwname[128];
324*42920ac8SGordon Ross 	static struct passwd pw;
325*42920ac8SGordon Ross 	struct mapping	*mp;
326*42920ac8SGordon Ross 	char *p;
327*42920ac8SGordon Ross 
328*42920ac8SGordon Ross 	/* Allow lookup with or without domain part */
329*42920ac8SGordon Ross 	if ((p = strchr(nam, '@')) != NULL) {
330*42920ac8SGordon Ross 		int len = p - nam;
331*42920ac8SGordon Ross 		if (len >= sizeof (pwname))
332*42920ac8SGordon Ross 			return (NULL);
333*42920ac8SGordon Ross 		(void) strlcpy(pwname, nam, len + 1);
334*42920ac8SGordon Ross 		pwname[len] = '\0';
335*42920ac8SGordon Ross 	} else {
336*42920ac8SGordon Ross 		(void) strlcpy(pwname, nam, sizeof (pwname));
337*42920ac8SGordon Ross 	}
338*42920ac8SGordon Ross 
339*42920ac8SGordon Ross 	/* Get mapping */
340*42920ac8SGordon Ross 	for (mp = mappings; mp->pid != 0; mp++) {
341*42920ac8SGordon Ross 		if (mp->is_user != 1)
342*42920ac8SGordon Ross 			continue;
343*42920ac8SGordon Ross 		if (strcmp(mp->name, pwname) == 0)
344*42920ac8SGordon Ross 			break;
345*42920ac8SGordon Ross 	}
346*42920ac8SGordon Ross 	if (mp->pid == 0)
347*42920ac8SGordon Ross 		return (NULL);
348*42920ac8SGordon Ross 
349*42920ac8SGordon Ross 	if (mp->domain != NULL)
350*42920ac8SGordon Ross 		(void) snprintf(pwname, sizeof (pwname),
351*42920ac8SGordon Ross 		    "%s@%s", mp->name, mp->domain);
352*42920ac8SGordon Ross 	else
353*42920ac8SGordon Ross 		(void) strlcpy(pwname, mp->name, sizeof (pwname));
354*42920ac8SGordon Ross 
355*42920ac8SGordon Ross 	pw.pw_name = pwname;
356*42920ac8SGordon Ross 	pw.pw_uid = mp->pid;
357*42920ac8SGordon Ross 	return (&pw);
358*42920ac8SGordon Ross }
359*42920ac8SGordon Ross 
360*42920ac8SGordon Ross struct passwd *
getpwuid(uid_t uid)361*42920ac8SGordon Ross getpwuid(uid_t uid)
362*42920ac8SGordon Ross {
363*42920ac8SGordon Ross 	static char pwname[128];
364*42920ac8SGordon Ross 	static struct passwd pw;
365*42920ac8SGordon Ross 	struct mapping	*mp;
366*42920ac8SGordon Ross 
367*42920ac8SGordon Ross 	/* Get mapping */
368*42920ac8SGordon Ross 	for (mp = mappings; mp->pid != 0; mp++) {
369*42920ac8SGordon Ross 		if (mp->is_user != 1)
370*42920ac8SGordon Ross 			continue;
371*42920ac8SGordon Ross 		if (mp->pid == uid)
372*42920ac8SGordon Ross 			break;
373*42920ac8SGordon Ross 	}
374*42920ac8SGordon Ross 	if (mp->pid == 0)
375*42920ac8SGordon Ross 		return (NULL);
376*42920ac8SGordon Ross 
377*42920ac8SGordon Ross 	if (mp->domain != NULL)
378*42920ac8SGordon Ross 		(void) snprintf(pwname, sizeof (pwname),
379*42920ac8SGordon Ross 		    "%s@%s", mp->name, mp->domain);
380*42920ac8SGordon Ross 	else
381*42920ac8SGordon Ross 		(void) strlcpy(pwname, mp->name, sizeof (pwname));
382*42920ac8SGordon Ross 
383*42920ac8SGordon Ross 	pw.pw_name = pwname;
384*42920ac8SGordon Ross 	pw.pw_uid = uid;
385*42920ac8SGordon Ross 	return (&pw);
386*42920ac8SGordon Ross }
387*42920ac8SGordon Ross 
388*42920ac8SGordon Ross struct group *
getgrnam(const char * nam)389*42920ac8SGordon Ross getgrnam(const char *nam)
390*42920ac8SGordon Ross {
391*42920ac8SGordon Ross 	static char grname[128];
392*42920ac8SGordon Ross 	static struct group gr;
393*42920ac8SGordon Ross 	struct mapping	*mp;
394*42920ac8SGordon Ross 	char *p;
395*42920ac8SGordon Ross 
396*42920ac8SGordon Ross 	/* Allow lookup with or without domain part */
397*42920ac8SGordon Ross 	if ((p = strchr(nam, '@')) != NULL) {
398*42920ac8SGordon Ross 		int len = p - nam;
399*42920ac8SGordon Ross 		if (len >= sizeof (grname))
400*42920ac8SGordon Ross 			return (NULL);
401*42920ac8SGordon Ross 		(void) strlcpy(grname, nam, len + 1);
402*42920ac8SGordon Ross 		grname[len] = '\0';
403*42920ac8SGordon Ross 	} else {
404*42920ac8SGordon Ross 		(void) strlcpy(grname, nam, sizeof (grname));
405*42920ac8SGordon Ross 	}
406*42920ac8SGordon Ross 
407*42920ac8SGordon Ross 	/* Get mapping */
408*42920ac8SGordon Ross 	for (mp = mappings; mp->pid != 0; mp++) {
409*42920ac8SGordon Ross 		if (mp->is_user != 0)
410*42920ac8SGordon Ross 			continue;
411*42920ac8SGordon Ross 		if (strcmp(mp->name, grname) == 0)
412*42920ac8SGordon Ross 			break;
413*42920ac8SGordon Ross 	}
414*42920ac8SGordon Ross 	if (mp->pid == 0)
415*42920ac8SGordon Ross 		return (NULL);
416*42920ac8SGordon Ross 
417*42920ac8SGordon Ross 	if (mp->domain != NULL)
418*42920ac8SGordon Ross 		(void) snprintf(grname, sizeof (grname),
419*42920ac8SGordon Ross 		    "%s@%s", mp->name, mp->domain);
420*42920ac8SGordon Ross 	else
421*42920ac8SGordon Ross 		(void) strlcpy(grname, mp->name, sizeof (grname));
422*42920ac8SGordon Ross 
423*42920ac8SGordon Ross 	gr.gr_name = grname;
424*42920ac8SGordon Ross 	gr.gr_gid = mp->pid;
425*42920ac8SGordon Ross 	return (&gr);
426*42920ac8SGordon Ross }
427*42920ac8SGordon Ross 
428*42920ac8SGordon Ross struct group *
getgrgid(gid_t gid)429*42920ac8SGordon Ross getgrgid(gid_t gid)
430*42920ac8SGordon Ross {
431*42920ac8SGordon Ross 	static char grname[128];
432*42920ac8SGordon Ross 	static struct group gr;
433*42920ac8SGordon Ross 	struct mapping	*mp;
434*42920ac8SGordon Ross 
435*42920ac8SGordon Ross 	/* Get mapping */
436*42920ac8SGordon Ross 	for (mp = mappings; mp->pid != 0; mp++) {
437*42920ac8SGordon Ross 		if (mp->is_user != 0)
438*42920ac8SGordon Ross 			continue;
439*42920ac8SGordon Ross 		if (mp->pid == gid)
440*42920ac8SGordon Ross 			break;
441*42920ac8SGordon Ross 	}
442*42920ac8SGordon Ross 	if (mp->pid == 0)
443*42920ac8SGordon Ross 		return (NULL);
444*42920ac8SGordon Ross 
445*42920ac8SGordon Ross 	if (mp->domain != NULL)
446*42920ac8SGordon Ross 		(void) snprintf(grname, sizeof (grname),
447*42920ac8SGordon Ross 		    "%s@%s", mp->name, mp->domain);
448*42920ac8SGordon Ross 	else
449*42920ac8SGordon Ross 		(void) strlcpy(grname, mp->name, sizeof (grname));
450*42920ac8SGordon Ross 
451*42920ac8SGordon Ross 	gr.gr_name = grname;
452*42920ac8SGordon Ross 	gr.gr_gid = gid;
453*42920ac8SGordon Ross 	return (&gr);
454*42920ac8SGordon Ross }
455