Annotation of researchv10no/cmd/usgmake/files.c, revision 1.1.1.1

1.1       root        1: /*      @(#)/usr/src/cmd/make/files.c   3.4     */
                      2: 
                      3: #include "defs"
                      4: #include <sys/types.h>
                      5: #include <sys/stat.h>
                      6: #include <sys/dir.h>
                      7: #include <pwd.h>
                      8: #include <ar.h>
                      9: #include <a.out.h>
                     10: /* UNIX DEPENDENT PROCEDURES */
                     11: 
                     12: #define        ONE     0
                     13: 
                     14: char archmem[16];
                     15: char archname[64];              /* name of archive library */
                     16: 
                     17: #define        ARNAMSZ 16
                     18: 
                     19: TIMETYPE exists(pname)
                     20: NAMEBLOCK pname;
                     21: {
                     22:         register CHARSTAR s;
                     23:         struct stat buf;
                     24:         TIMETYPE lookarch(), ttiimmee;
                     25:         CHARSTAR filename;
                     26: 
                     27:         filename = pname->namep;
                     28: 
                     29:         if(any(filename, LPAREN)) {
                     30:                ttiimmee=lookarch(filename);
                     31:        if(ONE)
                     32:                printf("lookarch=%ld\n", ttiimmee);
                     33:                return(ttiimmee);
                     34:        }
                     35: 
                     36:         if(stat(filename,&buf) < 0) 
                     37:         {
                     38:                 s = findfl(filename);
                     39:                 if(s != (CHARSTAR )-1)
                     40:                 {
                     41:                         pname->alias = copys(s);
                     42:                         if(stat(pname->alias, &buf) == 0)
                     43:                                 return(buf.st_mtime);
                     44:                 }
                     45:                 return(0);
                     46:         }
                     47:         else
                     48:                 return(buf.st_mtime);
                     49: }
                     50: 
                     51: 
                     52: TIMETYPE prestime()
                     53: {
                     54:         TIMETYPE t;
                     55:         time(&t);
                     56:         return(t);
                     57: }
                     58: 
                     59: 
                     60: 
                     61: FSTATIC char n15[17];
                     62: FSTATIC CHARSTAR n15end = &n15[ARNAMSZ];
                     63: 
                     64: 
                     65: 
                     66: DEPBLOCK srchdir(pat, mkchain, nextdbl)
                     67: register CHARSTAR pat;          /* pattern to be matched in directory */
                     68: int mkchain;                    /* nonzero if results to be remembered */
                     69: DEPBLOCK nextdbl;               /* final value for chain */
                     70: {
                     71:         FILE * dirf;
                     72:         int i, nread;
                     73:         CHARSTAR dirname, dirpref, endir, filepat, p;
                     74:         char temp[100];
                     75:         char fullname[100];
                     76:         CHARSTAR p1, p2;
                     77:         NAMEBLOCK q;
                     78:         DEPBLOCK thisdbl;
                     79:         OPENDIR od;
                     80:         int dirofl = 0;
                     81:         static opendirs = 0;
                     82:         PATTERN patp;
                     83: 
                     84:         struct direct entry[32];
                     85: 
                     86: 
                     87:         thisdbl = 0;
                     88: 
                     89:         if(mkchain == NO)
                     90:                 for(patp=firstpat ; patp!=0 ; patp = patp->nextpattern)
                     91:                         if(equal(pat,patp->patval))
                     92:                                 return(0);
                     93: 
                     94:         patp = ALLOC(pattern);
                     95:         patp->nextpattern = firstpat;
                     96:         firstpat = patp;
                     97:         patp->patval = copys(pat);
                     98: 
                     99:         endir = 0;
                    100: 
                    101:         for(p=pat; *p!=CNULL; ++p)
                    102:                 if(*p==SLASH)
                    103:                         endir = p;
                    104: 
                    105:         if(endir==0)
                    106:         {
                    107:                 dirname = ".";
                    108:                 dirpref = "";
                    109:                 filepat = pat;
                    110:         }
                    111:         else
                    112:         {
                    113:                 *endir = CNULL;
                    114:                 dirpref = concat(pat, "/", temp);
                    115:                 filepat = endir+1;
                    116:                 dirname = temp;
                    117:         }
                    118: 
                    119:         dirf = NULL;
                    120: 
                    121:         for(od=firstod ; od!=0; od = od->nextopendir)
                    122:                 if(equal(dirname, od->dirn))
                    123:                 {
                    124:                         dirf = od->dirfc;
                    125:                         fseek(dirf,0L,0); /* start over at the beginning  */
                    126:                         break;
                    127:                 }
                    128: 
                    129:         if(dirf == NULL)
                    130:         {
                    131:                 dirf = fopen(dirname, "r");
                    132:                 if(++opendirs < MAXODIR)
                    133:                 {
                    134:                         od = ALLOC(opendir);
                    135:                         od->nextopendir = firstod;
                    136:                         firstod = od;
                    137:                         od->dirfc = dirf;
                    138:                         od->dirn = copys(dirname);
                    139:                 }
                    140:                 else
                    141:                         dirofl = 1;
                    142:         }
                    143: 
                    144:         if(dirf == NULL)
                    145:         {
                    146:                 fprintf(stderr, "Directory %s: ", dirname);
                    147:                 fatal("Cannot open");
                    148:         }
                    149: 
                    150:         else    do
                    151:                 {
                    152:                         nread = fread(entry,sizeof(entry[0]),32,dirf) ;
                    153:                         for(i=0; i<nread; ++i)
                    154:                                 if(entry[i].d_ino!= 0)
                    155:                                 {
                    156:                                         p1 = entry[i].d_name;
                    157:                                         p2 = n15;
                    158:                                         while( (p2<n15end) &&
                    159:                                           (*p2++ = *p1++)!=CNULL );
                    160:                                         if( amatch(n15,filepat) )
                    161:                                         {
                    162:                                                 concat(dirpref,n15,fullname);
                    163:                                                 if( (q=srchname(fullname)) ==0)
                    164:                                                         q = makename(copys(fullname));
                    165:                                                 if(mkchain)
                    166:                                                 {
                    167:                                                         thisdbl = ALLOC(depblock);
                    168:                                                         thisdbl->nextdep = nextdbl;
                    169:                                                         thisdbl->depname = q;
                    170:                                                         nextdbl = thisdbl;
                    171:                                                 }
                    172:                                         }
                    173:                                 }
                    174:                 } while(nread==32);
                    175: 
                    176:         if(endir != 0)
                    177:                 *endir = SLASH;
                    178:         if(dirofl)
                    179:                 fclose(dirf);
                    180: 
                    181:         return(thisdbl);
                    182: }
                    183: 
                    184: /* stolen from glob through find */
                    185: 
                    186: amatch(s, p)
                    187: CHARSTAR s, p;
                    188: {
                    189:         register int cc, scc, k;
                    190:         int c, lc;
                    191: 
                    192:         scc = *s;
                    193:         lc = 077777;
                    194:         switch (c = *p)
                    195:         {
                    196: 
                    197:         case LSQUAR:
                    198:                 k = 0;
                    199:                 while (cc = *++p)
                    200:                 {
                    201:                         switch (cc)
                    202:                         {
                    203: 
                    204:                         case RSQUAR:
                    205:                                 if (k)
                    206:                                         return(amatch(++s, ++p));
                    207:                                 else
                    208:                                         return(0);
                    209: 
                    210:                         case MINUS:
                    211:                                 k |= lc <= scc & scc <= (cc=p[1]);
                    212:                         }
                    213:                         if(scc==(lc=cc))
                    214:                                 k++;
                    215:                 }
                    216:                 return(0);
                    217: 
                    218:         case QUESTN:
                    219:         caseq:
                    220:                 if(scc)
                    221:                         return(amatch(++s, ++p));
                    222:                 return(0);
                    223:         case STAR:
                    224:                 return(umatch(s, ++p));
                    225:         case 0:
                    226:                 return(!scc);
                    227:         }
                    228:         if(c==scc)
                    229:                 goto caseq;
                    230:         return(0);
                    231: }
                    232: 
                    233: umatch(s, p)
                    234: register CHARSTAR s, p;
                    235: {
                    236:         if(*p==0)
                    237:                 return(1);
                    238:         while(*s)
                    239:                 if(amatch(s++,p))
                    240:                         return(1);
                    241:         return(0);
                    242: }
                    243: 
                    244: #ifdef METERFILE
                    245: int meteron 0;  /* default: metering off */
                    246: 
                    247: meter(file)
                    248: CHARSTAR file;
                    249: {
                    250:         TIMETYPE tvec;
                    251:         CHARSTAR p, ctime();
                    252:         FILE * mout;
                    253:         struct passwd *pwd, *getpwuid();
                    254: 
                    255:         if(file==0 || meteron==0)
                    256:                 return;
                    257: 
                    258:         pwd = getpwuid(getuid());
                    259: 
                    260:         time(&tvec);
                    261: 
                    262:         if( (mout=fopen(file,"a")) != NULL )
                    263:         {
                    264:                 p = ctime(&tvec);
                    265:                 p[16] = CNULL;
                    266:                 fprintf(mout,"User %s, %s\n",pwd->pw_name,p+4);
                    267:                 fclose(mout);
                    268:         }
                    269: }
                    270: #endif
                    271: 
                    272: 
                    273: /* look inside archives for notations a(b) and a((b))
                    274:         a(b)    is file member   b   in archive a
                    275:         a((b))  is entry point  _b  in object archive a
                    276: */
                    277: 
                    278: static struct ar_hdr arhead;
                    279: FILE *arfd;
                    280: long int arpos, arlen;
                    281: 
                    282: static struct exec objhead;
                    283: 
                    284: static struct nlist objentry;
                    285: 
                    286: 
                    287: TIMETYPE lookarch(filename)
                    288: register CHARSTAR filename;
                    289: {
                    290:         register int i;
                    291:         CHARSTAR p, q, send;
                    292:         char s[17];
                    293:         int nc, nsym, objarch;
                    294: 
                    295:         for(p = filename; *p!= LPAREN ; ++p);
                    296:         q = p++;
                    297: 
                    298:         if(*p == LPAREN)
                    299:         {
                    300:                 objarch = YES;
                    301:                 nc = 8;
                    302:                 ++p;
                    303:         }
                    304:         else
                    305:         {
                    306:                 objarch = NO;
                    307:                 nc = ARNAMSZ;
                    308:                 for(i = 0; i < ARNAMSZ; i++)
                    309:                 {
                    310:                         if(p[i] == RPAREN)
                    311:                         {
                    312:                                 i--;
                    313:                                 break;
                    314:                         }
                    315:                         archmem[i] = p[i];
                    316:                 }
                    317:                 archmem[++i] = 0;
                    318:                 if(archmem[0] == CNULL)
                    319:                         fatal1("Null archive member name `%s'", filename);
                    320:         }
                    321:         *q = CNULL;
                    322:         copstr(archname, filename);
                    323:         if(archname[0] == CNULL)
                    324:                 fatal1("Null archive name `%s'", archmem);
                    325:         i = openarch(filename);
                    326:         *q = LPAREN;
                    327:         if(i == -1)
                    328:                 return(0);
                    329:         send = s + nc;
                    330: 
                    331:         for( q = s ; q<send && *p!=CNULL && *p!=RPAREN ; *q++ = *p++ );
                    332: 
                    333:         while(q < send)
                    334:                 *q++ = CNULL;
                    335:         while(getarch())
                    336:         {
                    337:                 if(objarch)
                    338:                 {
                    339:                         getobj();
                    340:                         nsym = objhead.a_syms / sizeof(objentry);
                    341:                         for(i = 0; i<nsym ; ++i)
                    342:                         {
                    343:                                 fread(&objentry, sizeof(objentry),1,arfd);
                    344:                                 if( (objentry.n_type & N_EXT)
                    345:                                    && eqstr(objentry.n_un.n_name,s,nc))
                    346:                                 {
                    347:                                         for(i = 0; i < ARNAMSZ; i++)
                    348:                                                 archmem[i] = arhead.ar_name[i];
                    349:                                         archmem[++i] = 0;
                    350:         out:
                    351:                                         clarch();
                    352:                                         return(atol(arhead.ar_date));
                    353:                                 }
                    354:                         }
                    355:                 }
                    356: 
                    357:                else {
                    358:                if(ONE)
                    359:                        printf("ar_name=%s, s=%s\n", arhead.ar_name, s);
                    360:                        if( eqstr(arhead.ar_name, s, nc))
                    361:                         goto out;
                    362:                }
                    363:         }
                    364: 
                    365:         clarch();
                    366:         return( 0L);
                    367: }
                    368: 
                    369: 
                    370: clarch()
                    371: {
                    372:         fclose( arfd );
                    373: }
                    374: 
                    375: 
                    376: openarch(f)
                    377: register CHARSTAR f;
                    378: {
                    379:         char word[SARMAG];
                    380:         struct stat buf;
                    381: 
                    382:         if(stat(f, &buf) == -1)
                    383:                 return(-1);
                    384:         arlen = buf.st_size;
                    385: 
                    386:         arfd = fopen(f, "r");
                    387:         if(arfd == NULL)
                    388:                 return(-1);
                    389:         fread(word, sizeof(char), SARMAG, arfd);
                    390:        if(strcmp(word, ARMAG))
                    391:                 fatal1("%s is not an archive", f);
                    392: /*
                    393:  *      trick getarch() into jumping to the first archive member.
                    394:  */
                    395:         arpos = sizeof(word);
                    396:        sprintf(arhead.ar_size, "%d", -(int)sizeof(arhead));
                    397: if(ONE)
                    398:        printf("*%s*\n", arhead.ar_size);
                    399:        arhead.ar_size[9] = 0;
                    400:         return(0);
                    401: }
                    402: 
                    403: 
                    404: 
                    405: getarch()
                    406: {
                    407:         arpos += sizeof(arhead);
                    408:         arpos += (atol(arhead.ar_size) + 1 ) & ~1L;
                    409: if(ONE)
                    410:        printf("arpos=%ld\n", arpos);
                    411:         if(arpos >= arlen)
                    412:                 return(0);
                    413:         fseek(arfd, arpos, 0);
                    414:         fread(&arhead, sizeof(arhead), 1, arfd);
                    415:        arhead.ar_name[15]=0;
                    416:        arhead.ar_date[11]=0;
                    417:        arhead.ar_size[9]=0;
                    418:         return(1);
                    419: }
                    420: 
                    421: 
                    422: getobj()
                    423: {
                    424:         long int skip;
                    425: 
                    426:         fread(&objhead, sizeof(objhead), 1, arfd);
                    427: /*
                    428:         if( objhead.a_magic != A_MAGIC1 &&
                    429:             objhead.a_magic != A_MAGIC2 &&
                    430:             objhead.a_magic != A_MAGIC3 )
                    431:                         fatal1("%s is not an object module", arhead.ar_name);
                    432: */
                    433:         skip = objhead.a_text + objhead.a_data;
                    434: #if vax || u370
                    435:         skip += objhead.a_trsize + objhead.a_drsize;
                    436: #else
                    437:         if(! objhead.a_flag )
                    438:                 skip *= 2;
                    439: #endif
                    440:         fseek(arfd, skip, 1);
                    441: }
                    442: 
                    443: 
                    444: eqstr(a,b,n)
                    445: register CHARSTAR a, b;
                    446: register int n;
                    447: {
                    448:         register int i;
                    449:         for(i = 0 ; i < n ; ++i)
                    450:                if(*a++ != *b++)
                    451:                        if((*a == ' ') || (*b == ' '))
                    452:                                return(YES);
                    453:                        else
                    454:                                return(NO);
                    455:         return(YES);
                    456: }
                    457: /*
                    458:  *      Used when unlinking files. If file cannot be stat'ed or it is
                    459:  *      a directory, then do not remove it.
                    460:  */
                    461: isdir(p)
                    462: char *p;
                    463: {
                    464:         struct stat statbuf;
                    465: 
                    466:         if(stat(p, &statbuf) == -1)
                    467:                 return(1);              /* no stat, no remove */
                    468:         if((statbuf.st_mode&S_IFMT) == S_IFDIR)
                    469:                 return(1);
                    470:         return(0);
                    471: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.