1*32620Sbostic static char *sccsid = "@(#)dosys.c 4.11 (Berkeley) 11/15/87"; 22804Swnj #include "defs" 32804Swnj #include <signal.h> 42804Swnj 52804Swnj dosys(comstring,nohalt) 62804Swnj register char *comstring; 72804Swnj int nohalt; 82804Swnj { 92804Swnj register int status; 102804Swnj 112804Swnj if(metas(comstring)) 122804Swnj status = doshell(comstring,nohalt); 132804Swnj else status = doexec(comstring); 142804Swnj 152804Swnj return(status); 162804Swnj } 172804Swnj 182804Swnj 192804Swnj 202804Swnj metas(s) /* Are there are any Shell meta-characters? */ 212804Swnj register char *s; 222804Swnj { 232804Swnj register char c; 242804Swnj 252804Swnj while( (funny[c = *s++] & META) == 0 ) 262804Swnj ; 272804Swnj return( c ); 282804Swnj } 292804Swnj 302804Swnj doshell(comstring,nohalt) 312804Swnj char *comstring; 322804Swnj int nohalt; 332804Swnj { 342804Swnj #ifdef SHELLENV 352804Swnj char *getenv(), *rindex(); 362804Swnj char *shellcom = getenv("SHELL"); 372804Swnj char *shellstr; 382804Swnj #endif 3913258Sroot if((waitpid = vfork()) == 0) 402804Swnj { 412804Swnj enbint(SIG_DFL); 4217586Ssam doclose(); 432804Swnj 442804Swnj #ifdef SHELLENV 452804Swnj if (shellcom == 0) shellcom = SHELLCOM; 462804Swnj shellstr = rindex(shellcom, '/') + 1; 472804Swnj execl(shellcom, shellstr, (nohalt ? "-c" : "-ce"), comstring, 0); 482804Swnj #else 492804Swnj execl(SHELLCOM, "sh", (nohalt ? "-c" : "-ce"), comstring, 0); 502804Swnj #endif 512804Swnj fatal("Couldn't load Shell"); 522804Swnj } 532804Swnj 542804Swnj return( await() ); 552804Swnj } 562804Swnj 572804Swnj 582804Swnj 592804Swnj 602804Swnj int intrupt(); 612804Swnj 622804Swnj await() 632804Swnj { 642804Swnj int status; 652804Swnj register int pid; 662804Swnj 672804Swnj enbint(SIG_IGN); 682804Swnj while( (pid = wait(&status)) != waitpid) 692804Swnj if(pid == -1) 702804Swnj fatal("bad wait code"); 712804Swnj waitpid = 0; 722804Swnj enbint(intrupt); 732804Swnj return(status); 742804Swnj } 7517586Ssam 7617586Ssam /* 7717586Ssam * Close open directory files before exec'ing 7817586Ssam */ 7917586Ssam doclose() 8017586Ssam { 8117586Ssam register struct dirhdr *od; 8217586Ssam 8317586Ssam for (od = firstod; od; od = od->nxtopendir) 8417586Ssam if (od->dirfc != NULL) 8517586Ssam /* 8617586Ssam * vfork kludge... 8717586Ssam * we cannot call closedir since this will modify 8817586Ssam * the parents data space; just call close directly. 8917586Ssam */ 90*32620Sbostic (void)close(dirfd(od->dirfc)); 9117586Ssam } 922804Swnj 932804Swnj 942804Swnj 958676Ssam #define MAXARGV 400 962804Swnj 972804Swnj doexec(str) 982804Swnj register char *str; 992804Swnj { 1002804Swnj register char *t; 1018676Ssam char *argv[MAXARGV]; 1022804Swnj register char **p; 1032804Swnj 1042804Swnj while( *str==' ' || *str=='\t' ) 1052804Swnj ++str; 1062804Swnj if( *str == '\0' ) 1072804Swnj return(-1); /* no command */ 1082804Swnj 1092804Swnj p = argv; 1102804Swnj for(t = str ; *t ; ) 1112804Swnj { 1128676Ssam if (p >= argv + MAXARGV) 1138676Ssam fatal1("%s: Too many arguments.", str); 1142804Swnj *p++ = t; 1152804Swnj while(*t!=' ' && *t!='\t' && *t!='\0') 1162804Swnj ++t; 1172804Swnj if(*t) 1182804Swnj for( *t++ = '\0' ; *t==' ' || *t=='\t' ; ++t) 1192804Swnj ; 1202804Swnj } 1212804Swnj 1222804Swnj *p = NULL; 1232804Swnj 12416212Sralph if((waitpid = vfork()) == 0) 1252804Swnj { 1262804Swnj enbint(SIG_DFL); 12717586Ssam doclose(); 1282804Swnj enbint(intrupt); 1292804Swnj execvp(str, argv); 1302804Swnj fatal1("Cannot load %s",str); 1312804Swnj } 1322804Swnj 1332804Swnj return( await() ); 1342804Swnj } 1352804Swnj 1362804Swnj #include <errno.h> 1372804Swnj 1382804Swnj #include <sys/stat.h> 1392804Swnj 1402804Swnj 1412804Swnj 1422804Swnj touch(force, name) 1432804Swnj int force; 1442804Swnj char *name; 1452804Swnj { 1462804Swnj struct stat stbuff; 1472804Swnj char junk[1]; 1482804Swnj int fd; 1492804Swnj 1502804Swnj if( stat(name,&stbuff) < 0) 1512804Swnj if(force) 1522804Swnj goto create; 1532804Swnj else 1542804Swnj { 1552804Swnj fprintf(stderr, "touch: file %s does not exist.\n", name); 1562804Swnj return; 1572804Swnj } 1582804Swnj 1592804Swnj if(stbuff.st_size == 0) 1602804Swnj goto create; 1612804Swnj 1622804Swnj if( (fd = open(name, 2)) < 0) 1632804Swnj goto bad; 1642804Swnj 1652804Swnj if( read(fd, junk, 1) < 1) 1662804Swnj { 1672804Swnj close(fd); 1682804Swnj goto bad; 1692804Swnj } 1702804Swnj lseek(fd, 0L, 0); 1712804Swnj if( write(fd, junk, 1) < 1 ) 1722804Swnj { 1732804Swnj close(fd); 1742804Swnj goto bad; 1752804Swnj } 1762804Swnj close(fd); 1772804Swnj return; 1782804Swnj 1792804Swnj bad: 1802804Swnj fprintf(stderr, "Cannot touch %s\n", name); 1812804Swnj return; 1822804Swnj 1832804Swnj create: 1842804Swnj if( (fd = creat(name, 0666)) < 0) 1852804Swnj goto bad; 1862804Swnj close(fd); 1872804Swnj } 188