summaryrefslogtreecommitdiff
path: root/devel/bmake/files/compat.c
diff options
context:
space:
mode:
Diffstat (limited to 'devel/bmake/files/compat.c')
-rw-r--r--devel/bmake/files/compat.c130
1 files changed, 72 insertions, 58 deletions
diff --git a/devel/bmake/files/compat.c b/devel/bmake/files/compat.c
index 3486cd33706..cc5a31df349 100644
--- a/devel/bmake/files/compat.c
+++ b/devel/bmake/files/compat.c
@@ -1,4 +1,4 @@
-/* $NetBSD: compat.c,v 1.1.1.9 2015/05/19 21:36:43 joerg Exp $ */
+/* $NetBSD: compat.c,v 1.1.1.10 2020/05/24 05:35:51 nia Exp $ */
/*
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -70,14 +70,14 @@
*/
#ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: compat.c,v 1.1.1.9 2015/05/19 21:36:43 joerg Exp $";
+static char rcsid[] = "$NetBSD: compat.c,v 1.1.1.10 2020/05/24 05:35:51 nia Exp $";
#else
#include <sys/cdefs.h>
#ifndef lint
#if 0
static char sccsid[] = "@(#)compat.c 8.2 (Berkeley) 3/19/94";
#else
-__RCSID("$NetBSD: compat.c,v 1.1.1.9 2015/05/19 21:36:43 joerg Exp $");
+__RCSID("$NetBSD: compat.c,v 1.1.1.10 2020/05/24 05:35:51 nia Exp $");
#endif
#endif /* not lint */
#endif
@@ -111,35 +111,33 @@ __RCSID("$NetBSD: compat.c,v 1.1.1.9 2015/05/19 21:36:43 joerg Exp $");
#include "hash.h"
#include "dir.h"
#include "job.h"
+#include "metachar.h"
#include "pathnames.h"
-/*
- * The following array is used to make a fast determination of which
- * characters are interpreted specially by the shell. If a command
- * contains any of these characters, it is executed by the shell, not
- * directly by us.
- */
-
-static char meta[256];
static GNode *curTarg = NULL;
static GNode *ENDNode;
static void CompatInterrupt(int);
+static pid_t compatChild;
+static int compatSigno;
+/*
+ * CompatDeleteTarget -- delete a failed, interrupted, or otherwise
+ * duffed target if not inhibited by .PRECIOUS.
+ */
static void
-Compat_Init(void)
+CompatDeleteTarget(GNode *gn)
{
- const char *cp;
+ if ((gn != NULL) && !Targ_Precious (gn)) {
+ char *p1;
+ char *file = Var_Value(TARGET, gn, &p1);
- Shell_Init(); /* setup default shell */
-
- for (cp = "~#=|^(){};&<>*?[]:$`\\\n"; *cp != '\0'; cp++) {
- meta[(unsigned char) *cp] = 1;
+ if (!noExecute && eunlink(file) != -1) {
+ Error("*** %s removed", file);
+ }
+
+ free(p1);
}
- /*
- * The null character serves as a sentinel in the string.
- */
- meta[0] = 1;
}
/*-
@@ -155,6 +153,9 @@ Compat_Init(void)
* The target is removed and the process exits. If .INTERRUPT exists,
* its commands are run first WITH INTERRUPTS IGNORED..
*
+ * XXX: is .PRECIOUS supposed to inhibit .INTERRUPT? I doubt it, but I've
+ * left the logic alone for now. - dholland 20160826
+ *
*-----------------------------------------------------------------------
*/
static void
@@ -162,16 +163,9 @@ CompatInterrupt(int signo)
{
GNode *gn;
- if ((curTarg != NULL) && !Targ_Precious (curTarg)) {
- char *p1;
- char *file = Var_Value(TARGET, curTarg, &p1);
-
- if (!noExecute && eunlink(file) != -1) {
- Error("*** %s removed", file);
- }
- if (p1)
- free(p1);
+ CompatDeleteTarget(curTarg);
+ if ((curTarg != NULL) && !Targ_Precious (curTarg)) {
/*
* Run .INTERRUPT only if hit with interrupt signal
*/
@@ -181,12 +175,20 @@ CompatInterrupt(int signo)
Compat_Make(gn, gn);
}
}
-
}
if (signo == SIGQUIT)
_exit(signo);
- bmake_signal(signo, SIG_DFL);
- kill(myPid, signo);
+ /*
+ * If there is a child running, pass the signal on
+ * we will exist after it has exited.
+ */
+ compatSigno = signo;
+ if (compatChild > 0) {
+ KILLPG(compatChild, signo);
+ } else {
+ bmake_signal(signo, SIG_DFL);
+ kill(myPid, signo);
+ }
}
/*-
@@ -236,7 +238,7 @@ CompatRunCommand(void *cmdp, void *gnp)
doIt = FALSE;
cmdNode = Lst_Member(gn->commands, cmd);
- cmdStart = Var_Subst(NULL, cmd, gn, FALSE);
+ cmdStart = Var_Subst(NULL, cmd, gn, VARF_WANTRES);
/*
* brk_string will return an argv with a NULL in av[0], thus causing
@@ -271,8 +273,8 @@ CompatRunCommand(void *cmdp, void *gnp)
break;
case '+':
doIt = TRUE;
- if (!meta[0]) /* we came here from jobs */
- Compat_Init();
+ if (!shellName) /* we came here from jobs */
+ Shell_Init();
break;
}
cmd++;
@@ -300,11 +302,13 @@ CompatRunCommand(void *cmdp, void *gnp)
* Search for meta characters in the command. If there are no meta
* characters, there's no need to execute a shell to execute the
* command.
+ *
+ * Additionally variable assignments and empty commands
+ * go to the shell. Therefore treat '=' and ':' like shell
+ * meta characters as documented in make(1).
*/
- for (cp = cmd; !meta[(unsigned char)*cp]; cp++) {
- continue;
- }
- useShell = (*cp != '\0');
+
+ useShell = needshell(cmd, FALSE);
#endif
/*
@@ -377,7 +381,7 @@ again:
/*
* Fork and execute the single command. If the fork fails, we abort.
*/
- cpid = vFork();
+ compatChild = cpid = vFork();
if (cpid < 0) {
Fatal("Could not fork");
}
@@ -395,15 +399,15 @@ again:
execError("exec", av[0]);
_exit(1);
}
- if (mav)
- free(mav);
- if (bp)
- free(bp);
+
+ free(mav);
+ free(bp);
+
Lst_Replace(cmdNode, NULL);
#ifdef USE_META
if (useMeta) {
- meta_compat_parent();
+ meta_compat_parent(cpid);
}
#endif
@@ -468,6 +472,11 @@ again:
* continue.
*/
printf(" (continuing)\n");
+ } else {
+ printf("\n");
+ }
+ if (deleteOnError) {
+ CompatDeleteTarget(gn);
}
} else {
/*
@@ -485,7 +494,12 @@ again:
}
}
free(cmdStart);
-
+ compatChild = 0;
+ if (compatSigno) {
+ bmake_signal(compatSigno, SIG_DFL);
+ kill(myPid, compatSigno);
+ }
+
return (status);
}
@@ -512,8 +526,8 @@ Compat_Make(void *gnp, void *pgnp)
GNode *gn = (GNode *)gnp;
GNode *pgn = (GNode *)pgnp;
- if (!meta[0]) /* we came here from jobs */
- Compat_Init();
+ if (!shellName) /* we came here from jobs */
+ Shell_Init();
if (gn->made == UNMADE && (gn == pgn || (pgn->type & OP_MADE) == 0)) {
/*
* First mark ourselves to be made, then apply whatever transformations
@@ -537,8 +551,7 @@ Compat_Make(void *gnp, void *pgnp)
if (Lst_Member(gn->iParents, pgn) != NULL) {
char *p1;
Var_Set(IMPSRC, Var_Value(TARGET, gn, &p1), pgn, 0);
- if (p1)
- free(p1);
+ free(p1);
}
/*
@@ -608,7 +621,8 @@ Compat_Make(void *gnp, void *pgnp)
}
#ifdef USE_META
if (useMeta && !NoExecute(gn)) {
- meta_job_finish(NULL);
+ if (meta_job_finish(NULL) != 0)
+ gn->made = ERROR;
}
#endif
@@ -628,7 +642,7 @@ Compat_Make(void *gnp, void *pgnp)
} else if (keepgoing) {
pgn->flags &= ~REMAKE;
} else {
- PrintOnError(gn, "\n\nStop.");
+ PrintOnError(gn, "\nStop.");
exit(1);
}
} else if (gn->made == ERROR) {
@@ -641,8 +655,7 @@ Compat_Make(void *gnp, void *pgnp)
if (Lst_Member(gn->iParents, pgn) != NULL) {
char *p1;
Var_Set(IMPSRC, Var_Value(TARGET, gn, &p1), pgn, 0);
- if (p1)
- free(p1);
+ free(p1);
}
switch(gn->made) {
case BEINGMADE:
@@ -693,7 +706,8 @@ Compat_Run(Lst targs)
GNode *gn = NULL;/* Current root target */
int errors; /* Number of targets not remade due to errors */
- Compat_Init();
+ if (!shellName)
+ Shell_Init();
if (bmake_signal(SIGINT, SIG_IGN) != SIG_IGN) {
bmake_signal(SIGINT, CompatInterrupt);
@@ -719,7 +733,7 @@ Compat_Run(Lst targs)
if (gn != NULL) {
Compat_Make(gn, gn);
if (gn->made == ERROR) {
- PrintOnError(gn, "\n\nStop.");
+ PrintOnError(gn, "\nStop.");
exit(1);
}
}
@@ -760,7 +774,7 @@ Compat_Run(Lst targs)
if (errors == 0) {
Compat_Make(ENDNode, ENDNode);
if (gn->made == ERROR) {
- PrintOnError(gn, "\n\nStop.");
+ PrintOnError(gn, "\nStop.");
exit(1);
}
}