|
|
1.1 root 1: #
2:
3: #include <stdio.h>
4: #include "udemon.h"
5:
6: char argspec[OPNUM][3] /* required arg types (reverse order) */
7: { /* negative entry = any non-name type */
8: 0, 0, 0, /*OK*/
9: -1, NTYPE, 0, /*DEFINE*/
10: -1, NTYPE, 0, /*REDEFINE*/
11: NTYPE, 0, 0, /*DELETE*/
12: 0, 0, 0, /*spare*/
13: 0, 0, 0, /*EOM*/
14: 0, 0, 0, /*unu gd*/
15: 0, 0, 0, /*XMT*/
16: 0, 0, 0, /*spare*/
17: 0, 0, 0, /*POP*/
18: DTYPE, 0, 0, /*CDIR*/
19: IITYPE, IITYPE, FTYPE, /*CMODE*/
20: XTYPE, FTYPE, 0, /*OPEN*/
21: RTYPE, 0, 0, /*CLOSE*/
22: IITYPE, RTYPE, 0, /*SEEK*/
23: XTYPE, RTYPE, 0, /*READ*/
24: XTYPE, RTYPE, 0, /*WRITE*/
25: XTYPE, RTYPE, 0, /*TRUNCATE*/
26: NTYPE, 0, 0, /*LOGIN*/
27: 0, 0, 0, /*QUIT*/
28: DTYPE, 0, 0, /*LIST*/
29: -1, 0, 0, /*STATUS*/
30: 0, 0, 0, /*TIME*/
31: NTYPE, XTYPE, 0, /*UNIQUE*/
32: RTYPE, 0, 0, /*APPEND*/
33: 0, 0, 0, /*spare*/
34: WTYPE, -1, 0, /*ASSIGN*/
35: NTYPE, XTYPE, 0, /*FCREATE*/
36: NTYPE, 0, 0, /*IF*/
37: 0, 0, 0, /*FI*/
38: IITYPE, 0, 0, /*SKIP*/
39: NTYPE, XTYPE, 0, /*DCREATE*/
40: 0, 0, 0, /*spare*/
41: NTYPE, 0, 0 /*UNLESS*/
42: };
43:
44: char nodef[MAXTYPE] { /*non-zero if type can be used in definition*/
45: 0, 0, 0, 0, 0, 0, 0, 0,
46: 1, 1, 1, 0, 0, 0, 0, 0};
47:
48:
49:
50: deref(xsp)
51: struct sentry *xsp;
52: {
53: register i, r;
54: switch (xsp->s_type){
55: case NTYPE:
56: if (dstat(ncopy(xsp),&entry) < 0)
57: error(EUNDEF,2);
58: xsp->s_type = dcheck(xsp);
59: prt("deref ret %o\n",xsp->s_type);
60: break;
61: case WTYPE:
62: i = xsp->s_val1;
63: if ((i < 0) || (i >= VARNO))
64: error(EWADDR,2);
65: xsp->s_type = wstore[i].s_type;
66: xsp->s_val = wstore[i].s_val;
67: xsp->s_val1 = wstore[i].s_val1;
68: break;
69: case NULL:
70: error(EARGT,6);
71: }
72: }
73:
74:
75: argpush(xsp)
76: struct sentry **xsp;
77: {
78: register struct sentry *pp, *ss;
79:
80: ss = sp++;
81: pp = sp;
82: while (ss != *xsp){
83: pp->s_type = ss->s_type;
84: pp->s_val = ss->s_val;
85: (pp--)->s_val1 = (ss--)->s_val1;
86: }
87: *xsp = pp;
88: }
89:
90:
91:
92: respond(t)
93: char t;
94: {
95: if (t) *rp++ = t;
96: if (send(resp,rp-resp,3))
97: return(1);
98: rp = resp;
99: return(0);
100: }
101:
102:
103:
104: addup(b,n)
105: int n;
106: char *b;
107: {
108: register k,s;
109: register char *p;
110:
111: s=0;
112: p = b;
113: if (n>0){
114: for (k=0; k<n; k++)
115: s =+ p[k];
116: }
117: return(s);
118: }
119:
120:
121: send(p,n,c)
122: char *p;
123: int n,c;
124: {
125: extern timeout();
126: register r;
127:
128: if (c==3) {
129: prt("send ");
130: tprint(p,n);
131: }else
132: prt("send data %d,%d\n",n,c);
133: signal(14,timeout);
134: alarm(30);
135: snstat(fn,&c,0);
136: r = write(fn,p,n);
137: alarm(0);
138: if (r < 0 || panic)
139: return(1);
140: return(0);
141: }
142:
143:
144: timeout()
145: {
146: prt("timeout\n");
147: panic = 1;
148: }
149:
150:
151: recv(b,c)
152: int *c;
153: char *b;
154: {
155: register n;
156: register i;
157: if ((n = read(fn,b,512)) < 0)
158: return(-1);
159: snstat(fn,c,1);
160: if (*c==3) {
161: prt("received ");
162: tprint(b,n);
163: }else
164: prt("received data %d,%d\n",n,*c);
165: if (trace){
166: /*
167: for (i=0; i<n; i++){
168: printf("%3.1o ",b[i]&0377);
169: if ((i&7) == 7 || i == (n-1))
170: printf("\n");
171: }
172: */
173: }
174: return(n);
175: }
176:
177:
178:
179: closeall(){
180: register i;
181:
182: for (i=0; i<OPENS; i++)
183: if (openf[i]) {
184: close(i);
185: openf[i] = 0;
186: }
187: for (i=0; i<VARNO; i++)
188: wstore[i].s_type = 0;
189: }
190:
191:
192: logout()
193: {
194: register g,t;
195: static struct utmp z;
196: long l;
197:
198: login = 0;
199: utmp.u_name[0] = 0;
200: #ifdef ACCT
201: if ((g = open("/tmp/utmp",1)) >= 0){
202: t = utmp.u_tty;
203: if(t >= 'a')
204: t =- 'a' - (10+'0');
205: if((t >= 'A')&&(t<= 'Z'))
206: t = 10 + 'z' - 'a' + 1 + '0' + (t - 'A');
207: l = (t-'0')*16;
208: seek(g, l, 0);
209: if(write(g,&utmp,16)<0){
210: prt("write in utmp failed\n");
211: }
212: close(g);
213: }
214: if((g = open("/usr/adm/wtmp",1)) >= 0){
215: z.u_tty = utmp.u_tty;
216: time(&z.u_time[0]);
217: seek(g,0L,2);
218: write(g,&z,16);
219: close(g);
220: }
221: #endif
222: }
223:
224:
225: /*
226: * data from (fil) , block size (cp).
227: * k = 0 if (cp) not set, = 1 normal, = 2 if directory entry
228: */
229:
230: rcopy(fil,k,cp)
231: {
232: register n, code;
233: long tell();
234: register char *bp;
235:
236: if (respond(READ)) return(1);
237: length = 0;
238: sum = 0;
239: for (;;){
240: n = ((k>0)&&(cp<msiz)) ? cp : msiz;
241: if(trace)
242: printf("com %d %d %d %d\n",n,k,cp,msiz);
243: if(trace)
244: printf("posit %d %O\n",fil,tell(fil));
245: n = read(fil,buf,n);
246: if(trace)
247: printf("read %o %o %o\n",fil,buf,n);
248: if(trace&&((n == 0) || (n<0))){
249: perror("read");
250: printf("n = %d %d %d\n",fil,n,k);
251: }
252: if (n < 0)
253: error(0,6);
254: if (k == 2){
255: if (n != cp) {
256: n=0;
257: code = 4;
258: }else
259: if (buf[0] == 0)
260: continue;
261: else{
262: code = 1;
263: }
264: }else
265: if (k>0){
266: cp =- n;
267: code = (cp==0) ? 2 : ((n==msiz) ? 1 : 4);
268: }else
269: if (k<0) code = (n==0) ? 4 : 1;
270: else
271: code = (n==msiz) ? 1 : 4;
272: length =+ n;
273: sum =+ addup(buf,n);
274: prt("part sum %o %o\n",sum , n);
275: if (send(buf,n,code))
276: return(1);
277: if (code > 1)
278: break;
279: }
280: bp = buf;
281: *bp++ = 'K';
282: *bp++ = (sum >> 8); *bp++ = (sum &0377);
283: *bp++ = (length >> 8); *bp++ = (length&0377);
284: prt("send checksum %o %o\n",sum, length);
285: if(send(buf,5,3) < 0)
286: return(1);
287: prt("checksum ok\n");
288: return(0);
289: }
290:
291: ncopy(p)
292: struct sentry *p;
293: {
294: register i;
295: register char *np;
296:
297: prt("ncopy %o\n",p->s_type);
298: if (p->s_type == NTYPE){
299: np = p->s_val1;
300: prt("Ntype %s\n",np);
301: for (i=0; i<(NSIZ-1); i++){
302: if (*np == 0) break;
303: nbuf[i] = *np++;
304: }
305: nbuf[i] = 0;
306: return(nbuf);
307: }
308: prt("ncopy ret %o\n",p->s_val1);
309: return(p->s_val1);
310: }
311:
312:
313: decimal(v)
314: char *v;
315: {
316: register n, negative;
317: char c;
318:
319: n=0;
320: negative=0;
321: while (c = *v++){
322: if ((n==0) && (c=='-')) {
323: negative=1;
324: continue;
325: }
326: if ((c < '0') || (c > '9')) {
327: mesg("Bad buffer size");
328: exit(EBAD);
329: }
330: n = (n*10) + (c-'0');
331: }
332: if (negative)
333: n = -n;
334: return(n);
335: }
336:
337:
338: dcheck(p){
339: register i;
340:
341: prt("dcheck on %s\n",ncopy(p));
342: if (filstat(ncopy(p),&statbuf) < 0)
343: return(NULL);
344: if (statbuf->type == FFILE)
345: return(FTYPE);
346: if (statbuf->type == DIR)
347: return(DTYPE);
348: return(NULL);
349: }
350: char pbuf[128];
351: getpwentry(uname)
352: char *uname;
353: {
354: char *np,*namep;
355: extern char *copy();
356: int t,f;
357: long l;
358: int i;
359:
360: utmp.u_tty = 'A' + chan;
361: if(getent(uname,pbuf))
362: return(1);
363: np = colon(pbuf);
364: #ifdef ROOT
365: if(*np != ':')
366: return(1);
367: #endif
368: for(i=0;i<8;i++)
369: utmp.u_name[i] = 0;
370: copy(utmp.u_name,pbuf,t = (size(pbuf)>8)?8:size(pbuf));
371: np = colon(np);
372: uid = 0;
373: while (*np != ':')
374: uid = uid*10 + *np++ - '0';
375: #ifndef ROOT
376: if(uid == ROOTUSR) /* disallow root */
377: return(1); /* */
378: #endif
379: np++;
380: np = colon(np); /* skip group id */
381: np = colon(np);
382: namep = np;
383: np = colon(np);
384: prt("dir = %s\n",namep);
385: copy(unixid,namep, t = (size(namep)>8)?8:size(namep));
386: if (chdir(namep)<0) {
387: error(0,9);
388: }
389: time(&utmp.u_time[0]);
390: #ifdef ACCT
391: if ((f = open("/tmp/utmp", 1)) >= 0) {
392: t = utmp.u_tty;
393: if (t>='a')
394: t =- 'a' - (10+'0');
395: if((t >= 'A')&&(t<= 'Z'))
396: t = 10 + 'z' - 'a' + 1 + '0' + (t - 'A');
397: l = (t-'0')*16;
398: seek(f, l, 0);
399: write(f, &utmp, 16);
400: close(f);
401: }
402: if ((f = open("/usr/adm/wtmp", 1)) >= 0) {
403: seek(f, 0L, 2);
404: write(f, &utmp, 16);
405: close(f);
406: }
407: #endif
408: return(0);
409: }
410: char ab[BUFSIZ];
411: getent(name, rbuf)
412: char *name, *rbuf;
413: {
414: int fi, r, c;
415: FILE *ffin;
416: register char *gnp, *rnp;
417:
418: r = 1;
419: if((ffin = fopen(netpwd, "r")) == NULL){
420: prt("Can't open passwd");
421: goto ret;
422:
423: }
424: setbuf(ffin,&ab);
425: loop:
426: gnp = name;
427: rnp = rbuf;
428: while((c=getc(ffin)) != '\n') {
429: if(c == EOF)
430: goto ret;
431:
432: *rnp++ = c;
433: }
434: *rnp++ = '\0';
435: rnp = rbuf;
436: while (*gnp++ == *rnp++);
437: if ((*--gnp!='\0') || *--rnp!=':')
438: goto loop;
439:
440: r = 0;
441: ret:
442: fclose(ffin);
443: return(r);
444: }
445:
446: colon(p)
447: register char *p;
448: {
449:
450: while (*p != ':') {
451: if (*p++ == '\0') {
452: error(EPWD,2);
453: }
454: }
455: *p++ = '\0';
456: return(p);
457: }
458: dstat(p,bp)
459: struct dentry *bp;
460: char *p;
461: {
462: int f;
463:
464: prt("dstat on %s\n",p);
465: bp->d_type = NULL;
466: if((f = open(p,0)) < 0)
467: return(-1);
468: close(f);
469: bp->d_type = NTYPE;
470: return(1);
471: }
472: /*
473: * Copy c characters of q into p
474: */
475: char *copy(p,q,c)
476: register char *p,*q;
477: int c;
478: {
479: register i;
480:
481: for(i=0;i<c;i++){
482: *p++ = *q++;
483: }
484: return(c);
485: }
486: /*
487: * Length of string
488: */
489: size(s)
490: register char *s;
491: {
492: register i;
493:
494: i = 0;
495: while(*s++ != '\0')
496: i++;
497: return(i);
498: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.