# 2.11BSD#431 - /usr/src/bin/make/dosys.c

##### Functions

    await             X
    doclose           X
    doexec            X
    doshell           X
    dosys             X
    metas             X
    touch             X

##### Macros

    MAXARGV           X

       1: /* static	char *sccsid = "@(#)dosys.c	4.10 (Berkeley) 12/23/84"; */
       2: #include "defs"
       3: #include <signal.h>
       4:
       5: dosys(comstring,nohalt)
       6: register char *comstring;
       7: int nohalt;
       8: {
       9: register int status;
      10:
      11: if(metas(comstring))
      12:     status = doshell(comstring,nohalt);
      13: else    status = doexec(comstring);
      14:
      15: return(status);
      16: }
      17:
      18:
      19:
      20: metas(s)   /* Are there are any  Shell meta-characters? */
      21: register char *s;
      22: {
      23: register char c;
      24:
      25: while( (funny[c = *s++] & META) == 0 )
      26:     ;
      27: return( c );
      28: }
      29:
      30: doshell(comstring,nohalt)
      31: char *comstring;
      32: int nohalt;
      33: {
      34: #ifdef SHELLENV
      35: char *getenv(), *rindex();
      36: char *shellcom = getenv("SHELL");
      37: char *shellstr;
      38: #endif
      39: if((waitpid = vfork()) == 0)
      40:     {
      41:     enbint(SIG_DFL);
      42:     doclose();
      43:
      44: #ifdef SHELLENV
      45:     if (shellcom == 0) shellcom = SHELLCOM;
      46:     shellstr = rindex(shellcom, '/') + 1;
      47:     execl(shellcom, shellstr, (nohalt ? "-c" : "-ce"), comstring, 0);
      48: #else
      49:     execl(SHELLCOM, "sh", (nohalt ? "-c" : "-ce"), comstring, 0);
      50: #endif
      51:     fatal("Couldn't load Shell");
      52:     }
      53:
      54: return( await() );
      55: }
      56:
      57:
      58:
      59:
      60: int intrupt();
      61:
      62: await()
      63: {
      64: int status;
      65: register int pid;
      66:
      67: enbint(SIG_IGN);
      68: while( (pid = wait(&status)) != waitpid)
      69:     if(pid == -1)
      70:         fatal("bad wait code");
      71: waitpid = 0;
      72: enbint(intrupt);
      73: return(status);
      74: }
      75:
      76: /*
      77:  * Close open directory files before exec'ing
      78:  */
      79: doclose()
      80: {
      81: register struct dirhdr *od;
      82:
      83: for (od = firstod; od; od = od->nxtopendir)
      84:     if (od->dirfc != NULL)
      85:         /*
      86: 		 * vfork kludge...
      87: 		 * we cannot call closedir since this will modify
      88: 		 * the parents data space; just call close directly.
      89: 		 */
      90:         close(od->dirfc->dd_fd);
      91: }
      92:
      93:
      94:
      95: #define MAXARGV 254     /* execvp can only handle 254 anyhow */
      96:
      97: doexec(str)
      98: register char *str;
      99: {
     100: register char *t;
     101: static char *argv[MAXARGV]; /* docom() ate most of the stack already */
     102: register char **p;
     103:
     104: while( *str==' ' || *str=='\t' )
     105:     ++str;
     106: if( *str == '\0' )
     107:     return(-1); /* no command */
     108:
     109: p = argv;
     110: for(t = str ; *t ; )
     111:     {
     112:     if (p >= argv + MAXARGV)
     113:         fatal1("%s: Too many arguments.", str);
     114:     *p++ = t;
     115:     while(*t!=' ' && *t!='\t' && *t!='\0')
     116:         ++t;
     117:     if(*t)
     118:         for( *t++ = '\0' ; *t==' ' || *t=='\t'  ; ++t)
     119:             ;
     120:     }
     121:
     122: *p = NULL;
     123:
     124: if((waitpid = vfork()) == 0)
     125:     {
     126:     enbint(SIG_DFL);
     127:     doclose();
     128:     enbint(intrupt);
     129:     execvp(str, argv);
     130:     fatal1("Cannot load %s",str);
     131:     }
     132:
     133: return( await() );
     134: }
     135:
     136: #include <errno.h>
     137:
     138: #include <sys/stat.h>
     139:
     140:
     141:
     142: touch(force, name)
     143: int force;
     144: char *name;
     145: {
     146: struct stat stbuff;
     147: char junk[1];
     148: int fd;
     149:
     150: if( stat(name,&stbuff) < 0)
     151:     if(force)
     152:         goto create;
     153:     else
     154:         {
     155:         fprintf(stderr, "touch: file %s does not exist.\n", name);
     156:         return;
     157:         }
     158:
     159: if(stbuff.st_size == 0)
     160:     goto create;
     161:
     162: if( (fd = open(name, 2)) < 0)
     163:     goto bad;
     164:
     165: if( read(fd, junk, 1) < 1)
     166:     {
     167:     close(fd);
     168:     goto bad;
     169:     }
     170: lseek(fd, 0L, 0);
     171: if( write(fd, junk, 1) < 1 )
     172:     {
     173:     close(fd);
     174:     goto bad;
     175:     }
     176: close(fd);
     177: return;
     178:
     179: bad:
     180:     fprintf(stderr, "Cannot touch %s\n", name);
     181:     return;
     182:
     183: create:
     184:     if( (fd = creat(name, 0666)) < 0)
     185:         goto bad;
     186:     close(fd);
     187: }

#### Defined functions

await defined in line 62; used 2 times

- in line 54, 133

doclose defined in line 79; used 2 times

- in line 42, 127

doexec defined in line 97; used 1 times

- in line 13

doshell defined in line 30; used 1 times

- in line 12

dosys defined in line 5; used 1 times

- in /usr/src/bin/make/doname.c line 308

metas defined in line 20; used 1 times

- in line 11

touch defined in line 142; used 1 times

- in /usr/src/bin/make/doname.c line 268

#### Defined macros

MAXARGV defined in line 95; used 2 times

- in line 101, 112

Last modified: 1991-08-09 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 1547 |