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