version 1.42, 2001/11/22 21:18:10 |
version 1.43, 2001/11/22 23:56:43 |
|
|
|
|
static char meta[256]; |
static char meta[256]; |
|
|
static GNode *curTarg = NULL; |
|
static GNode *ENDNode; |
static GNode *ENDNode; |
static void CompatInterrupt(int); |
static void CompatInterrupt(int); |
static int CompatRunCommand(void *, void *); |
static int CompatRunCommand(void *, void *); |
static void CompatMake(void *, void *); |
static void CompatMake(void *, void *); |
static int shellneed(char **); |
static int shellneed(char **); |
|
|
/*- |
static volatile sig_atomic_t interrupted; |
*----------------------------------------------------------------------- |
|
* CompatInterrupt -- |
static void |
* Interrupt the creation of the current target and remove it if |
|
* it ain't precious. |
|
* |
|
* Side Effects: |
|
* The target is removed and the process exits. If .INTERRUPT exists, |
|
* its commands are run first WITH INTERRUPTS IGNORED.. |
|
*----------------------------------------------------------------------- |
|
*/ |
|
static void |
|
CompatInterrupt(signo) |
CompatInterrupt(signo) |
int signo; |
int signo; |
{ |
{ |
GNode *gn; |
if (interrupted != SIGINT) |
|
interrupted = signo; |
if (curTarg != NULL && !Targ_Precious(curTarg)) { |
|
char *file = Varq_Value(TARGET_INDEX, curTarg); |
|
|
|
if (!noExecute && eunlink(file) != -1) |
|
Error("*** %s removed\n", file); |
|
|
|
/* Run .INTERRUPT only if hit with interrupt signal. */ |
|
if (signo == SIGINT) { |
|
gn = Targ_FindNode(".INTERRUPT", TARG_NOCREATE); |
|
if (gn != NULL) |
|
Lst_Find(&gn->commands, CompatRunCommand, gn); |
|
} |
|
|
|
} |
|
_exit(signo); |
|
} |
} |
|
|
/*- |
/*- |
|
|
break; |
break; |
} |
} |
|
|
|
if (interrupted) |
|
break; |
|
|
if (stat != -1) { |
if (stat != -1) { |
if (WIFSTOPPED(reason)) |
if (WIFSTOPPED(reason)) |
status = WSTOPSIG(reason); /* stopped */ |
status = WSTOPSIG(reason); /* stopped */ |
|
|
status = 0; |
status = 0; |
} |
} |
} |
} |
break; |
return !status; |
} else |
} else |
Fatal("error in wait: %d", stat); |
Fatal("error in wait: %d", stat); |
/*NOTREACHED*/ |
/*NOTREACHED*/ |
} |
} |
|
|
return !status; |
/* This is reached only if interrupted */ |
|
if (!Targ_Precious(gn)) { |
|
char *file = Varq_Value(TARGET_INDEX, gn); |
|
|
|
if (!noExecute && eunlink(file) != -1) |
|
Error("*** %s removed\n", file); |
|
} |
|
if (interrupted == SIGINT) { |
|
GNode *i = Targ_FindNode(".INTERRUPT", TARG_NOCREATE); |
|
signal(SIGINT, SIG_IGN); |
|
signal(SIGTERM, SIG_IGN); |
|
signal(SIGHUP, SIG_IGN); |
|
signal(SIGQUIT, SIG_IGN); |
|
interrupted = 0; |
|
if (i != NULL) |
|
Lst_Find(&i->commands, CompatRunCommand, i); |
|
exit(SIGINT); |
|
} |
|
exit(interrupted); |
} |
} |
|
|
/*- |
/*- |
|
|
if (Job_CheckCommands(gn, Fatal)) { |
if (Job_CheckCommands(gn, Fatal)) { |
/* Our commands are ok, but we still have to worry about the -t |
/* Our commands are ok, but we still have to worry about the -t |
* flag... */ |
* flag... */ |
if (!touchFlag) { |
if (!touchFlag) |
curTarg = gn; |
|
Lst_Find(&gn->commands, CompatRunCommand, gn); |
Lst_Find(&gn->commands, CompatRunCommand, gn); |
curTarg = NULL; |
else |
} else |
|
Job_Touch(gn, gn->type & OP_SILENT); |
Job_Touch(gn, gn->type & OP_SILENT); |
} else |
} else |
gn->made = ERROR; |
gn->made = ERROR; |
|
|
GNode *gn = NULL;/* Current root target */ |
GNode *gn = NULL;/* Current root target */ |
int errors; /* Number of targets not remade due to errors */ |
int errors; /* Number of targets not remade due to errors */ |
|
|
if (signal(SIGINT, SIG_IGN) != SIG_IGN) |
signal(SIGINT, CompatInterrupt); |
signal(SIGINT, CompatInterrupt); |
signal(SIGTERM, CompatInterrupt); |
if (signal(SIGTERM, SIG_IGN) != SIG_IGN) |
signal(SIGHUP, CompatInterrupt); |
signal(SIGTERM, CompatInterrupt); |
signal(SIGQUIT, CompatInterrupt); |
if (signal(SIGHUP, SIG_IGN) != SIG_IGN) |
|
signal(SIGHUP, CompatInterrupt); |
|
if (signal(SIGQUIT, SIG_IGN) != SIG_IGN) |
|
signal(SIGQUIT, CompatInterrupt); |
|
|
|
for (cp = "#=|^(){};&<>*?[]:$`\\\n"; *cp != '\0'; cp++) |
for (cp = "#=|^(){};&<>*?[]:$`\\\n"; *cp != '\0'; cp++) |
meta[(unsigned char) *cp] = 1; |
meta[(unsigned char) *cp] = 1; |