xref: /csrg-svn/old/make/dosys.c (revision 12675)
1*12675Smckusick static	char *sccsid = "@(#)dosys.c	4.6 (Berkeley) 83/05/22";
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
39*12675Smckusick if((waitpid = fork()) == 0)
402804Swnj 	{
412804Swnj 	enbint(SIG_DFL);
422804Swnj 	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 }
752804Swnj 
762804Swnj 
772804Swnj 
782804Swnj 
792804Swnj 
802804Swnj 
812804Swnj doclose()	/* Close open directory files before exec'ing */
822804Swnj {
836578Smckusick register struct dirhdr *od;
842804Swnj 
852804Swnj for (od = firstod; od; od = od->nxtopendir)
866578Smckusick 	if (od->dirfc != NULL) {
876578Smckusick 		closedir(od->dirfc);
886578Smckusick 		od->dirfc = NULL;
896578Smckusick 	}
902804Swnj }
912804Swnj 
922804Swnj 
932804Swnj 
948676Ssam #define MAXARGV	400
952804Swnj 
962804Swnj doexec(str)
972804Swnj register char *str;
982804Swnj {
992804Swnj register char *t;
1008676Ssam char *argv[MAXARGV];
1012804Swnj register char **p;
1022804Swnj 
1032804Swnj while( *str==' ' || *str=='\t' )
1042804Swnj 	++str;
1052804Swnj if( *str == '\0' )
1062804Swnj 	return(-1);	/* no command */
1072804Swnj 
1082804Swnj p = argv;
1092804Swnj for(t = str ; *t ; )
1102804Swnj 	{
1118676Ssam 	if (p >= argv + MAXARGV)
1128676Ssam 		fatal1("%s: Too many arguments.", str);
1132804Swnj 	*p++ = t;
1142804Swnj 	while(*t!=' ' && *t!='\t' && *t!='\0')
1152804Swnj 		++t;
1162804Swnj 	if(*t)
1172804Swnj 		for( *t++ = '\0' ; *t==' ' || *t=='\t'  ; ++t)
1182804Swnj 			;
1192804Swnj 	}
1202804Swnj 
1212804Swnj *p = NULL;
1222804Swnj 
123*12675Smckusick if((waitpid = fork()) == 0)
1242804Swnj 	{
1252804Swnj 	enbint(SIG_DFL);
1262804Swnj 	doclose();
1272804Swnj 	enbint(intrupt);
1282804Swnj 	execvp(str, argv);
1292804Swnj 	fatal1("Cannot load %s",str);
1302804Swnj 	}
1312804Swnj 
1322804Swnj return( await() );
1332804Swnj }
1342804Swnj 
1352804Swnj #include <errno.h>
1362804Swnj 
1372804Swnj #include <sys/stat.h>
1382804Swnj 
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