1*2804Swnj static char *sccsid = "@(#)dosys.c 4.1 (Berkeley) 81/02/28"; 2*2804Swnj #include "defs" 3*2804Swnj #include <signal.h> 4*2804Swnj 5*2804Swnj dosys(comstring,nohalt) 6*2804Swnj register char *comstring; 7*2804Swnj int nohalt; 8*2804Swnj { 9*2804Swnj register int status; 10*2804Swnj 11*2804Swnj if(metas(comstring)) 12*2804Swnj status = doshell(comstring,nohalt); 13*2804Swnj else status = doexec(comstring); 14*2804Swnj 15*2804Swnj return(status); 16*2804Swnj } 17*2804Swnj 18*2804Swnj 19*2804Swnj 20*2804Swnj metas(s) /* Are there are any Shell meta-characters? */ 21*2804Swnj register char *s; 22*2804Swnj { 23*2804Swnj register char c; 24*2804Swnj 25*2804Swnj while( (funny[c = *s++] & META) == 0 ) 26*2804Swnj ; 27*2804Swnj return( c ); 28*2804Swnj } 29*2804Swnj 30*2804Swnj doshell(comstring,nohalt) 31*2804Swnj char *comstring; 32*2804Swnj int nohalt; 33*2804Swnj { 34*2804Swnj #ifdef SHELLENV 35*2804Swnj char *getenv(), *rindex(); 36*2804Swnj char *shellcom = getenv("SHELL"); 37*2804Swnj char *shellstr; 38*2804Swnj #endif 39*2804Swnj if((waitpid = vfork()) == 0) 40*2804Swnj { 41*2804Swnj enbint(SIG_DFL); 42*2804Swnj doclose(); 43*2804Swnj 44*2804Swnj #ifdef SHELLENV 45*2804Swnj if (shellcom == 0) shellcom = SHELLCOM; 46*2804Swnj shellstr = rindex(shellcom, '/') + 1; 47*2804Swnj execl(shellcom, shellstr, (nohalt ? "-c" : "-ce"), comstring, 0); 48*2804Swnj #else 49*2804Swnj execl(SHELLCOM, "sh", (nohalt ? "-c" : "-ce"), comstring, 0); 50*2804Swnj #endif 51*2804Swnj fatal("Couldn't load Shell"); 52*2804Swnj } 53*2804Swnj 54*2804Swnj return( await() ); 55*2804Swnj } 56*2804Swnj 57*2804Swnj 58*2804Swnj 59*2804Swnj 60*2804Swnj int intrupt(); 61*2804Swnj 62*2804Swnj await() 63*2804Swnj { 64*2804Swnj int status; 65*2804Swnj register int pid; 66*2804Swnj 67*2804Swnj enbint(SIG_IGN); 68*2804Swnj while( (pid = wait(&status)) != waitpid) 69*2804Swnj if(pid == -1) 70*2804Swnj fatal("bad wait code"); 71*2804Swnj waitpid = 0; 72*2804Swnj enbint(intrupt); 73*2804Swnj return(status); 74*2804Swnj } 75*2804Swnj 76*2804Swnj 77*2804Swnj 78*2804Swnj 79*2804Swnj 80*2804Swnj 81*2804Swnj doclose() /* Close open directory files before exec'ing */ 82*2804Swnj { 83*2804Swnj register struct opendir *od; 84*2804Swnj 85*2804Swnj for (od = firstod; od; od = od->nxtopendir) 86*2804Swnj if (od->dirfc != NULL) 87*2804Swnj /* fclose(od->dirfc); */ 88*2804Swnj close(od->dirfc->_file); 89*2804Swnj } 90*2804Swnj 91*2804Swnj 92*2804Swnj 93*2804Swnj 94*2804Swnj 95*2804Swnj doexec(str) 96*2804Swnj register char *str; 97*2804Swnj { 98*2804Swnj register char *t; 99*2804Swnj char *argv[200]; 100*2804Swnj register char **p; 101*2804Swnj 102*2804Swnj while( *str==' ' || *str=='\t' ) 103*2804Swnj ++str; 104*2804Swnj if( *str == '\0' ) 105*2804Swnj return(-1); /* no command */ 106*2804Swnj 107*2804Swnj p = argv; 108*2804Swnj for(t = str ; *t ; ) 109*2804Swnj { 110*2804Swnj *p++ = t; 111*2804Swnj while(*t!=' ' && *t!='\t' && *t!='\0') 112*2804Swnj ++t; 113*2804Swnj if(*t) 114*2804Swnj for( *t++ = '\0' ; *t==' ' || *t=='\t' ; ++t) 115*2804Swnj ; 116*2804Swnj } 117*2804Swnj 118*2804Swnj *p = NULL; 119*2804Swnj 120*2804Swnj if((waitpid = vfork()) == 0) 121*2804Swnj { 122*2804Swnj enbint(SIG_DFL); 123*2804Swnj doclose(); 124*2804Swnj enbint(intrupt); 125*2804Swnj execvp(str, argv); 126*2804Swnj fatal1("Cannot load %s",str); 127*2804Swnj } 128*2804Swnj 129*2804Swnj return( await() ); 130*2804Swnj } 131*2804Swnj 132*2804Swnj #include <errno.h> 133*2804Swnj 134*2804Swnj #include <sys/types.h> 135*2804Swnj #include <sys/stat.h> 136*2804Swnj 137*2804Swnj 138*2804Swnj 139*2804Swnj 140*2804Swnj touch(force, name) 141*2804Swnj int force; 142*2804Swnj char *name; 143*2804Swnj { 144*2804Swnj struct stat stbuff; 145*2804Swnj char junk[1]; 146*2804Swnj int fd; 147*2804Swnj 148*2804Swnj if( stat(name,&stbuff) < 0) 149*2804Swnj if(force) 150*2804Swnj goto create; 151*2804Swnj else 152*2804Swnj { 153*2804Swnj fprintf(stderr, "touch: file %s does not exist.\n", name); 154*2804Swnj return; 155*2804Swnj } 156*2804Swnj 157*2804Swnj if(stbuff.st_size == 0) 158*2804Swnj goto create; 159*2804Swnj 160*2804Swnj if( (fd = open(name, 2)) < 0) 161*2804Swnj goto bad; 162*2804Swnj 163*2804Swnj if( read(fd, junk, 1) < 1) 164*2804Swnj { 165*2804Swnj close(fd); 166*2804Swnj goto bad; 167*2804Swnj } 168*2804Swnj lseek(fd, 0L, 0); 169*2804Swnj if( write(fd, junk, 1) < 1 ) 170*2804Swnj { 171*2804Swnj close(fd); 172*2804Swnj goto bad; 173*2804Swnj } 174*2804Swnj close(fd); 175*2804Swnj return; 176*2804Swnj 177*2804Swnj bad: 178*2804Swnj fprintf(stderr, "Cannot touch %s\n", name); 179*2804Swnj return; 180*2804Swnj 181*2804Swnj create: 182*2804Swnj if( (fd = creat(name, 0666)) < 0) 183*2804Swnj goto bad; 184*2804Swnj close(fd); 185*2804Swnj } 186