|
|
1.1 root 1: #include <limits.h>
2: #include <stddef.h>
3: #include <stdio.h>
4: #include <pwd.h>
5: #include <grp.h>
6: #include "misc.h"
7:
8: struct idmap {
9: char *str;
10: int num;
11: struct idmap *next;
12: };
13:
14: static struct idmap *umap, *gmap;
15:
16: static struct idmap *
17: idnum(struct idmap **map, char *str)
18: {
19: while (*map) {
20: if (strcmp((*map)->str, str) == 0)
21: return *map;
22: map = &(*map)->next;
23: }
24: return 0;
25: }
26:
27: static struct idmap *
28: idstr(struct idmap **map, int num)
29: {
30: while (*map) {
31: if ((*map)->num == num)
32: return *map;
33: map = &(*map)->next;
34: }
35: return 0;
36: }
37:
38: static struct idmap *
39: idset(struct idmap **map, char *str, int num)
40: {
41: struct idmap *mapent;
42:
43: mapent = xmalloc(sizeof (struct idmap));
44: if (str)
45: mapent->str = xstrdup(str);
46: else
47: mapent->str = 0;
48: mapent->num = num;
49: mapent->next = *map;
50: *map = mapent;
51: return mapent;
52: }
53:
54: int
55: uidnum(char *str)
56: {
57: struct idmap *id;
58: struct passwd *pw;
59: int num;
60:
61: id = idnum(&umap, str);
62: if (!id) {
63: pw = getpwnam(str);
64: id = idset(&umap, str, pw ? pw->pw_uid : -1);
65: }
66: return id->num;
67: }
68:
69: char *
70: uidstr(int num)
71: {
72: struct idmap *id;
73: struct passwd *pw;
74: char *str;
75:
76: id = idstr(&umap, num);
77: if (!id) {
78: pw = getpwuid(num);
79: id = idset(&umap, pw ? pw->pw_name : 0, num);
80: }
81: return id->str;
82: }
83:
84: int
85: gidnum(char *str)
86: {
87: struct idmap *id;
88: struct group *gr;
89: int num;
90:
91: id = idnum(&gmap, str);
92: if (!id) {
93: gr = getgrnam(str);
94: id = idset(&gmap, str, gr ? gr->gr_gid : -1);
95: }
96: return id->num;
97: }
98:
99: char *
100: gidstr(int num)
101: {
102: struct idmap *id;
103: struct group *gr;
104: char *str;
105:
106: id = idstr(&gmap, num);
107: if (!id) {
108: gr = getgrgid(num);
109: id = idset(&gmap, gr ? gr->gr_name : 0, num);
110: }
111: return id->str;
112: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.