xref: /csrg-svn/old/make/dosys.c (revision 16212)
1*16212Sralph static	char *sccsid = "@(#)dosys.c	4.8 (Berkeley) 84/03/21";
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);
422804Swnj 
432804Swnj #ifdef SHELLENV
442804Swnj 	if (shellcom == 0) shellcom = SHELLCOM;
452804Swnj 	shellstr = rindex(shellcom, '/') + 1;
462804Swnj 	execl(shellcom, shellstr, (nohalt ? "-c" : "-ce"), comstring, 0);
472804Swnj #else
482804Swnj 	execl(SHELLCOM, "sh", (nohalt ? "-c" : "-ce"), comstring, 0);
492804Swnj #endif
502804Swnj 	fatal("Couldn't load Shell");
512804Swnj 	}
522804Swnj 
532804Swnj return( await() );
542804Swnj }
552804Swnj 
562804Swnj 
572804Swnj 
582804Swnj 
592804Swnj int intrupt();
602804Swnj 
612804Swnj await()
622804Swnj {
632804Swnj int status;
642804Swnj register int pid;
652804Swnj 
662804Swnj enbint(SIG_IGN);
672804Swnj while( (pid = wait(&status)) != waitpid)
682804Swnj 	if(pid == -1)
692804Swnj 		fatal("bad wait code");
702804Swnj waitpid = 0;
712804Swnj enbint(intrupt);
722804Swnj return(status);
732804Swnj }
742804Swnj 
752804Swnj 
762804Swnj 
778676Ssam #define MAXARGV	400
782804Swnj 
792804Swnj doexec(str)
802804Swnj register char *str;
812804Swnj {
822804Swnj register char *t;
838676Ssam char *argv[MAXARGV];
842804Swnj register char **p;
852804Swnj 
862804Swnj while( *str==' ' || *str=='\t' )
872804Swnj 	++str;
882804Swnj if( *str == '\0' )
892804Swnj 	return(-1);	/* no command */
902804Swnj 
912804Swnj p = argv;
922804Swnj for(t = str ; *t ; )
932804Swnj 	{
948676Ssam 	if (p >= argv + MAXARGV)
958676Ssam 		fatal1("%s: Too many arguments.", str);
962804Swnj 	*p++ = t;
972804Swnj 	while(*t!=' ' && *t!='\t' && *t!='\0')
982804Swnj 		++t;
992804Swnj 	if(*t)
1002804Swnj 		for( *t++ = '\0' ; *t==' ' || *t=='\t'  ; ++t)
1012804Swnj 			;
1022804Swnj 	}
1032804Swnj 
1042804Swnj *p = NULL;
1052804Swnj 
106*16212Sralph if((waitpid = vfork()) == 0)
1072804Swnj 	{
1082804Swnj 	enbint(SIG_DFL);
1092804Swnj 	enbint(intrupt);
1102804Swnj 	execvp(str, argv);
1112804Swnj 	fatal1("Cannot load %s",str);
1122804Swnj 	}
1132804Swnj 
1142804Swnj return( await() );
1152804Swnj }
1162804Swnj 
1172804Swnj #include <errno.h>
1182804Swnj 
1192804Swnj #include <sys/stat.h>
1202804Swnj 
1212804Swnj 
1222804Swnj 
1232804Swnj touch(force, name)
1242804Swnj int force;
1252804Swnj char *name;
1262804Swnj {
1272804Swnj struct stat stbuff;
1282804Swnj char junk[1];
1292804Swnj int fd;
1302804Swnj 
1312804Swnj if( stat(name,&stbuff) < 0)
1322804Swnj 	if(force)
1332804Swnj 		goto create;
1342804Swnj 	else
1352804Swnj 		{
1362804Swnj 		fprintf(stderr, "touch: file %s does not exist.\n", name);
1372804Swnj 		return;
1382804Swnj 		}
1392804Swnj 
1402804Swnj if(stbuff.st_size == 0)
1412804Swnj 	goto create;
1422804Swnj 
1432804Swnj if( (fd = open(name, 2)) < 0)
1442804Swnj 	goto bad;
1452804Swnj 
1462804Swnj if( read(fd, junk, 1) < 1)
1472804Swnj 	{
1482804Swnj 	close(fd);
1492804Swnj 	goto bad;
1502804Swnj 	}
1512804Swnj lseek(fd, 0L, 0);
1522804Swnj if( write(fd, junk, 1) < 1 )
1532804Swnj 	{
1542804Swnj 	close(fd);
1552804Swnj 	goto bad;
1562804Swnj 	}
1572804Swnj close(fd);
1582804Swnj return;
1592804Swnj 
1602804Swnj bad:
1612804Swnj 	fprintf(stderr, "Cannot touch %s\n", name);
1622804Swnj 	return;
1632804Swnj 
1642804Swnj create:
1652804Swnj 	if( (fd = creat(name, 0666)) < 0)
1662804Swnj 		goto bad;
1672804Swnj 	close(fd);
1682804Swnj }
169