|
|
1.1 root 1: /*
2: ** Print out current access groups.
3: */
4:
5: char * Usage = "[-h{eader}] [-s{ort}]";
6:
7: #include <sys/param.h>
8: #include <grp.h>
9: #include <stdio.h>
10: #include <trace.h>
11:
12: char * format = " %s";
13: short groups[NGROUPS+1];
14: char * grnames[NGROUPS+1];
15: char * name;
16: int noheader;
17: int nosort;
18: int Traceflag;
19:
20: #define NULLSTR (char *)0
21: #define SYSERROR (-1)
22:
23: extern char * malloc();
24: extern char * strcpy();
25: extern char * strrchr();
26: extern int strlen();
27: extern char _sobuf[];
28:
29: void prgr(), syserror(), usage();
30: int comp();
31: char * newstr();
32:
33: int
34: main(argc, argv)
35: int argc;
36: char * argv[];
37: {
38: int ngroups = NGROUPS;
39:
40: if ( (name = strrchr(*argv, '/')) != NULLSTR )
41: name++;
42: else
43: name = *argv;
44:
45: while ( --argc > 0 )
46: {
47: if ( **++argv == '-' )
48: {
49: register int c;
50:
51: while ( c = *++*argv )
52: {
53: switch ( c )
54: {
55: case 'h': noheader = 1; format = "%s\n";
56: continue;
57: case 's': nosort = 1;
58: continue;
59: case 't': Traceflag = 1;
60: continue;
61: default: usage("unreconised flag '%c'", c);
62: }
63:
64: while ( (c = **argv) <= '9' && c >= '0' )
65: ++*argv;
66: --*argv;
67: }
68:
69: break2: ;
70: }
71: else
72: usage("unrecognised argument \"%s\"", *argv);
73: }
74:
75: setbuf(stdout, _sobuf);
76:
77: if ( (ngroups = getgroups(NGROUPS, groups)) == SYSERROR )
78: syserror("getgroups");
79:
80: prgr(ngroups);
81:
82: return 0;
83: }
84:
85: void
86: prgr(n)
87: register int n;
88: {
89: register short * gp;
90: register char ** cpp;
91: register int i;
92: register struct group * grp;
93: register char * name;
94: char space[20];
95:
96: groups[n++] = getgid();
97:
98: Trace(("prgr(%d), gid %d\n", n-1, groups[n-1]));
99:
100: if ( !noheader )
101: printf("Access group%s:", n==1?"":"s");
102:
103: for ( gp = groups, cpp = grnames, i = n ; i-- ; )
104: {
105: Trace(("Got group id %d", *gp));
106:
107: if ( (grp = getgrgid(*gp++)) == (struct group *)0 )
108: {
109: (void)sprintf(space, "<%d>", gp[-1]);
110: name = space;
111: }
112: else
113: name = grp->gr_name;
114:
115: Trace((" name \"%s\"\n", name));
116:
117: if ( nosort )
118: printf(format, name);
119: else
120: *cpp++ = newstr(name);
121: }
122:
123: if ( !nosort )
124: {
125: qsort((char *)grnames, n, sizeof(char **), comp);
126:
127: for ( cpp = grnames, i = n ; i-- ; )
128: printf(format, *cpp++);
129: }
130:
131: if ( !noheader )
132: printf(".\n");
133: }
134:
135: void
136: syserror(s)
137: char * s;
138: {
139: perror(s);
140: exit(2);
141: }
142:
143: void
144: usage(s, a)
145: char * s;
146: char * a;
147: {
148: fprintf(stderr, "%s: ", name);
149: fprintf(stderr, s, a);
150: fprintf(stderr, ".\nUsage: \"%s %s\".\n", name, Usage);
151: exit(1);
152: }
153:
154: char *
155: Malloc(size)
156: int size;
157: {
158: register char * cp;
159:
160: while ( (cp = malloc((unsigned)size)) == NULLSTR )
161: syserror("no memory for Malloc");
162:
163: return cp;
164: }
165:
166: char *
167: newstr(s)
168: char * s;
169: {
170: if ( s == NULLSTR )
171: s = "";
172:
173: return strcpy(Malloc(strlen(s)+1), s);
174: }
175:
176: int
177: comp(a1, a2)
178: char ** a1;
179: char ** a2;
180: {
181: register char * s1 = *a1;
182: register char * s2 = *a2;
183: register int c1;
184: register int c2;
185:
186: while ( c1 = *s1++ )
187: {
188: if ( (c2 = *s2++) == 0 )
189: return 1;
190:
191: if ( (c1 |= 040) != (c2 |= 040) )
192: return (c1&0xff) - (c2&0xff);
193: }
194:
195: return -((*s2)&0xff);
196: }
197:
198: #ifdef GETGROUP
199: int
200: getgroups(n, gp)
201: int n;
202: short * gp;
203: {
204: register int i;
205: int count = 1;
206:
207: *gp++ = 0;
208:
209: for ( i = 1 ; i < n ; i++ )
210: {
211: if ( getgrgid(i) != (struct group *)0 )
212: {
213: *gp++ = i;
214: count++;
215: }
216: }
217:
218: return count;
219: }
220: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.