1*16212Sralph static char *sccsid = "@(#)dosys.c 4.8 (Berkeley) 84/03/21"; 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); 422804Swnj 432804Swnj #ifdef SHELLENV 442804Swnj if (shellcom == 0) shellcom = SHELLCOM; 452804Swnj shellstr = rindex(shellcom, '/') + 1; 462804Swnj execl(shellcom, shellstr, (nohalt ? "-c" : "-ce"), comstring, 0); 472804Swnj #else 482804Swnj execl(SHELLCOM, "sh", (nohalt ? "-c" : "-ce"), comstring, 0); 492804Swnj #endif 502804Swnj fatal("Couldn't load Shell"); 512804Swnj } 522804Swnj 532804Swnj return( await() ); 542804Swnj } 552804Swnj 562804Swnj 572804Swnj 582804Swnj 592804Swnj int intrupt(); 602804Swnj 612804Swnj await() 622804Swnj { 632804Swnj int status; 642804Swnj register int pid; 652804Swnj 662804Swnj enbint(SIG_IGN); 672804Swnj while( (pid = wait(&status)) != waitpid) 682804Swnj if(pid == -1) 692804Swnj fatal("bad wait code"); 702804Swnj waitpid = 0; 712804Swnj enbint(intrupt); 722804Swnj return(status); 732804Swnj } 742804Swnj 752804Swnj 762804Swnj 778676Ssam #define MAXARGV 400 782804Swnj 792804Swnj doexec(str) 802804Swnj register char *str; 812804Swnj { 822804Swnj register char *t; 838676Ssam char *argv[MAXARGV]; 842804Swnj register char **p; 852804Swnj 862804Swnj while( *str==' ' || *str=='\t' ) 872804Swnj ++str; 882804Swnj if( *str == '\0' ) 892804Swnj return(-1); /* no command */ 902804Swnj 912804Swnj p = argv; 922804Swnj for(t = str ; *t ; ) 932804Swnj { 948676Ssam if (p >= argv + MAXARGV) 958676Ssam fatal1("%s: Too many arguments.", str); 962804Swnj *p++ = t; 972804Swnj while(*t!=' ' && *t!='\t' && *t!='\0') 982804Swnj ++t; 992804Swnj if(*t) 1002804Swnj for( *t++ = '\0' ; *t==' ' || *t=='\t' ; ++t) 1012804Swnj ; 1022804Swnj } 1032804Swnj 1042804Swnj *p = NULL; 1052804Swnj 106*16212Sralph if((waitpid = vfork()) == 0) 1072804Swnj { 1082804Swnj enbint(SIG_DFL); 1092804Swnj enbint(intrupt); 1102804Swnj execvp(str, argv); 1112804Swnj fatal1("Cannot load %s",str); 1122804Swnj } 1132804Swnj 1142804Swnj return( await() ); 1152804Swnj } 1162804Swnj 1172804Swnj #include <errno.h> 1182804Swnj 1192804Swnj #include <sys/stat.h> 1202804Swnj 1212804Swnj 1222804Swnj 1232804Swnj touch(force, name) 1242804Swnj int force; 1252804Swnj char *name; 1262804Swnj { 1272804Swnj struct stat stbuff; 1282804Swnj char junk[1]; 1292804Swnj int fd; 1302804Swnj 1312804Swnj if( stat(name,&stbuff) < 0) 1322804Swnj if(force) 1332804Swnj goto create; 1342804Swnj else 1352804Swnj { 1362804Swnj fprintf(stderr, "touch: file %s does not exist.\n", name); 1372804Swnj return; 1382804Swnj } 1392804Swnj 1402804Swnj if(stbuff.st_size == 0) 1412804Swnj goto create; 1422804Swnj 1432804Swnj if( (fd = open(name, 2)) < 0) 1442804Swnj goto bad; 1452804Swnj 1462804Swnj if( read(fd, junk, 1) < 1) 1472804Swnj { 1482804Swnj close(fd); 1492804Swnj goto bad; 1502804Swnj } 1512804Swnj lseek(fd, 0L, 0); 1522804Swnj if( write(fd, junk, 1) < 1 ) 1532804Swnj { 1542804Swnj close(fd); 1552804Swnj goto bad; 1562804Swnj } 1572804Swnj close(fd); 1582804Swnj return; 1592804Swnj 1602804Swnj bad: 1612804Swnj fprintf(stderr, "Cannot touch %s\n", name); 1622804Swnj return; 1632804Swnj 1642804Swnj create: 1652804Swnj if( (fd = creat(name, 0666)) < 0) 1662804Swnj goto bad; 1672804Swnj close(fd); 1682804Swnj } 169