xref: /csrg-svn/old/make/dosys.c (revision 46778)
1*46778Sbostic static	char *sccsid = "@(#)dosys.c	4.13 (Berkeley) 02/28/91";
22804Swnj #include "defs"
32804Swnj #include <signal.h>
42804Swnj 
dosys(comstring,nohalt)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 
metas(s)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 
doshell(comstring,nohalt)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);
4217586Ssam 	doclose();
432804Swnj 
442804Swnj #ifdef SHELLENV
452804Swnj 	if (shellcom == 0) shellcom = SHELLCOM;
462804Swnj 	shellstr = rindex(shellcom, '/') + 1;
4738147Smarc 	execl(shellcom, shellstr, (nohalt ? "-c" : "-ec"), comstring, 0);
482804Swnj #else
4938147Smarc 	execl(SHELLCOM, "sh", (nohalt ? "-c" : "-ec"), comstring, 0);
502804Swnj #endif
512804Swnj 	fatal("Couldn't load Shell");
522804Swnj 	}
532804Swnj 
542804Swnj return( await() );
552804Swnj }
562804Swnj 
572804Swnj 
582804Swnj 
592804Swnj 
60*46778Sbostic void intrupt();
612804Swnj 
await()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 }
7517586Ssam 
7617586Ssam /*
7717586Ssam  * Close open directory files before exec'ing
7817586Ssam  */
doclose()7917586Ssam doclose()
8017586Ssam {
8117586Ssam register struct dirhdr *od;
8217586Ssam 
8317586Ssam for (od = firstod; od; od = od->nxtopendir)
8417586Ssam 	if (od->dirfc != NULL)
8517586Ssam 		/*
8617586Ssam 		 * vfork kludge...
8717586Ssam 		 * we cannot call closedir since this will modify
8817586Ssam 		 * the parents data space; just call close directly.
8917586Ssam 		 */
9032620Sbostic 		(void)close(dirfd(od->dirfc));
9117586Ssam }
922804Swnj 
932804Swnj 
942804Swnj 
958676Ssam #define MAXARGV	400
962804Swnj 
doexec(str)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);
12717586Ssam 	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 
touch(force,name)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