1*12675Smckusick static char *sccsid = "@(#)dosys.c 4.6 (Berkeley) 83/05/22"; 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 39*12675Smckusick if((waitpid = fork()) == 0) 402804Swnj { 412804Swnj enbint(SIG_DFL); 422804Swnj 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 } 752804Swnj 762804Swnj 772804Swnj 782804Swnj 792804Swnj 802804Swnj 812804Swnj doclose() /* Close open directory files before exec'ing */ 822804Swnj { 836578Smckusick register struct dirhdr *od; 842804Swnj 852804Swnj for (od = firstod; od; od = od->nxtopendir) 866578Smckusick if (od->dirfc != NULL) { 876578Smckusick closedir(od->dirfc); 886578Smckusick od->dirfc = NULL; 896578Smckusick } 902804Swnj } 912804Swnj 922804Swnj 932804Swnj 948676Ssam #define MAXARGV 400 952804Swnj 962804Swnj doexec(str) 972804Swnj register char *str; 982804Swnj { 992804Swnj register char *t; 1008676Ssam char *argv[MAXARGV]; 1012804Swnj register char **p; 1022804Swnj 1032804Swnj while( *str==' ' || *str=='\t' ) 1042804Swnj ++str; 1052804Swnj if( *str == '\0' ) 1062804Swnj return(-1); /* no command */ 1072804Swnj 1082804Swnj p = argv; 1092804Swnj for(t = str ; *t ; ) 1102804Swnj { 1118676Ssam if (p >= argv + MAXARGV) 1128676Ssam fatal1("%s: Too many arguments.", str); 1132804Swnj *p++ = t; 1142804Swnj while(*t!=' ' && *t!='\t' && *t!='\0') 1152804Swnj ++t; 1162804Swnj if(*t) 1172804Swnj for( *t++ = '\0' ; *t==' ' || *t=='\t' ; ++t) 1182804Swnj ; 1192804Swnj } 1202804Swnj 1212804Swnj *p = NULL; 1222804Swnj 123*12675Smckusick if((waitpid = fork()) == 0) 1242804Swnj { 1252804Swnj enbint(SIG_DFL); 1262804Swnj doclose(); 1272804Swnj enbint(intrupt); 1282804Swnj execvp(str, argv); 1292804Swnj fatal1("Cannot load %s",str); 1302804Swnj } 1312804Swnj 1322804Swnj return( await() ); 1332804Swnj } 1342804Swnj 1352804Swnj #include <errno.h> 1362804Swnj 1372804Swnj #include <sys/stat.h> 1382804Swnj 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