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