1*6178Ssam static char *sccsid = "@(#)files.c 4.3 (Berkeley) 82/03/14"; 22805Swnj /* UNIX DEPENDENT PROCEDURES */ 32805Swnj 42805Swnj 52805Swnj /* DEFAULT RULES FOR UNIX */ 62805Swnj 72805Swnj char *builtin[] = 82805Swnj { 92805Swnj #ifdef pwb 102805Swnj ".SUFFIXES : .L .out .o .c .f .e .r .y .yr .ye .l .s .z .x .t .h .cl", 112805Swnj #else 122805Swnj ".SUFFIXES : .out .o .c .f .e .r .y .yr .ye .l .s .cl .p", 132805Swnj #endif 142805Swnj "YACC=yacc", 152805Swnj "YACCR=yacc -r", 162805Swnj "YACCE=yacc -e", 172805Swnj "YFLAGS=", 182805Swnj "LEX=lex", 192805Swnj "LFLAGS=", 202805Swnj "CC=cc", 212805Swnj #ifdef vax 222805Swnj "AS=as", 232805Swnj #else 242805Swnj "AS=as -", 252805Swnj #endif 262805Swnj "PC=pc", 272805Swnj "PFLAGS=", 282805Swnj "CFLAGS=", 292805Swnj "RC=f77", 302805Swnj "RFLAGS=", 312811Swnj "FC=f77", 322805Swnj "EFLAGS=", 332805Swnj "FFLAGS=", 342805Swnj "LOADLIBES=", 352805Swnj #ifdef pwb 362805Swnj "SCOMP=scomp", 372805Swnj "SCFLAGS=", 382805Swnj "CMDICT=cmdict", 392805Swnj "CMFLAGS=", 402805Swnj #endif 412805Swnj 422805Swnj ".c.o :", 432805Swnj "\t$(CC) $(CFLAGS) -c $<", 442805Swnj 452805Swnj ".p.o :", 462805Swnj "\t$(PC) $(PFLAGS) -c $<", 472805Swnj 482805Swnj ".cl.o :", 492805Swnj "\tclass -c $<", 502805Swnj 512805Swnj ".e.o .r.o .f.o :", 522805Swnj "\t$(FC) $(RFLAGS) $(EFLAGS) $(FFLAGS) -c $<", 532805Swnj 542805Swnj ".s.o :", 552805Swnj "\t$(AS) -o $@ $<", 562805Swnj 572805Swnj ".y.o :", 582805Swnj "\t$(YACC) $(YFLAGS) $<", 592805Swnj "\t$(CC) $(CFLAGS) -c y.tab.c", 602805Swnj "\trm y.tab.c", 612805Swnj "\tmv y.tab.o $@", 622805Swnj 632805Swnj ".yr.o:", 642805Swnj "\t$(YACCR) $(YFLAGS) $<", 652805Swnj "\t$(RC) $(RFLAGS) -c y.tab.r", 662805Swnj "\trm y.tab.r", 672805Swnj "\tmv y.tab.o $@", 682805Swnj 692805Swnj ".ye.o :", 702805Swnj "\t$(YACCE) $(YFLAGS) $<", 712805Swnj "\t$(EC) $(RFLAGS) -c y.tab.e", 722805Swnj "\trm y.tab.e", 732805Swnj "\tmv y.tab.o $@", 742805Swnj 752805Swnj ".l.o :", 762805Swnj "\t$(LEX) $(LFLAGS) $<", 772805Swnj "\t$(CC) $(CFLAGS) -c lex.yy.c", 782805Swnj "\trm lex.yy.c", 792805Swnj "\tmv lex.yy.o $@", 802805Swnj 812805Swnj ".y.c :", 822805Swnj "\t$(YACC) $(YFLAGS) $<", 832805Swnj "\tmv y.tab.c $@", 842805Swnj 852805Swnj ".l.c :", 862805Swnj "\t$(LEX) $(LFLAGS) $<", 872805Swnj "\tmv lex.yy.c $@", 882805Swnj 892805Swnj ".yr.r:", 902805Swnj "\t$(YACCR) $(YFLAGS) $<", 912805Swnj "\tmv y.tab.r $@", 922805Swnj 932805Swnj ".ye.e :", 942805Swnj "\t$(YACCE) $(YFLAGS) $<", 952805Swnj "\tmv y.tab.e $@", 962805Swnj 972805Swnj #ifdef pwb 982805Swnj ".o.L .c.L .t.L:", 992805Swnj "\t$(SCOMP) $(SCFLAGS) $<", 1002805Swnj 1012805Swnj ".t.o:", 1022805Swnj "\t$(SCOMP) $(SCFLAGS) -c $<", 1032805Swnj 1042805Swnj ".t.c:", 1052805Swnj "\t$(SCOMP) $(SCFLAGS) -t $<", 1062805Swnj 1072805Swnj ".h.z .t.z:", 1082805Swnj "\t$(CMDICT) $(CMFLAGS) $<", 1092805Swnj 1102805Swnj ".h.x .t.x:", 1112805Swnj "\t$(CMDICT) $(CMFLAGS) -c $<", 1122805Swnj #endif 1132805Swnj 1142805Swnj ".s.out .c.out .o.out :", 1152805Swnj "\t$(CC) $(CFLAGS) $< $(LOADLIBES) -o $@", 1162805Swnj 1172805Swnj ".f.out .r.out .e.out :", 1182805Swnj "\t$(FC) $(EFLAGS) $(RFLAGS) $(FFLAGS) $< $(LOADLIBES) -o $@", 1192805Swnj "\t-rm $*.o", 1202805Swnj 1212805Swnj ".y.out :", 1222805Swnj "\t$(YACC) $(YFLAGS) $<", 1232805Swnj "\t$(CC) $(CFLAGS) y.tab.c $(LOADLIBES) -ly -o $@", 1242805Swnj "\trm y.tab.c", 1252805Swnj 1262805Swnj ".l.out :", 1272805Swnj "\t$(LEX) $(LFLAGS) $<", 1282805Swnj "\t$(CC) $(CFLAGS) lex.yy.c $(LOADLIBES) -ll -o $@", 1292805Swnj "\trm lex.yy.c", 1302805Swnj 1312805Swnj 0 }; 1322805Swnj 1332805Swnj #include "defs" 1342805Swnj #include <sys/types.h> 1352805Swnj 1362805Swnj 1372805Swnj TIMETYPE exists(filename) 1382805Swnj char *filename; 1392805Swnj { 1402805Swnj #include <sys/stat.h> 1412805Swnj struct stat buf; 1422805Swnj register char *s; 1432805Swnj TIMETYPE lookarch(); 1442805Swnj 1452805Swnj for(s = filename ; *s!='\0' && *s!='(' ; ++s) 1462805Swnj ; 1472805Swnj 1482805Swnj if(*s == '(') 1492805Swnj return(lookarch(filename)); 1502805Swnj 151*6178Ssam #if vax 152*6178Ssam if (lstat(filename, &buf) < 0) 153*6178Ssam #else 1542805Swnj if(stat(filename,&buf) < 0) 155*6178Ssam #endif 1562805Swnj return(0); 1572805Swnj else return(buf.st_mtime); 1582805Swnj } 1592805Swnj 1602805Swnj 1612805Swnj TIMETYPE prestime() 1622805Swnj { 1632805Swnj TIMETYPE t; 1642805Swnj time(&t); 1652805Swnj return(t); 1662805Swnj } 1672805Swnj 1682805Swnj 1692805Swnj 1702805Swnj #include <sys/dir.h> 1712805Swnj FSTATIC char n15[15]; 1722805Swnj FSTATIC char *n15end = &n15[14]; 1732805Swnj 1742805Swnj 1752805Swnj 1762805Swnj struct depblock *srchdir(pat, mkchain, nextdbl) 1772805Swnj register char *pat; /* pattern to be matched in directory */ 1782805Swnj int mkchain; /* nonzero if results to be remembered */ 1792805Swnj struct depblock *nextdbl; /* final value for chain */ 1802805Swnj { 1812805Swnj FILE * dirf; 1822805Swnj register int i; 1832805Swnj int nread, cldir; 1842805Swnj char *dirname, *dirpref, *endir, *filepat, *p, temp[100]; 1852805Swnj char fullname[100], *p1, *p2; 1862805Swnj struct nameblock *q; 1872805Swnj struct depblock *thisdbl; 1882805Swnj struct opendir *od; 1892805Swnj struct pattern *patp; 1902805Swnj 1912805Swnj struct direct entry[32]; 1922805Swnj 1932805Swnj 1942805Swnj thisdbl = 0; 1952805Swnj 1962805Swnj if(mkchain == NO) 1972805Swnj for(patp=firstpat ; patp ; patp = patp->nxtpattern) 1982805Swnj if(! unequal(pat, patp->patval)) return(0); 1992805Swnj 2002805Swnj patp = ALLOC(pattern); 2012805Swnj patp->nxtpattern = firstpat; 2022805Swnj firstpat = patp; 2032805Swnj patp->patval = copys(pat); 2042805Swnj 2052805Swnj endir = 0; 2062805Swnj 2072805Swnj for(p=pat; *p!='\0'; ++p) 2082805Swnj if(*p=='/') endir = p; 2092805Swnj 2102805Swnj if(endir==0) 2112805Swnj { 2122805Swnj dirname = "."; 2132805Swnj dirpref = ""; 2142805Swnj filepat = pat; 2152805Swnj } 2162805Swnj else { 2172805Swnj dirname = pat; 2182805Swnj *endir = '\0'; 2192805Swnj dirpref = concat(dirname, "/", temp); 2202805Swnj filepat = endir+1; 2212805Swnj } 2222805Swnj 2232805Swnj dirf = NULL; 2242805Swnj cldir = NO; 2252805Swnj 2262805Swnj for(od = firstod; od; od = od->nxtopendir) 2272805Swnj if(! unequal(dirname, od->dirn) ) 2282805Swnj { 2292805Swnj dirf = od->dirfc; 2302805Swnj fseek(dirf, 0L, 0); /* start over at the beginning */ 2312805Swnj break; 2322805Swnj } 2332805Swnj 2342805Swnj if(dirf == NULL) 2352805Swnj { 2362805Swnj dirf = fopen(dirname, "r"); 2372805Swnj if(nopdir >= MAXDIR) 2382805Swnj cldir = YES; 2392805Swnj else { 2402805Swnj ++nopdir; 2412805Swnj od = ALLOC(opendir); 2422805Swnj od->nxtopendir = firstod; 2432805Swnj firstod = od; 2442805Swnj od->dirfc = dirf; 2452805Swnj od->dirn = copys(dirname); 2462805Swnj } 2472805Swnj } 2482805Swnj 2492805Swnj if(dirf == NULL) 2502805Swnj { 2512805Swnj fprintf(stderr, "Directory %s: ", dirname); 2522805Swnj fatal("Cannot open"); 2532805Swnj } 2542805Swnj 2552805Swnj else do 2562805Swnj { 2572805Swnj nread = fread( (char *) &entry[0], sizeof(struct direct), 32, dirf) ; 2582805Swnj for(i=0; i<nread; ++i) 2592805Swnj if(entry[i].d_ino!= 0) 2602805Swnj { 2612805Swnj p1 = entry[i].d_name; 2622805Swnj p2 = n15; 2632805Swnj while( (p2<n15end) && 2642805Swnj (*p2++ = *p1++)!='\0' ); 2652805Swnj if( amatch(n15,filepat) ) 2662805Swnj { 2672805Swnj concat(dirpref,n15,fullname); 2682805Swnj if( (q=srchname(fullname)) ==0) 2692805Swnj q = makename(copys(fullname)); 2702805Swnj if(mkchain) 2712805Swnj { 2722805Swnj thisdbl = ALLOC(depblock); 2732805Swnj thisdbl->nxtdepblock = nextdbl; 2742805Swnj thisdbl->depname = q; 2752805Swnj nextdbl = thisdbl; 2762805Swnj } 2772805Swnj } 2782805Swnj } 2792805Swnj 2802805Swnj } while(nread==32); 2812805Swnj 2822805Swnj if(endir != 0) *endir = '/'; 2832805Swnj 2842805Swnj if(cldir) 2852805Swnj fclose(dirf); 2862805Swnj return(thisdbl); 2872805Swnj } 2882805Swnj 2892805Swnj /* stolen from glob through find */ 2902805Swnj 2912805Swnj static amatch(s, p) 2922805Swnj char *s, *p; 2932805Swnj { 2942805Swnj register int cc, scc, k; 2952805Swnj int c, lc; 2962805Swnj 2972805Swnj scc = *s; 2982805Swnj lc = 077777; 2992805Swnj switch (c = *p) { 3002805Swnj 3012805Swnj case '[': 3022805Swnj k = 0; 3032805Swnj while (cc = *++p) { 3042805Swnj switch (cc) { 3052805Swnj 3062805Swnj case ']': 3072805Swnj if (k) 3082805Swnj return(amatch(++s, ++p)); 3092805Swnj else 3102805Swnj return(0); 3112805Swnj 3122805Swnj case '-': 3132805Swnj k |= (lc <= scc) & (scc <= (cc=p[1]) ) ; 3142805Swnj } 3152805Swnj if (scc==(lc=cc)) k++; 3162805Swnj } 3172805Swnj return(0); 3182805Swnj 3192805Swnj case '?': 3202805Swnj caseq: 3212805Swnj if(scc) return(amatch(++s, ++p)); 3222805Swnj return(0); 3232805Swnj case '*': 3242805Swnj return(umatch(s, ++p)); 3252805Swnj case 0: 3262805Swnj return(!scc); 3272805Swnj } 3282805Swnj if (c==scc) goto caseq; 3292805Swnj return(0); 3302805Swnj } 3312805Swnj 3322805Swnj static umatch(s, p) 3332805Swnj char *s, *p; 3342805Swnj { 3352805Swnj if(*p==0) return(1); 3362805Swnj while(*s) 3372805Swnj if (amatch(s++,p)) return(1); 3382805Swnj return(0); 3392805Swnj } 3402805Swnj 3412805Swnj #ifdef METERFILE 3422805Swnj #include <pwd.h> 3432805Swnj int meteron = 0; /* default: metering off */ 3442805Swnj 3452805Swnj meter(file) 3462805Swnj char *file; 3472805Swnj { 3482805Swnj TIMETYPE tvec; 3492805Swnj char *p, *ctime(); 3502805Swnj FILE * mout; 3512805Swnj struct passwd *pwd, *getpwuid(); 3522805Swnj 3532805Swnj if(file==0 || meteron==0) return; 3542805Swnj 3552805Swnj pwd = getpwuid(getuid()); 3562805Swnj 3572805Swnj time(&tvec); 3582805Swnj 3592805Swnj if( (mout=fopen(file,"a")) != NULL ) 3602805Swnj { 3612805Swnj p = ctime(&tvec); 3622805Swnj p[16] = '\0'; 3632805Swnj fprintf(mout,"User %s, %s\n",pwd->pw_name,p+4); 3642805Swnj fclose(mout); 3652805Swnj } 3662805Swnj } 3672805Swnj #endif 3682805Swnj 3692805Swnj 3702805Swnj /* look inside archives for notations a(b) and a((b)) 3712805Swnj a(b) is file member b in archive a 3722805Swnj a((b)) is entry point _b in object archive a 3732805Swnj */ 3742805Swnj 3752805Swnj #ifdef ASCARCH 3762805Swnj # include <ar.h> 3772805Swnj #else 3782805Swnj # include <ar.h> 3792805Swnj #endif 3802805Swnj #include <a.out.h> 3812805Swnj 3822805Swnj static long arflen; 3832805Swnj static long arfdate; 3842805Swnj static char arfname[16]; 3852805Swnj FILE *arfd; 3862805Swnj long int arpos, arlen; 3872805Swnj 3882805Swnj static struct exec objhead; 3892805Swnj 3902805Swnj static struct nlist objentry; 3912805Swnj 3922805Swnj 3932805Swnj TIMETYPE lookarch(filename) 3942805Swnj char *filename; 3952805Swnj { 3962805Swnj char *p, *q, *send, s[15]; 3972805Swnj int i, nc, nsym, objarch; 3982805Swnj 3992805Swnj for(p = filename; *p!= '(' ; ++p) 4002805Swnj ; 4012805Swnj *p = '\0'; 4022805Swnj openarch(filename); 4032805Swnj *p++ = '('; 4042805Swnj 4052805Swnj if(*p == '(') 4062805Swnj { 4072805Swnj objarch = YES; 4082805Swnj nc = 8; 4092805Swnj ++p; 4102805Swnj } 4112805Swnj else 4122805Swnj { 4132805Swnj objarch = NO; 4142805Swnj nc = 14; 4152805Swnj } 4162805Swnj send = s + nc; 4172805Swnj 4182805Swnj for( q = s ; q<send && *p!='\0' && *p!=')' ; *q++ = *p++ ) 4192805Swnj ; 4202805Swnj while(q < send) 4212805Swnj *q++ = '\0'; 4222805Swnj while(getarch()) 4232805Swnj { 4242805Swnj if(objarch) 4252805Swnj { 4262805Swnj getobj(); 4272805Swnj nsym = objhead.a_syms / sizeof(objentry); 4282805Swnj for(i = 0; i<nsym ; ++i) 4292805Swnj { 4302805Swnj fread( (char *) &objentry, sizeof(objentry),1,arfd); 4312805Swnj if( (objentry.n_type & N_EXT) 4322805Swnj && ((objentry.n_type & ~N_EXT) || objentry.n_value) 4332805Swnj && eqstr(objentry.n_un.n_name,s,nc)) 4342805Swnj { 4352805Swnj clarch(); 4362805Swnj return(arfdate); 4372805Swnj } 4382805Swnj } 4392805Swnj } 4402805Swnj 4412805Swnj else if( eqstr(arfname, s, nc)) 4422805Swnj { 4432805Swnj clarch(); 4442805Swnj return(arfdate); 4452805Swnj } 4462805Swnj } 4472805Swnj 4482805Swnj clarch(); 4492805Swnj return( 0L); 4502805Swnj } 4512805Swnj 4522805Swnj 4532805Swnj clarch() 4542805Swnj { 4552805Swnj fclose( arfd ); 4562805Swnj } 4572805Swnj 4582805Swnj 4592805Swnj openarch(f) 4602805Swnj register char *f; 4612805Swnj { 4622805Swnj #ifdef ASCARCH 4632805Swnj char magic[SARMAG]; 4642805Swnj #endif 4652805Swnj int word; 4662805Swnj #include <sys/stat.h> 4672805Swnj struct stat buf; 4682805Swnj 469*6178Ssam #if vax 470*6178Ssam lstat(f, &buf); 471*6178Ssam #else 4722805Swnj stat(f, &buf); 473*6178Ssam #endif 4742805Swnj arlen = buf.st_size; 4752805Swnj 4762805Swnj arfd = fopen(f, "r"); 4772805Swnj if(arfd == NULL) 4782805Swnj fatal1("cannot open %s", f); 4792805Swnj 4802805Swnj fread( (char *) &word, sizeof(word), 1, arfd); 4812805Swnj #ifdef ASCARCH 4822805Swnj fseek(arfd, 0L, 0); 4832805Swnj fread(magic, SARMAG, 1, arfd); 4842805Swnj arpos = SARMAG; 4852805Swnj if( ! eqstr(magic, ARMAG, SARMAG) ) 4862805Swnj #else 4872805Swnj arpos = sizeof(word); 4882805Swnj if(word != ARMAG) 4892805Swnj #endif 4902805Swnj fatal1("%s is not an archive", f); 4912805Swnj 4922805Swnj arflen = 0; 4932805Swnj } 4942805Swnj 4952805Swnj 4962805Swnj 4972805Swnj getarch() 4982805Swnj { 4992805Swnj struct ar_hdr arhead; 5002805Swnj long atol(); 5012805Swnj 5022805Swnj arpos += (arflen + 1) & ~1L; /* round archived file length up to even */ 5032805Swnj if(arpos >= arlen) 5042805Swnj return(0); 5052805Swnj fseek(arfd, arpos, 0); 5062805Swnj 5072805Swnj fread( (char *) &arhead, sizeof(arhead), 1, arfd); 5082805Swnj arpos += sizeof(arhead); 5092805Swnj #ifdef ASCARCH 5102805Swnj arflen = atol(arhead.ar_size); 5112805Swnj arfdate = atol(arhead.ar_date); 5122805Swnj #else 5132805Swnj arflen = arhead.ar_size; 5142805Swnj arfdate = arhead.ar_date; 5152805Swnj #endif 5162805Swnj strncpy(arfname, arhead.ar_name, sizeof(arhead.ar_name)); 5172805Swnj return(1); 5182805Swnj } 5192805Swnj 5202805Swnj 5212805Swnj getobj() 5222805Swnj { 5232805Swnj long int skip; 5242805Swnj 5252805Swnj fread( (char *) &objhead, sizeof(objhead), 1, arfd); 5262805Swnj if (N_BADMAG(objhead)) 5272805Swnj fatal1("%s is not an object module", arfname); 5282805Swnj skip = objhead.a_text + objhead.a_data; 5292805Swnj #ifdef vax 5302805Swnj skip += objhead.a_trsize + objhead.a_drsize; 5312805Swnj #else 5322805Swnj if(! objhead.a_flag ) 5332805Swnj skip *= 2; 5342805Swnj #endif 5352805Swnj fseek(arfd, skip, 1); 5362805Swnj } 5372805Swnj 5382805Swnj 5392805Swnj eqstr(a,b,n) 5402805Swnj register char *a, *b; 5412805Swnj int n; 5422805Swnj { 5432805Swnj register int i; 5442805Swnj for(i = 0 ; i < n ; ++i) 5452805Swnj if(*a++ != *b++) 5462805Swnj return(NO); 5472805Swnj return(YES); 5482805Swnj } 549