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