|
|
1.1 root 1: static char *sccsid = "@(#)files.c 4.20 (Berkeley) 90/02/20";
2: #include <fcntl.h>
3:
4: /* UNIX DEPENDENT PROCEDURES */
5:
6:
7: /* DEFAULT RULES FOR UNIX */
8:
9: char *builtin[] =
10: {
11: #ifdef pwb
12: ".SUFFIXES : .L .out .o .c .f .e .r .y .yr .ye .l .s .z .x .t .h .cl",
13: #else
14: ".SUFFIXES : .out .o .c .F .f .e .r .y .yr .ye .l .s .cl .p .8 .7 .6 .5 .4 .3 .2 .1 .0",
15: #endif
16: "YACC=yacc",
17: "YACCR=yacc -r",
18: "YACCE=yacc -e",
19: "YFLAGS=",
20: "LEX=lex",
21: "LFLAGS=",
22: "CC=cc",
23: "CPP=cpp",
24: #if defined(vax) || defined(sun) || defined(tahoe)
25: "AS=as",
26: #else
27: "AS=as -",
28: #endif
29: "PC=pc",
30: "PFLAGS=",
31: "CFLAGS=",
32: "RC=f77",
33: "RFLAGS=",
34: "FC=f77",
35: "EFLAGS=",
36: "FFLAGS=",
37: "LOADLIBES=",
38: "NROFF=nroff",
39: #ifdef pwb
40: "SCOMP=scomp",
41: "SCFLAGS=",
42: "CMDICT=cmdict",
43: "CMFLAGS=",
44: #endif
45:
46: ".c.o :",
47: "\t$(CC) $(CFLAGS) -c $<",
48:
49: ".p.o :",
50: "\t$(PC) $(PFLAGS) -c $<",
51:
52: ".cl.o :",
53: "\tclass -c $<",
54:
55: ".e.o .r.o .F.o .f.o :",
56: "\t$(FC) $(RFLAGS) $(EFLAGS) $(FFLAGS) -c $<",
57:
58: ".s.o :",
59: "\t$(AS) -o $@ $<",
60:
61: ".y.o :",
62: "\t$(YACC) $(YFLAGS) $<",
63: "\t$(CC) $(CFLAGS) -c y.tab.c",
64: "\trm y.tab.c",
65: "\tmv y.tab.o $@",
66:
67: ".yr.o:",
68: "\t$(YACCR) $(YFLAGS) $<",
69: "\t$(RC) $(RFLAGS) -c y.tab.r",
70: "\trm y.tab.r",
71: "\tmv y.tab.o $@",
72:
73: ".ye.o :",
74: "\t$(YACCE) $(YFLAGS) $<",
75: "\t$(EC) $(RFLAGS) -c y.tab.e",
76: "\trm y.tab.e",
77: "\tmv y.tab.o $@",
78:
79: ".l.o :",
80: "\t$(LEX) $(LFLAGS) $<",
81: "\t$(CC) $(CFLAGS) -c lex.yy.c",
82: "\trm lex.yy.c",
83: "\tmv lex.yy.o $@",
84:
85: ".y.c :",
86: "\t$(YACC) $(YFLAGS) $<",
87: "\tmv y.tab.c $@",
88:
89: ".l.c :",
90: "\t$(LEX) $(LFLAGS) $<",
91: "\tmv lex.yy.c $@",
92:
93: ".yr.r:",
94: "\t$(YACCR) $(YFLAGS) $<",
95: "\tmv y.tab.r $@",
96:
97: ".ye.e :",
98: "\t$(YACCE) $(YFLAGS) $<",
99: "\tmv y.tab.e $@",
100:
101: #ifdef pwb
102: ".o.L .c.L .t.L:",
103: "\t$(SCOMP) $(SCFLAGS) $<",
104:
105: ".t.o:",
106: "\t$(SCOMP) $(SCFLAGS) -c $<",
107:
108: ".t.c:",
109: "\t$(SCOMP) $(SCFLAGS) -t $<",
110:
111: ".h.z .t.z:",
112: "\t$(CMDICT) $(CMFLAGS) $<",
113:
114: ".h.x .t.x:",
115: "\t$(CMDICT) $(CMFLAGS) -c $<",
116: #endif
117:
118: ".s.out .c.out .o.out :",
119: "\t$(CC) $(CFLAGS) $< $(LOADLIBES) -o $@",
120:
121: ".f.out .F.out .r.out .e.out :",
122: "\t$(FC) $(EFLAGS) $(RFLAGS) $(FFLAGS) $< $(LOADLIBES) -o $@",
123: "\t-rm $*.o",
124:
125: ".y.out :",
126: "\t$(YACC) $(YFLAGS) $<",
127: "\t$(CC) $(CFLAGS) y.tab.c $(LOADLIBES) -ly -o $@",
128: "\trm y.tab.c",
129:
130: ".l.out :",
131: "\t$(LEX) $(LFLAGS) $<",
132: "\t$(CC) $(CFLAGS) lex.yy.c $(LOADLIBES) -ll -o $@",
133: "\trm lex.yy.c",
134:
135: ".8.0 :",
136: "\t$(NROFF) -man -h $< > $@",
137:
138: ".7.0 :",
139: "\t$(NROFF) -man -h $< > $@",
140:
141: ".6.0 :",
142: "\t$(NROFF) -man -h $< > $@",
143:
144: ".5.0 :",
145: "\t$(NROFF) -man -h $< > $@",
146:
147: ".4.0 :",
148: "\t$(NROFF) -man -h $< > $@",
149:
150: ".3.0 :",
151: "\t$(NROFF) -man -h $< > $@",
152:
153: ".2.0 :",
154: "\t$(NROFF) -man -h $< > $@",
155:
156: ".1.0 :",
157: "\t$(NROFF) -man -h $< > $@",
158:
159: 0 };
160:
161: #include "defs"
162: #include <sys/stat.h>
163:
164:
165:
166: TIMETYPE
167: exists(pname)
168: struct nameblock *pname;
169: {
170: struct stat buf;
171: register char *s, *filename;
172: TIMETYPE lookarch();
173: extern char *findfl();
174:
175: filename = pname->namep;
176:
177: for(s = filename ; *s!='\0' && *s!='(' ; ++s)
178: ;
179:
180: if(*s == '(')
181: return(lookarch(filename));
182:
183: if (stat(filename, &buf) < 0)
184: {
185: s = findfl(filename);
186: if(s != (char *)-1)
187: {
188: pname->alias = copys(s);
189: if(stat(pname->alias, &buf) == 0)
190: return(buf.st_mtime);
191: }
192: return(0);
193: }
194: else return(buf.st_mtime);
195: }
196:
197:
198: TIMETYPE prestime()
199: {
200: TIMETYPE t;
201: time(&t);
202: return(t);
203: }
204:
205:
206:
207: FSTATIC char nbuf[MAXNAMLEN + 1];
208: FSTATIC char *nbufend = &nbuf[MAXNAMLEN];
209:
210:
211:
212: struct depblock *srchdir(pat, mkchain, nextdbl)
213: register char *pat; /* pattern to be matched in directory */
214: int mkchain; /* nonzero if results to be remembered */
215: struct depblock *nextdbl; /* final value for chain */
216: {
217: DIR *dirf;
218: register int i;
219: int nread, cldir;
220: char *dirname, *dirpref, *endir, *filepat, *p, temp[BUFSIZ];
221: char fullname[BUFSIZ], *p1, *p2;
222: struct nameblock *q;
223: struct depblock *thisdbl;
224: struct dirhdr *od;
225: struct pattern *patp;
226: struct varblock *cp, *varptr();
227: char *path, pth[BUFSIZ], *strcpy();
228: struct dirent *dptr;
229:
230:
231: thisdbl = 0;
232:
233: if(mkchain == NO)
234: for(patp=firstpat ; patp ; patp = patp->nxtpattern)
235: if(! unequal(pat, patp->patval)) return(0);
236:
237: patp = ALLOC(pattern);
238: patp->nxtpattern = firstpat;
239: firstpat = patp;
240: patp->patval = copys(pat);
241:
242: endir = 0;
243:
244: for(p=pat; *p!='\0'; ++p)
245: if(*p=='/') endir = p;
246:
247: if(endir==0)
248: {
249: dirpref = "";
250: filepat = pat;
251: cp = varptr("VPATH");
252: if (cp->varval == NULL) path = ".";
253: else {
254: path = pth;
255: *path = '\0';
256: if (strncmp(cp->varval, ".:", 2) != 0) strcpy(pth,".:");
257: strcat(pth, cp->varval);
258: }
259: }
260: else {
261: *endir = '\0';
262: path = strcpy(pth, pat);
263: dirpref = concat(pat, "/", temp);
264: filepat = endir+1;
265: }
266:
267: while (*path) { /* Loop thru each VPATH directory */
268: dirname = path;
269: for (; *path; path++)
270: if (*path == ':') {
271: *path++ = '\0';
272: break;
273: }
274:
275: dirf = NULL;
276: cldir = NO;
277:
278: for(od = firstod; od; od = od->nxtopendir)
279: if(! unequal(dirname, od->dirn) )
280: {
281: dirf = od->dirfc;
282: if (dirf != NULL)
283: rewinddir(dirf); /* start over at the beginning */
284: break;
285: }
286:
287: if(dirf == NULL)
288: {
289: dirf = opendir(dirname);
290: if(nopdir >= MAXDIR)
291: cldir = YES;
292: else {
293: ++nopdir;
294: od = ALLOC(dirhdr);
295: od->nxtopendir = firstod;
296: firstod = od;
297: od->dirfc = dirf;
298: od->dirn = copys(dirname);
299: fcntl(dirfd(dirf), F_SETFD, 1);
300: }
301: }
302:
303: if(dirf == NULL)
304: {
305: fprintf(stderr, "Directory %s: ", dirname);
306: fatal("Cannot open");
307: }
308:
309: else for (dptr = readdir(dirf); dptr != NULL; dptr = readdir(dirf))
310: {
311: p1 = dptr->d_name;
312: p2 = nbuf;
313: while( (p2<nbufend) && (*p2++ = *p1++)!='\0' )
314: /* void */;
315: if( amatch(nbuf,filepat) )
316: {
317: concat(dirpref,nbuf,fullname);
318: if( (q=srchname(fullname)) ==0)
319: q = makename(copys(fullname));
320: if(mkchain)
321: {
322: thisdbl = ALLOC(depblock);
323: thisdbl->nxtdepblock = nextdbl;
324: thisdbl->depname = q;
325: nextdbl = thisdbl;
326: }
327: }
328: }
329:
330: if(endir != 0) *endir = '/';
331:
332: if(cldir) {
333: closedir(dirf);
334: dirf = NULL;
335: }
336: } /* End of VPATH loop */
337: return(thisdbl);
338: }
339:
340: /* stolen from glob through find */
341:
342: static amatch(s, p)
343: char *s, *p;
344: {
345: register int cc, scc, k;
346: int c, lc;
347:
348: scc = *s;
349: lc = 077777;
350: switch (c = *p) {
351:
352: case '[':
353: k = 0;
354: while (cc = *++p) {
355: switch (cc) {
356:
357: case ']':
358: if (k)
359: return(amatch(++s, ++p));
360: else
361: return(0);
362:
363: case '-':
364: k |= (lc <= scc) & (scc <= (cc=p[1]) ) ;
365: }
366: if (scc==(lc=cc)) k++;
367: }
368: return(0);
369:
370: case '?':
371: caseq:
372: if(scc) return(amatch(++s, ++p));
373: return(0);
374: case '*':
375: return(umatch(s, ++p));
376: case 0:
377: return(!scc);
378: }
379: if (c==scc) goto caseq;
380: return(0);
381: }
382:
383: static umatch(s, p)
384: char *s, *p;
385: {
386: if(*p==0) return(1);
387: while(*s)
388: if (amatch(s++,p)) return(1);
389: return(0);
390: }
391:
392: #ifdef METERFILE
393: #include <pwd.h>
394: int meteron = 0; /* default: metering off */
395:
396: meter(file)
397: char *file;
398: {
399: TIMETYPE tvec;
400: char *p, *ctime();
401: FILE * mout;
402: struct passwd *pwd, *getpwuid();
403:
404: if(file==0 || meteron==0) return;
405:
406: pwd = getpwuid(getuid());
407:
408: time(&tvec);
409:
410: if( (mout=fopen(file,"a")) != NULL )
411: {
412: p = ctime(&tvec);
413: p[16] = '\0';
414: fprintf(mout,"User %s, %s\n",pwd->pw_name,p+4);
415: fclose(mout);
416: }
417: }
418: #endif
419:
420:
421: /* look inside archives for notations a(b) and a((b))
422: a(b) is file member b in archive a
423: a((b)) is entry point _b in object archive a
424: */
425:
426: #ifdef ASCARCH
427: # include <ar.h>
428: #else
429: # include <ar.h>
430: #endif
431: #include <a.out.h>
432:
433: static long arflen;
434: static long arfdate;
435: static char arfname[16];
436: FILE *arfd;
437: long int arpos, arlen;
438:
439: static struct exec objhead;
440:
441: static struct nlist objentry;
442:
443:
444: TIMETYPE lookarch(filename)
445: char *filename;
446: {
447: char *p, *q, *send, s[MAXNAMLEN + 1];
448: int i, nc, nsym, objarch;
449:
450: for(p = filename; *p!= '(' ; ++p)
451: ;
452: *p = '\0';
453: openarch(filename);
454: *p++ = '(';
455:
456: if(*p == '(')
457: {
458: objarch = YES;
459: nc = 8;
460: ++p;
461: }
462: else
463: {
464: objarch = NO;
465: nc = MAXNAMLEN;
466: }
467: send = s + nc;
468:
469: for( q = s ; q<send && *p!='\0' && *p!=')' ; *q++ = *p++ )
470: ;
471: while(q < send)
472: *q++ = '\0';
473: while(getarch())
474: {
475: if(objarch)
476: {
477: getobj();
478: nsym = objhead.a_syms / sizeof(objentry);
479: for(i = 0; i<nsym ; ++i)
480: {
481: fread( (char *) &objentry, sizeof(objentry),1,arfd);
482: if( (objentry.n_type & N_EXT)
483: && ((objentry.n_type & ~N_EXT) || objentry.n_value)
484: && eqstr(objentry.n_un.n_name,s,nc))
485: {
486: clarch();
487: return(arfdate);
488: }
489: }
490: }
491:
492: else if( eqstr(arfname, s, nc))
493: {
494: clarch();
495: return(arfdate);
496: }
497: }
498:
499: clarch();
500: return( 0L);
501: }
502:
503:
504: clarch()
505: {
506: fclose( arfd );
507: }
508:
509:
510: openarch(f)
511: register char *f;
512: {
513: #ifdef ASCARCH
514: char magic[SARMAG];
515: #endif
516: int word;
517: #include <sys/stat.h>
518: struct stat buf;
519:
520: stat(f, &buf);
521: arlen = buf.st_size;
522:
523: arfd = fopen(f, "r");
524: if(arfd == NULL)
525: fatal1("cannot open %s", f);
526:
527: fread( (char *) &word, sizeof(word), 1, arfd);
528: #ifdef ASCARCH
529: fseek(arfd, 0L, 0);
530: fread(magic, SARMAG, 1, arfd);
531: arpos = SARMAG;
532: if( ! eqstr(magic, ARMAG, SARMAG) )
533: #else
534: arpos = sizeof(word);
535: if(word != ARMAG)
536: #endif
537: fatal1("%s is not an archive", f);
538:
539: arflen = 0;
540: }
541:
542:
543:
544: getarch()
545: {
546: struct ar_hdr arhead;
547: long atol();
548:
549: arpos += (arflen + 1) & ~1L; /* round archived file length up to even */
550: if(arpos >= arlen)
551: return(0);
552: fseek(arfd, arpos, 0);
553:
554: fread( (char *) &arhead, sizeof(arhead), 1, arfd);
555: arpos += sizeof(arhead);
556: #ifdef ASCARCH
557: arflen = atol(arhead.ar_size);
558: arfdate = atol(arhead.ar_date);
559: #else
560: arflen = arhead.ar_size;
561: arfdate = arhead.ar_date;
562: #endif
563: strncpy(arfname, arhead.ar_name, sizeof(arhead.ar_name));
564: return(1);
565: }
566:
567:
568: getobj()
569: {
570: long int skip;
571:
572: fread( (char *) &objhead, sizeof(objhead), 1, arfd);
573: if (N_BADMAG(objhead))
574: fatal1("%s is not an object module", arfname);
575: skip = objhead.a_text + objhead.a_data;
576: #ifndef pdp11
577: skip += objhead.a_trsize + objhead.a_drsize;
578: #else
579: if(! objhead.a_flag )
580: skip *= 2;
581: #endif
582: fseek(arfd, skip, 1);
583: }
584:
585:
586: eqstr(a,b,n)
587: register char *a, *b;
588: int n;
589: {
590: register int i;
591: for(i = 0 ; i < n ; ++i)
592: if(*a++ != *b++)
593: return(NO);
594: return(YES);
595: }
596:
597:
598: /*
599: * findfl(name) (like execvp, but does path search and finds files)
600: */
601: static char fname[128];
602:
603: char *execat();
604:
605: char *findfl(name)
606: register char *name;
607: {
608: register char *p;
609: register struct varblock *cp;
610: struct stat buf;
611: struct varblock *varptr();
612:
613: for (p = name; *p; p++)
614: if(*p == '/') return(name);
615:
616: cp = varptr("VPATH");
617: if(cp->varval == NULL || *cp->varval == 0)
618: p = ":";
619: else
620: p = cp->varval;
621:
622: do
623: {
624: p = execat(p, name, fname);
625: if(stat(fname,&buf) >= 0)
626: return(fname);
627: } while (p);
628: return((char *)-1);
629: }
630:
631: char *execat(s1, s2, si)
632: register char *s1, *s2;
633: char *si;
634: {
635: register char *s;
636:
637: s = si;
638: while (*s1 && *s1 != ':' && *s1 != '-')
639: *s++ = *s1++;
640: if (si != s)
641: *s++ = '/';
642: while (*s2)
643: *s++ = *s2++;
644: *s = '\0';
645: return(*s1? ++s1: 0);
646: }
647:
648:
649: /* copy s to d, changing file names to file aliases */
650: fixname(s, d)
651: char *s, *d;
652: {
653: register char *r, *q;
654: struct nameblock *pn;
655: char name[BUFSIZ];
656:
657: while (*s) {
658: if (isspace(*s)) *d++ = *s++;
659: else {
660: r = name;
661: while (*s) {
662: if (isspace(*s)) break;
663: *r++ = *s++;
664: }
665: *r = '\0';
666:
667: if (((pn = srchname(name)) != 0) && (pn->alias))
668: q = pn->alias;
669: else q = name;
670:
671: while (*q) *d++ = *q++;
672: }
673: }
674: *d = '\0';
675: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.