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}