xref: /csrg-svn/old/make/dosys.c (revision 17586)
1*17586Ssam static	char *sccsid = "@(#)dosys.c	4.9 (Berkeley) 12/23/84;
22804Swnj #include "defs"
32804Swnj #include <signal.h>
42804Swnj 
52804Swnj dosys(comstring,nohalt)
62804Swnj register char *comstring;
72804Swnj int nohalt;
82804Swnj {
92804Swnj register int status;
102804Swnj 
112804Swnj if(metas(comstring))
122804Swnj 	status = doshell(comstring,nohalt);
132804Swnj else	status = doexec(comstring);
142804Swnj 
152804Swnj return(status);
162804Swnj }
172804Swnj 
182804Swnj 
192804Swnj 
202804Swnj metas(s)   /* Are there are any  Shell meta-characters? */
212804Swnj register char *s;
222804Swnj {
232804Swnj register char c;
242804Swnj 
252804Swnj while( (funny[c = *s++] & META) == 0 )
262804Swnj 	;
272804Swnj return( c );
282804Swnj }
292804Swnj 
302804Swnj doshell(comstring,nohalt)
312804Swnj char *comstring;
322804Swnj int nohalt;
332804Swnj {
342804Swnj #ifdef SHELLENV
352804Swnj char *getenv(), *rindex();
362804Swnj char *shellcom = getenv("SHELL");
372804Swnj char *shellstr;
382804Swnj #endif
3913258Sroot if((waitpid = vfork()) == 0)
402804Swnj 	{
412804Swnj 	enbint(SIG_DFL);
42*17586Ssam 	doclose();
432804Swnj 
442804Swnj #ifdef SHELLENV
452804Swnj 	if (shellcom == 0) shellcom = SHELLCOM;
462804Swnj 	shellstr = rindex(shellcom, '/') + 1;
472804Swnj 	execl(shellcom, shellstr, (nohalt ? "-c" : "-ce"), comstring, 0);
482804Swnj #else
492804Swnj 	execl(SHELLCOM, "sh", (nohalt ? "-c" : "-ce"), comstring, 0);
502804Swnj #endif
512804Swnj 	fatal("Couldn't load Shell");
522804Swnj 	}
532804Swnj 
542804Swnj return( await() );
552804Swnj }
562804Swnj 
572804Swnj 
582804Swnj 
592804Swnj 
602804Swnj int intrupt();
612804Swnj 
622804Swnj await()
632804Swnj {
642804Swnj int status;
652804Swnj register int pid;
662804Swnj 
672804Swnj enbint(SIG_IGN);
682804Swnj while( (pid = wait(&status)) != waitpid)
692804Swnj 	if(pid == -1)
702804Swnj 		fatal("bad wait code");
712804Swnj waitpid = 0;
722804Swnj enbint(intrupt);
732804Swnj return(status);
742804Swnj }
75*17586Ssam 
76*17586Ssam /*
77*17586Ssam  * Close open directory files before exec'ing
78*17586Ssam  */
79*17586Ssam doclose()
80*17586Ssam {
81*17586Ssam register struct dirhdr *od;
82*17586Ssam 
83*17586Ssam for (od = firstod; od; od = od->nxtopendir)
84*17586Ssam 	if (od->dirfc != NULL)
85*17586Ssam 		/*
86*17586Ssam 		 * vfork kludge...
87*17586Ssam 		 * we cannot call closedir since this will modify
88*17586Ssam 		 * the parents data space; just call close directly.
89*17586Ssam 		 */
90*17586Ssam 		close(od->dirfc->dd_fd);
91*17586Ssam }
922804Swnj 
932804Swnj 
942804Swnj 
958676Ssam #define MAXARGV	400
962804Swnj 
972804Swnj doexec(str)
982804Swnj register char *str;
992804Swnj {
1002804Swnj register char *t;
1018676Ssam char *argv[MAXARGV];
1022804Swnj register char **p;
1032804Swnj 
1042804Swnj while( *str==' ' || *str=='\t' )
1052804Swnj 	++str;
1062804Swnj if( *str == '\0' )
1072804Swnj 	return(-1);	/* no command */
1082804Swnj 
1092804Swnj p = argv;
1102804Swnj for(t = str ; *t ; )
1112804Swnj 	{
1128676Ssam 	if (p >= argv + MAXARGV)
1138676Ssam 		fatal1("%s: Too many arguments.", str);
1142804Swnj 	*p++ = t;
1152804Swnj 	while(*t!=' ' && *t!='\t' && *t!='\0')
1162804Swnj 		++t;
1172804Swnj 	if(*t)
1182804Swnj 		for( *t++ = '\0' ; *t==' ' || *t=='\t'  ; ++t)
1192804Swnj 			;
1202804Swnj 	}
1212804Swnj 
1222804Swnj *p = NULL;
1232804Swnj 
12416212Sralph if((waitpid = vfork()) == 0)
1252804Swnj 	{
1262804Swnj 	enbint(SIG_DFL);
127*17586Ssam 	doclose();
1282804Swnj 	enbint(intrupt);
1292804Swnj 	execvp(str, argv);
1302804Swnj 	fatal1("Cannot load %s",str);
1312804Swnj 	}
1322804Swnj 
1332804Swnj return( await() );
1342804Swnj }
1352804Swnj 
1362804Swnj #include <errno.h>
1372804Swnj 
1382804Swnj #include <sys/stat.h>
1392804Swnj 
1402804Swnj 
1412804Swnj 
1422804Swnj touch(force, name)
1432804Swnj int force;
1442804Swnj char *name;
1452804Swnj {
1462804Swnj struct stat stbuff;
1472804Swnj char junk[1];
1482804Swnj int fd;
1492804Swnj 
1502804Swnj if( stat(name,&stbuff) < 0)
1512804Swnj 	if(force)
1522804Swnj 		goto create;
1532804Swnj 	else
1542804Swnj 		{
1552804Swnj 		fprintf(stderr, "touch: file %s does not exist.\n", name);
1562804Swnj 		return;
1572804Swnj 		}
1582804Swnj 
1592804Swnj if(stbuff.st_size == 0)
1602804Swnj 	goto create;
1612804Swnj 
1622804Swnj if( (fd = open(name, 2)) < 0)
1632804Swnj 	goto bad;
1642804Swnj 
1652804Swnj if( read(fd, junk, 1) < 1)
1662804Swnj 	{
1672804Swnj 	close(fd);
1682804Swnj 	goto bad;
1692804Swnj 	}
1702804Swnj lseek(fd, 0L, 0);
1712804Swnj if( write(fd, junk, 1) < 1 )
1722804Swnj 	{
1732804Swnj 	close(fd);
1742804Swnj 	goto bad;
1752804Swnj 	}
1762804Swnj close(fd);
1772804Swnj return;
1782804Swnj 
1792804Swnj bad:
1802804Swnj 	fprintf(stderr, "Cannot touch %s\n", name);
1812804Swnj 	return;
1822804Swnj 
1832804Swnj create:
1842804Swnj 	if( (fd = creat(name, 0666)) < 0)
1852804Swnj 		goto bad;
1862804Swnj 	close(fd);
1872804Swnj }
188