|
|
1.1 root 1: /*
2: * parse the permission exceptions file
3: */
4:
5: #include <rf.h>
6: #include <stdio.h>
7: #include <ctype.h>
8:
9: extern char *strchr();
10: extern char *malloc(), *realloc();
11:
12: extern char rootname[];
13:
14: Namemap *exulist, *exglist;
15: static int exuend, exgend;
16: static int exulim, exglim;
17:
18: rdexcept(f)
19: FILE *f;
20: {
21: char line[200]; /* big enough, ignore */
22: char *typ, *arg;
23:
24: while (fgets(line, sizeof(line), f)) {
25: if (crack(line, &typ, &arg) == 0)
26: continue;
27: if (strcmp(typ, "client") == 0
28: && matchclient(arg)) {
29: exclient(f);
30: return (1);
31: }
32: }
33: return (0);
34: }
35:
36: /*
37: * parse one line from the file
38: * return 1 if it looks valid, 0 if not
39: * a valid line has
40: * at least two blank-separated tokens
41: * and does not begin with `#'
42: * the first token is a type,
43: * the second an argument;
44: * pointers to be filled in for each are supplied
45: */
46: crack(line, tp, ap)
47: register char *line;
48: char **tp, **ap;
49: {
50:
51: if (line[0] == '#')
52: return (0);
53: while (isspace(*line))
54: line++;
55: if (line[0] == 0)
56: return (0);
57: *tp = line;
58: while (!isspace(*line))
59: line++;
60: if (line[0] == 0)
61: return (0);
62: *line++ = 0;
63: while (isspace(*line))
64: line++;
65: if (line[0] == 0)
66: return (0);
67: *ap = line;
68: while (*line)
69: line++;
70: if (line[-1] == '\n')
71: line[-1] = 0;
72: return (1);
73: }
74:
75: /*
76: * is this the client section we want?
77: * -- take the first match, and no other
78: */
79: matchclient(cp)
80: char *cp;
81: {
82: if (strcmp(cp, "*") == 0 || strcmp(cp, rfclient) == 0)
83: return (1);
84: return (0);
85: }
86:
87: /*
88: * found the right client section;
89: * stash the info away
90: * we know that only this client section will be examined,
91: * so don't worry about the fact that the
92: * next `client' line in the file may be swallowed
93: */
94: exclient(f)
95: FILE *f;
96: {
97: char line[200]; /* again, big enough */
98: char *typ, *arg;
99:
100: while (fgets(line, sizeof(line), f)) {
101: if (crack(line, &typ, &arg) == 0)
102: continue;
103: if (strcmp(typ, "client") == 0)
104: break; /* end of our section */
105: else if (strcmp(typ, "param") == 0)
106: exparam(arg);
107: else if (strcmp(typ, "uid") == 0)
108: exuid(arg, strchr(arg, '='));
109: else if (strcmp(typ, "gid") == 0)
110: exgid(arg);
111: else if (strcmp(typ, "unknownuser") == 0) {
112: exuid(RFUNKNOWNUSER, arg);
113: rfotherdeny = 1;
114: } else if (strcmp(typ, "unknowngroup") == 0) {
115: } else
116: rflog("unexpected except line: %s %s\n", typ, arg);
117: }
118: }
119:
120: exparam(par)
121: char *par;
122: {
123: register char *val;
124:
125: if (strcmp(par, "root") == 0)
126: strcpy(rootname, val);
127: else if (strcmp(par, "otherok") == 0)
128: rfotherdeny = (*val != '1'); /* 1 means others OK */
129: else
130: rflog("unexpected except param %s=%s\n", par, val);
131: }
132:
133: exuid(arg, val)
134: char *arg, char *val;
135: {
136: register Namemap *p;
137:
138: if (val == 0)
139: return;
140: if (val[0] == '=')
141: *val++ = 0;
142: if (exulist == NULL) {
143: exulim = 10;
144: if ((exulist = (Namemap *)malloc(exulim*sizeof(Namemap))) == NULL)
145: rfpanic("no mem for except uids\n");
146: }
147: if (exuend >= exulim - 1) {
148: exulim += 10;
149: if ((exulist = (Namemap *)realloc((char *)exulist, exulim*sizeof(Namemap))) == NULL)
150: rfpanic("no mem for except uids\n");
151: }
152: p = &exulist[exuend++];
153: strncpy(p->cname, arg, sizeof(p->cname)-1);
154: p->cname[sizeof(p->cname)-1] = 0;
155: strncpy(p->sname, val, sizeof(p->sname)-1);
156: p->sname[sizeof(p->sname)-1] = 0;
157: p[1].cname[0] = 0;
158: }
159:
160: exgid(arg)
161: char *arg;
162: {
163: char *val;
164: register Namemap *p;
165:
166: if ((val = strchr(arg, '=')) == NULL)
167: return; /* may be wrong */
168: *val++ = 0;
169: if (exglist == NULL) {
170: exglim = 10;
171: if ((exglist = (Namemap *)malloc(exglim*sizeof(Namemap))) == NULL)
172: rfpanic("no mem for except uids\n");
173: }
174: if (exgend >= exglim-1) {
175: exglim += 10;
176: if ((exglist = (Namemap *)realloc((char *)exglist, exglim*sizeof(Namemap))) == NULL)
177: rfpanic("no mem for except uids\n");
178: }
179: p = &exglist[exgend++];
180: strncpy(p->cname, arg, sizeof(p->cname)-1);
181: p->cname[sizeof(p->cname)-1] = 0;
182: strncpy(p->sname, val, sizeof(p->sname)-1);
183: p->sname[sizeof(p->sname)-1] = 0;
184: p[1].cname[0] = 0;
185: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.