PWB1/sys/source/s2/make.d/dosys.c
# include "defs"
dosys(comstring,nohalt)
char *comstring;
int nohalt;
{
int status;
if(metas(comstring))
status = doshell(comstring,nohalt);
else status = doexec(comstring);
return(status>>8);
}
metas(s) /* Are there are any Shell meta-characters? */
char *s;
{
for(;;) switch(*s++)
{
case '|': case '^':
case '(': case ')':
case ';': case '&':
case '<': case '>':
case '*': case '?':
case '[': case ']':
case '\\': case '\n':
case '\'': case '"':
case '`': case '$':
case ':':
return(1);
case '\0':
return(0);
};
}
doshell(comstring,nohalt)
char *comstring;
int nohalt;
{
if(fork() == 0)
{
enbint(0);
doclose();
if( execl(SHELLCOM, "sh", "-c", comstring, 0) )
fatal("Couldn't load Shell");
}
return( await() );
}
await()
{
int intrupt();
int status;
disint();
wait(&status);
enbint(intrupt);
return(status);
}
doclose() /* Close open directory files before exec'ing */
{
register struct opendir *od;
for (od = firstod; od != 0; od = od->nextp)
if (od->dirfc != NULL)
fclose(od->dirfc);
}
doexec(str)
char *str;
{
register char *s, *t;
char *argv[100], pool[1000];
int status;
int argc;
argc = 0;
s = pool;
for(t=str ; *t!='\0' ; )
{
while(*t==' '|| *t=='\t') ++t;
if(*t == '\0') break;
argv[argc++] = s;
while(*t!=' ' && *t!='\t' && *t!='\0') *s++ = *t++;
*s++ = '\0';
}
if(argc == 0) /* no command */
return(-1);
argv[argc] = 0;
if(fork() == 0)
{
enbint(0);
doclose();
pexec(argv[0], argv);
fprintf(stderr, "*** Cannot load %s",argv[0]);
fatal("");
}
return( await() );
}
char junkname[16];
touch(s)
char *s;
{
if(junkname[0] == 0)
sprintf(junkname, "MAKEJUNK%d", getpid() );
link(s, junkname);
unlink(junkname);
}