main dosys.c
  1# include "defs"
  2#include <unistd.h>
  3
  4dosys(comstring,nohalt)
  5char *comstring;
  6int nohalt;
  7{
  8int status;
  9
 10if(metas(comstring))
 11	status = doshell(comstring,nohalt);
 12else	status = doexec(comstring);
 13
 14return(status>>8);
 15}
 16
 17
 18
 19metas(s)   /* Are there are any  Shell meta-characters? */
 20char *s;
 21{
 22for(;;) switch(*s++)
 23	{
 24	case '|':   case '^':
 25	case '(':   case ')':
 26	case ';':   case '&':
 27	case '<':   case '>':
 28	case '*':   case '?':
 29	case '[':   case ']':
 30	case '\\':  case '\n':
 31	case '\'':  case '"':
 32	case '`':   case '$':
 33	case ':':
 34		return(1);
 35
 36	case '\0':
 37		return(0);
 38	};
 39}
 40
 41doshell(comstring,nohalt)
 42char *comstring;
 43int nohalt;
 44{
 45if(fork() == 0)
 46	{
 47	enbint(SIG_DFL);
 48	doclose();
 49
 50	if( execl(SHELLCOM, "sh", "-c", comstring, 0) )
 51		fatal("Couldn't load Shell");
 52	}
 53
 54return( await() );
 55}
 56
 57
 58
 59
 60await()
 61{
 62int status;
 63
 64disint();
 65wait(&status);
 66enbint(intrupt);
 67return(status);
 68}
 69
 70
 71
 72
 73
 74
 75doclose()	/* Close open directory files before exec'ing */
 76{
 77register struct opendir *od;
 78for (od = firstod; od != 0; od = od->nextp)
 79	if (od->dirfc != NULL)
 80		fclose(od->dirfc);
 81}
 82
 83
 84
 85
 86doexec(str)
 87char *str;
 88{
 89register char *s, *t;
 90char *argv[100], pool[1000];
 91int status;
 92int argc;
 93
 94
 95argc = 0;
 96s = pool;
 97
 98for(t=str ; *t!='\0' ; )
 99	{
100	while(*t==' '|| *t=='\t') ++t;
101	if(*t == '\0') break;
102
103	argv[argc++] = s;
104	while(*t!=' '  && *t!='\t' && *t!='\0') *s++ = *t++;
105	*s++ = '\0';
106	}
107
108if(argc == 0)   /* no command */
109	return(-1);
110argv[argc] = 0;
111
112if(fork() == 0)
113	{
114	enbint(SIG_DFL);
115	doclose();
116
117	pexec(argv[0], argv);
118	fprintf(stderr,  "*** Cannot load %s",argv[0]);
119	fatal("");
120	}
121
122return( await() );
123}
124
125
126 char junkname[16];
127
128touch(s)
129char *s;
130{
131if(junkname[0] == 0)
132	sprintf(junkname,  "MAKEJUNK%d", getpid() );
133
134link(s, junkname);
135unlink(junkname);
136}