1*6178Ssam static char *sccsid = "@(#)dosys.c 4.2 (Berkeley) 82/03/14"; 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 392804Swnj if((waitpid = vfork()) == 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 { 832804Swnj register struct opendir *od; 842804Swnj 852804Swnj for (od = firstod; od; od = od->nxtopendir) 862804Swnj if (od->dirfc != NULL) 872804Swnj /* fclose(od->dirfc); */ 882804Swnj close(od->dirfc->_file); 892804Swnj } 902804Swnj 912804Swnj 922804Swnj 932804Swnj 942804Swnj 952804Swnj doexec(str) 962804Swnj register char *str; 972804Swnj { 982804Swnj register char *t; 992804Swnj char *argv[200]; 1002804Swnj register char **p; 1012804Swnj 1022804Swnj while( *str==' ' || *str=='\t' ) 1032804Swnj ++str; 1042804Swnj if( *str == '\0' ) 1052804Swnj return(-1); /* no command */ 1062804Swnj 1072804Swnj p = argv; 1082804Swnj for(t = str ; *t ; ) 1092804Swnj { 1102804Swnj *p++ = t; 1112804Swnj while(*t!=' ' && *t!='\t' && *t!='\0') 1122804Swnj ++t; 1132804Swnj if(*t) 1142804Swnj for( *t++ = '\0' ; *t==' ' || *t=='\t' ; ++t) 1152804Swnj ; 1162804Swnj } 1172804Swnj 1182804Swnj *p = NULL; 1192804Swnj 1202804Swnj if((waitpid = vfork()) == 0) 1212804Swnj { 1222804Swnj enbint(SIG_DFL); 1232804Swnj doclose(); 1242804Swnj enbint(intrupt); 1252804Swnj execvp(str, argv); 1262804Swnj fatal1("Cannot load %s",str); 1272804Swnj } 1282804Swnj 1292804Swnj return( await() ); 1302804Swnj } 1312804Swnj 1322804Swnj #include <errno.h> 1332804Swnj 1342804Swnj #include <sys/types.h> 1352804Swnj #include <sys/stat.h> 1362804Swnj 1372804Swnj 1382804Swnj 1392804Swnj 1402804Swnj touch(force, name) 1412804Swnj int force; 1422804Swnj char *name; 1432804Swnj { 1442804Swnj struct stat stbuff; 1452804Swnj char junk[1]; 1462804Swnj int fd; 1472804Swnj 148*6178Ssam #if vax 149*6178Ssam if (lstat(name, &stbuff) < 0) 150*6178Ssam #else 1512804Swnj if( stat(name,&stbuff) < 0) 152*6178Ssam #endif 1532804Swnj if(force) 1542804Swnj goto create; 1552804Swnj else 1562804Swnj { 1572804Swnj fprintf(stderr, "touch: file %s does not exist.\n", name); 1582804Swnj return; 1592804Swnj } 1602804Swnj 1612804Swnj if(stbuff.st_size == 0) 1622804Swnj goto create; 1632804Swnj 1642804Swnj if( (fd = open(name, 2)) < 0) 1652804Swnj goto bad; 1662804Swnj 1672804Swnj if( read(fd, junk, 1) < 1) 1682804Swnj { 1692804Swnj close(fd); 1702804Swnj goto bad; 1712804Swnj } 1722804Swnj lseek(fd, 0L, 0); 1732804Swnj if( write(fd, junk, 1) < 1 ) 1742804Swnj { 1752804Swnj close(fd); 1762804Swnj goto bad; 1772804Swnj } 1782804Swnj close(fd); 1792804Swnj return; 1802804Swnj 1812804Swnj bad: 1822804Swnj fprintf(stderr, "Cannot touch %s\n", name); 1832804Swnj return; 1842804Swnj 1852804Swnj create: 1862804Swnj if( (fd = creat(name, 0666)) < 0) 1872804Swnj goto bad; 1882804Swnj close(fd); 1892804Swnj } 190