xref: /csrg-svn/old/make/dosys.c (revision 6178)
1*6178Ssam static	char *sccsid = "@(#)dosys.c	4.2 (Berkeley) 82/03/14";
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
392804Swnj if((waitpid = vfork()) == 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 {
832804Swnj register struct opendir *od;
842804Swnj 
852804Swnj for (od = firstod; od; od = od->nxtopendir)
862804Swnj 	if (od->dirfc != NULL)
872804Swnj 		/* fclose(od->dirfc); */
882804Swnj 		close(od->dirfc->_file);
892804Swnj }
902804Swnj 
912804Swnj 
922804Swnj 
932804Swnj 
942804Swnj 
952804Swnj doexec(str)
962804Swnj register char *str;
972804Swnj {
982804Swnj register char *t;
992804Swnj char *argv[200];
1002804Swnj register char **p;
1012804Swnj 
1022804Swnj while( *str==' ' || *str=='\t' )
1032804Swnj 	++str;
1042804Swnj if( *str == '\0' )
1052804Swnj 	return(-1);	/* no command */
1062804Swnj 
1072804Swnj p = argv;
1082804Swnj for(t = str ; *t ; )
1092804Swnj 	{
1102804Swnj 	*p++ = t;
1112804Swnj 	while(*t!=' ' && *t!='\t' && *t!='\0')
1122804Swnj 		++t;
1132804Swnj 	if(*t)
1142804Swnj 		for( *t++ = '\0' ; *t==' ' || *t=='\t'  ; ++t)
1152804Swnj 			;
1162804Swnj 	}
1172804Swnj 
1182804Swnj *p = NULL;
1192804Swnj 
1202804Swnj if((waitpid = vfork()) == 0)
1212804Swnj 	{
1222804Swnj 	enbint(SIG_DFL);
1232804Swnj 	doclose();
1242804Swnj 	enbint(intrupt);
1252804Swnj 	execvp(str, argv);
1262804Swnj 	fatal1("Cannot load %s",str);
1272804Swnj 	}
1282804Swnj 
1292804Swnj return( await() );
1302804Swnj }
1312804Swnj 
1322804Swnj #include <errno.h>
1332804Swnj 
1342804Swnj #include <sys/types.h>
1352804Swnj #include <sys/stat.h>
1362804Swnj 
1372804Swnj 
1382804Swnj 
1392804Swnj 
1402804Swnj touch(force, name)
1412804Swnj int force;
1422804Swnj char *name;
1432804Swnj {
1442804Swnj struct stat stbuff;
1452804Swnj char junk[1];
1462804Swnj int fd;
1472804Swnj 
148*6178Ssam #if vax
149*6178Ssam if (lstat(name, &stbuff) < 0)
150*6178Ssam #else
1512804Swnj if( stat(name,&stbuff) < 0)
152*6178Ssam #endif
1532804Swnj 	if(force)
1542804Swnj 		goto create;
1552804Swnj 	else
1562804Swnj 		{
1572804Swnj 		fprintf(stderr, "touch: file %s does not exist.\n", name);
1582804Swnj 		return;
1592804Swnj 		}
1602804Swnj 
1612804Swnj if(stbuff.st_size == 0)
1622804Swnj 	goto create;
1632804Swnj 
1642804Swnj if( (fd = open(name, 2)) < 0)
1652804Swnj 	goto bad;
1662804Swnj 
1672804Swnj if( read(fd, junk, 1) < 1)
1682804Swnj 	{
1692804Swnj 	close(fd);
1702804Swnj 	goto bad;
1712804Swnj 	}
1722804Swnj lseek(fd, 0L, 0);
1732804Swnj if( write(fd, junk, 1) < 1 )
1742804Swnj 	{
1752804Swnj 	close(fd);
1762804Swnj 	goto bad;
1772804Swnj 	}
1782804Swnj close(fd);
1792804Swnj return;
1802804Swnj 
1812804Swnj bad:
1822804Swnj 	fprintf(stderr, "Cannot touch %s\n", name);
1832804Swnj 	return;
1842804Swnj 
1852804Swnj create:
1862804Swnj 	if( (fd = creat(name, 0666)) < 0)
1872804Swnj 		goto bad;
1882804Swnj 	close(fd);
1892804Swnj }
190