1*46778Sbostic static char *sccsid = "@(#)dosys.c 4.13 (Berkeley) 02/28/91";
22804Swnj #include "defs"
32804Swnj #include <signal.h>
42804Swnj
dosys(comstring,nohalt)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
metas(s)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
doshell(comstring,nohalt)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;
4738147Smarc execl(shellcom, shellstr, (nohalt ? "-c" : "-ec"), comstring, 0);
482804Swnj #else
4938147Smarc execl(SHELLCOM, "sh", (nohalt ? "-c" : "-ec"), comstring, 0);
502804Swnj #endif
512804Swnj fatal("Couldn't load Shell");
522804Swnj }
532804Swnj
542804Swnj return( await() );
552804Swnj }
562804Swnj
572804Swnj
582804Swnj
592804Swnj
60*46778Sbostic void intrupt();
612804Swnj
await()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 */
doclose()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 */
9032620Sbostic (void)close(dirfd(od->dirfc));
9117586Ssam }
922804Swnj
932804Swnj
942804Swnj
958676Ssam #define MAXARGV 400
962804Swnj
doexec(str)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
touch(force,name)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