|
|
1.1 root 1: #include "asd.h"
2: #include <pwd.h>
3: #include <stdio.h>
4: #include <stdlib.h>
5: #include <string.h>
6: #include <unistd.h>
7:
8:
9: #define CHUNK 16
10:
11: static struct utab {
12: unsigned uid;
13: char *name;
14: } *utab;
15:
16: static int size, salloc;
17:
18: char *
19: uidstr (uid_t uid)
20: {
21: register int i;
22: static char buf[12];
23: struct passwd *p;
24:
25: /* search the cache for the uid */
26: for (i = 0; i < size; i++)
27: if (utab[i].uid == uid)
28: return utab[i].name;
29:
30: /* try to find it in the system's database */
31: if (p = getpwuid(uid)) {
32: if (size % CHUNK == 0)
33: utab = (struct utab *) ralloc((char *) utab, salloc += CHUNK);
34: utab[size].uid = p->pw_uid;
35: utab[size].name = copy(p->pw_name);
36: ++size;
37: return utab[size - 1].name;
38: }
39:
40: /* failure, invent a string */
41: sprintf (buf, "#%u", uid);
42: return buf;
43: }
44:
45: uid_t
46: uidnum (char *name)
47: {
48: register int i;
49: struct passwd *p;
50:
51: /* if it starts with a #, use the number */
52: if (name[0] == '#')
53: return atoi (name + 1);
54:
55: /* try to find it in the system's database */
56: if (p = getpwnam(name)) {
57: if (size % CHUNK == 0)
58: utab = (struct utab *) ralloc((char *) utab, salloc += CHUNK);
59: utab[size].uid = p->pw_uid;
60: utab[size].name = copy(p->pw_name);
61: ++size;
62: return utab[size - 1].uid;
63: }
64:
65: /* search the cache */
66: for (i = 0; i < size; i++)
67: if (strcmp (utab[i].name, name) == 0)
68: return utab[i].uid;
69:
70: /* failure, invent a value */
71: return getuid();
72: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.