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

1.1       root        1: /*      %W%     */
                      2: /*      @(#)/usr/src/cmd/make/dosys.c   3.2     */
                      3: /*      @(#)dosys.c     3.1     */
                      4: 
                      5: # include "defs"
                      6: # include "sys/types.h"
                      7: # include "sys/stat.h"
                      8: 
                      9: extern char Makecall;
                     10: 
                     11: 
                     12: dosys(comstring, nohalt)
                     13: register CHARSTAR comstring;
                     14: int nohalt;
                     15: {
                     16:         register CHARSTAR p;
                     17:         register int i;
                     18:         int status;
                     19: 
                     20:         p = comstring;
                     21:         while(  *p == BLANK ||
                     22:                 *p == TAB ||
                     23:                 *p == AT ||
                     24:                 *p == MINUS ||
                     25:                 *p == NULL) p++;
                     26: 
                     27:         if(IS_ON(NOEX) && Makecall == NO)
                     28:                 return(0);
                     29: 
                     30:         if(metas(comstring))
                     31:                 status = doshell(comstring,nohalt);
                     32:         else
                     33:                 status = doexec(comstring);
                     34: 
                     35:         return(status);
                     36: }
                     37: 
                     38: 
                     39: 
                     40: metas(s)   /* Are there are any  Shell meta-characters? */
                     41: register CHARSTAR s;
                     42: {
                     43:         while(*s)
                     44:                 if( funny[*s++] & META)
                     45:                         return(YES);
                     46: 
                     47:         return(NO);
                     48: }
                     49: 
                     50: doshell(comstring,nohalt)
                     51: register CHARSTAR comstring;
                     52: register int nohalt;
                     53: {
                     54:         register CHARSTAR shell;
                     55: 
                     56:         if((waitpid = fork()) == 0)
                     57:         {
                     58:                 enbint(0);
                     59:                 doclose();
                     60: 
                     61:                 setenv();
                     62:                 shell = varptr("SHELL")->varval;
                     63:                 if(shell == 0 || shell[0] == CNULL)
                     64:                         shell = SHELLCOM;
                     65:                 execl(shell, "sh", (nohalt ? "-c" : "-ce"), comstring, 0);
                     66:                 fatal("Couldn't load Shell");
                     67:         }
                     68: 
                     69:         return( await() );
                     70: }
                     71: 
                     72: 
                     73: 
                     74: 
                     75: await()
                     76: {
                     77:         int intrupt();
                     78:         int status;
                     79:         int pid;
                     80: 
                     81:         enbint(intrupt);
                     82:         while( (pid = wait(&status)) != waitpid)
                     83:                 if(pid == -1)
                     84:                         fatal("bad wait code");
                     85:         waitpid = 0;
                     86:         return(status);
                     87: }
                     88: 
                     89: 
                     90: 
                     91: 
                     92: 
                     93: 
                     94: doclose()       /* Close open directory files before exec'ing */
                     95: {
                     96:         register OPENDIR od;
                     97: 
                     98:         for (od = firstod; od != 0; od = od->nextopendir)
                     99:                 if (od->dirfc != NULL)
                    100:                         fclose(od->dirfc);
                    101: }
                    102: 
                    103: 
                    104: 
                    105: 
                    106: 
                    107: doexec(str)
                    108: register CHARSTAR str;
                    109: {
                    110:         register CHARSTAR t;
                    111:         register CHARSTAR *p;
                    112:         CHARSTAR argv[200];
                    113:         int status;
                    114: 
                    115:         while( *str==BLANK || *str==TAB )
                    116:                 ++str;
                    117:         if( *str == CNULL )
                    118:                 return(-1);     /* no command */
                    119: 
                    120:         p = argv;
                    121:         for(t = str ; *t ; )
                    122:         {
                    123:                 *p++ = t;
                    124:                 while(*t!=BLANK && *t!=TAB && *t!=CNULL)
                    125:                         ++t;
                    126:                 if(*t)
                    127:                         for( *t++ = CNULL ; *t==BLANK || *t==TAB  ; ++t);
                    128:         }
                    129: 
                    130:         *p = NULL;
                    131: 
                    132:         if((waitpid = fork()) == 0)
                    133:         {
                    134:                 enbint(0);
                    135:                 doclose();
                    136:                 setenv();
                    137:                 execvp(str, argv);
                    138:                 fatal1("Cannot load %s",str);
                    139:         }
                    140: 
                    141:         return( await() );
                    142: }
                    143: 
                    144: touch(force, name)
                    145: register int force;
                    146: register char *name;
                    147: {
                    148:         struct stat stbuff;
                    149:         char junk[1];
                    150:         int fd;
                    151: 
                    152:         if( stat(name,&stbuff) < 0)
                    153:                 if(force)
                    154:                         goto create;
                    155:                 else
                    156:                 {
                    157:                         fprintf(stderr,"touch: file %s does not exist.\n",name);
                    158:                         return;
                    159:                 }
                    160:         if(stbuff.st_size == 0)
                    161:                 goto create;
                    162:         if( (fd = open(name, 2)) < 0)
                    163:                 goto bad;
                    164:         if( read(fd, junk, 1) < 1)
                    165:         {
                    166:                 close(fd);
                    167:                 goto bad;
                    168:         }
                    169:         lseek(fd, 0L, 0);
                    170:         if( write(fd, junk, 1) < 1 )
                    171:         {
                    172:                 close(fd);
                    173:                 goto bad;
                    174:         }
                    175:         close(fd);
                    176:         return;
                    177: bad:
                    178:         fprintf(stderr, "Cannot touch %s\n", name);
                    179:         return;
                    180: create:
                    181:         if( (fd = creat(name, 0666)) < 0)
                    182:                 goto bad;
                    183:         close(fd);
                    184: }

unix.superglobalmegacorp.com

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