|
|
1.1 root 1: #include "ps.h"
2:
3: #define GETC(fd, n, p, buffer) \
4: (--n > 0 || \
5: (n = read(fd, p = buffer, sizeof buffer)) > 0 ? *p++ : -1)
6:
7: #define NNAMES 100
8:
9: char *unpts[3];
10:
11: enum States { START, NAME, SKCOL, UID, SKNL };
12:
13: struct direct *unbeg, *unend, *unprev;
14:
15: #ifdef TEST
16: main(argc, argv)
17: char **argv;
18: {
19: register struct direct *up; int uid; char *getuname();
20: getlogins();
21: if (argc <= 1)
22: for (up=unbeg; up < unend; up++)
23: printf("%5d %.14s\n", up->d_ino, up->d_name);
24: else while (--argc > 0) {
25: uid = atoi(*++argv);
26: printf("%5d %.14s\n", uid, getuname(uid));
27: }
28: exit(0);
29: }
30: #endif
31:
32: char *
33: getuname(uid)
34: register uid;
35: {
36: register struct direct *up;
37:
38: if ((up = unprev) && up->d_ino == uid)
39: return up->d_name;
40: for (up=unbeg; up < unend; up++)
41: if (up->d_ino == uid) {
42: unprev = up;
43: return up->d_name;
44: }
45: return "?";
46: }
47:
48: getlogins()
49: {
50: char buffer[1024];
51: register fd, c, state, n; register struct direct *up = 0;
52: register char *p; int nbuf = 0;
53:
54: if (unbeg)
55: return 0;
56:
57: if ((fd = open("/etc/passwd", 0)) < 0)
58: return 1;
59:
60: state = (int)START;
61: while ((c = GETC(fd, nbuf, p, buffer)) > 0) switch (state) {
62: case START:
63: if ((up = Nalloc(struct direct, unpts, NNAMES)) == 0)
64: goto out;
65: n = 0;
66: up->d_ino = 0;
67: state = (int)NAME;
68: /* fall through */
69: case NAME:
70: if (c == ':') {
71: if (n < DIRSIZ)
72: up->d_name[n++] = 0;
73: state = (int)SKCOL;
74: } else if (n < DIRSIZ)
75: up->d_name[n++] = c;
76: break;
77: case SKCOL:
78: if (c == ':')
79: state = (int)UID;
80: break;
81: case UID:
82: if (c >= '0' && c <= '9')
83: up->d_ino = 10*up->d_ino + c - '0';
84: else
85: state = (int)SKNL;
86: break;
87: case SKNL:
88: if (c == '\n')
89: state = (int)START;
90: break;
91: }
92: out:
93: if (up) {
94: unbeg = (struct direct *)unpts[0];
95: unend = (struct direct *)unpts[1];
96: }
97: close(fd);
98: return 0;
99: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.