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