|
|
1.1 root 1: #include "parms.h"
2: #include "structs.h"
3:
4: #ifdef RCSIDENT
5: static char rcsid[] = "$Header: acssort.c,v 1.7 85/01/18 15:40:40 notes Rel $";
6: #endif RCSIDENT
7:
8: /*
9: * acssort
10: *
11: * Routines in this file are used to sort access lists.
12: * Splintered off from access.c so that nfaccess.c can use
13: * them.
14: *
15: * Also contains routines to add entries to an access list
16: * and to parse an ascii representation of an access right.
17: *
18: * Ray Essick
19: */
20:
21:
22: acscmp (a, b)
23: struct perm_f *a,
24: *b;
25: {
26: /*
27: * people before groups before systems
28: * Alphabetical within each class
29: */
30: if (a -> ptype < b -> ptype)
31: return (-1);
32: if (a -> ptype > b -> ptype)
33: return 1;
34: if (strcmp ("Other", a -> name) == 0)
35: if (strcmp ("Other", b -> name) == 0)
36: return 0;
37: else
38: return 1; /* put "Other" last */
39: if (strcmp ("Other", b -> name) == 0)
40: return (-1); /* is correct */
41: return strcmp (a -> name, b -> name);
42: }
43:
44: /*
45: * acssort
46: *
47: * sort the access list
48: */
49:
50: acssort (alist, items)
51: struct perm_f alist[];
52: int items;
53: {
54: qsort (alist, items, sizeof (struct perm_f), acscmp);
55: }
56: /*
57: * addmodes(io) struct io_f *io;
58: *
59: * reads the access list and adds the modes specified in the
60: * Newmodes array.
61: * Checks for duplication and merely replaces with the new
62: * permission in those cases.
63: */
64:
65: addmodes (io, nmodes, Newmodes, verbose)
66: struct io_f *io;
67: int nmodes;
68: struct perm_f *Newmodes;
69: int verbose;
70: {
71: struct perm_f alist[NPERMS];
72: int pcount; /* items in list */
73: FILE * acs;
74: int i,
75: j;
76: char fn[WDLEN]; /* hold a filename */
77:
78: sprintf (fn, "%s/%s/%s", io -> basedir, io -> nf, ACCESS);
79: x ((acs = fopen (fn, "r")) == NULL, "addmode: no access list");
80: x ((pcount = fread (alist, sizeof (struct perm_f), NPERMS, acs)) == 0, "addmode: empty access list");
81: fclose (acs);
82:
83: for (i = 0; i < nmodes; i++) /* for each mode */
84: {
85: for (j = 0; j < pcount; j++) /* look for match */
86: if (Newmodes[i].ptype == alist[j].ptype &&
87: strcmp (Newmodes[i].name, alist[j].name) == 0)
88: break; /* match */
89: if (j == pcount) /* wasn't there */
90: {
91: if (pcount == NPERMS)
92: {
93: if (verbose)
94: printf ("%s: access list full\n", io -> nf);
95: break;
96: }
97: alist[pcount].ptype = Newmodes[i].ptype;
98: alist[pcount].perms = Newmodes[i].perms;
99: strcpy (alist[pcount].name, Newmodes[i].name);
100: pcount++;
101: }
102: else /* update existing one */
103: {
104: alist[j].perms = Newmodes[i].perms;
105: if (verbose)
106: printf ("%s: replaced extant permission for %s\n",
107: io -> nf, Newmodes[i].name);
108: }
109: }
110: /*
111: * replace the access list
112: */
113:
114: acssort (alist, pcount);
115: x ((acs = fopen (fn, "w")) == NULL, "addmodes: can't write access list");
116: x (fwrite (alist, sizeof (struct perm_f), pcount, acs) != pcount, "addmodes: writing access");
117: fclose (acs);
118: }
119:
120: /*
121: * parsemode
122: *
123: * Parse the supplied (character string) access specification
124: * into the specified perm_f structure.
125: *
126: * Ray Essick
127: */
128:
129: parsemode (asciimode, pstuff, verbose)
130: char *asciimode;
131: struct perm_f *pstuff;
132: int verbose;
133: {
134: char *p;
135: char name[WDLEN]; /* hold the name */
136: char namespec[WDLEN]; /* entire name */
137: int nametype; /* name class */
138: char mode[WDLEN]; /* and the mode */
139: char imode = 0; /* internalized */
140:
141:
142: if ((p = index (asciimode, '=')) == NULL) /* find the mode */
143: {
144: if (verbose)
145: printf ("No mode separator: %s\n", asciimode);
146: return (1);
147: }
148:
149: *p++ = '\0'; /* split out mode */
150: strcpy (mode, p); /* grab mode */
151: strcpy (namespec, asciimode); /* and name */
152: *--p = '='; /* replace marker */
153:
154:
155: if ((p = index (namespec, ':')) == NULL) /* implicitly user? */
156: {
157: strcpy (name, namespec); /* user name */
158: nametype = PERMUSER; /* default to user */
159: }
160: else
161: {
162: *p++ = '\0'; /* break specification */
163: strcpy (name, p); /* load name */
164: switch (namespec[0]) /* determine class */
165: {
166: case 'u':
167: case 'U':
168: nametype = PERMUSER;
169: break;
170:
171: case 'g':
172: case 'G':
173: nametype = PERMGROUP;
174: break;
175:
176: case 's':
177: case 'S':
178: nametype = PERMSYSTEM;
179: break;
180:
181: default:
182: if (verbose)
183: printf ("Invalid name class: %s\n", namespec);
184: return (1);
185: break;
186: }
187:
188: }
189: /*
190: * Check that user/group are defined on our system. Don't
191: * want to be filling our tables with bogus stuff.
192: */
193:
194: switch (nametype)
195: {
196: case PERMUSER:
197: if (getpwnam (name) == NULL) /* does he exist? */
198: {
199: if (verbose)
200: printf ("%s: no such user\n", name);
201: return (1);
202: }
203: break;
204:
205: case PERMGROUP:
206: if (getgrnam (name) == NULL) /* does it exist */
207: {
208: if (verbose)
209: printf ("%s: no such group\n", name);
210: return (1);
211: }
212: break;
213:
214: case PERMSYSTEM:
215: default:
216: break;
217: }
218:
219: /*
220: * Now internalize the mode
221: */
222:
223: imode = 0; /* initially null */
224: for (p = mode; *p; p++) /* each specifier */
225: {
226: switch (*p)
227: {
228: case 'd': /* director */
229: imode = DRCTOK + READOK + WRITOK + RESPOK;
230: break;
231: case 'r': /* read */
232: imode |= READOK;
233: break;
234: case 'w': /* write (and respond) */
235: imode |= WRITOK + RESPOK;
236: break;
237: case 'a': /* respond */
238: imode |= RESPOK;
239: break;
240: case 'n': /* nullify */
241: imode = 0;
242: break;
243: default:
244: if (verbose)
245: printf ("%c: Invalid permission mode\n", *p);
246: break;
247: }
248:
249: }
250: pstuff -> ptype = nametype; /* load structure */
251: pstuff -> perms = imode;
252: strcpy (pstuff -> name, name);
253: return 0;
254: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.