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
doclose defined in line 79; used 2 times
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
metas defined in line 20; used 1 times
  • in line 11
touch defined in line 142; used 1 times

Defined macros

MAXARGV defined in line 95; used 2 times
Last modified: 1991-08-09
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 939
Valid CSS Valid XHTML 1.0 Strict