1 /***********************************************************************
2 * *
3 * This software is part of the ast package *
4 * Copyright (c) 1985-2010 AT&T Intellectual Property *
5 * and is licensed under the *
6 * Common Public License, Version 1.0 *
7 * by AT&T Intellectual Property *
8 * *
9 * A copy of the License is available at *
10 * http://www.opensource.org/licenses/cpl1.0.txt *
11 * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
12 * *
13 * Information and Software Systems Research *
14 * AT&T Research *
15 * Florham Park NJ *
16 * *
17 * Glenn Fowler <gsf@research.att.com> *
18 * David Korn <dgk@research.att.com> *
19 * Phong Vo <kpv@research.att.com> *
20 * *
21 ***********************************************************************/
22 #pragma prototyped
23 /*
24 * Glenn Fowler
25 * AT&T Bell Laboratories
26 *
27 * cached gid number -> name
28 */
29
30 #if defined(__STDPP__directive) && defined(__STDPP__hide)
31 __STDPP__directive pragma pp:hide getgrgid
32 #else
33 #define getgrgid ______getgrgid
34 #endif
35
36 #include <ast.h>
37 #include <cdt.h>
38 #include <grp.h>
39
40 #if defined(__STDPP__directive) && defined(__STDPP__hide)
41 __STDPP__directive pragma pp:nohide getgrgid
42 #else
43 #undef getgrgid
44 #endif
45
46 extern struct group* getgrgid(gid_t);
47
48 typedef struct Id_s
49 {
50 Dtlink_t link;
51 int id;
52 char name[1];
53 } Id_t;
54
55 /*
56 * return gid name given gid number
57 */
58
59 char*
fmtgid(int gid)60 fmtgid(int gid)
61 {
62 register Id_t* ip;
63 register char* name;
64 register struct group* gr;
65 int z;
66
67 static Dt_t* dict;
68 static Dtdisc_t disc;
69
70 if (!dict)
71 {
72 disc.key = offsetof(Id_t, id);
73 disc.size = sizeof(int);
74 dict = dtopen(&disc, Dthash);
75 }
76 else if (ip = (Id_t*)dtmatch(dict, &gid))
77 return ip->name;
78 if (gr = getgrgid(gid))
79 {
80 name = gr->gr_name;
81 #if _WINIX
82 if (streq(name, "Administrators"))
83 name = "sys";
84 #endif
85 }
86 else if (gid == 0)
87 name = "sys";
88 else
89 {
90 name = fmtbuf(z = sizeof(gid) * 3 + 1);
91 sfsprintf(name, z, "%I*d", sizeof(gid), gid);
92 }
93 if (dict && (ip = newof(0, Id_t, 1, strlen(name))))
94 {
95 ip->id = gid;
96 strcpy(ip->name, name);
97 dtinsert(dict, ip);
98 return ip->name;
99 }
100 return name;
101 }
102