diff options
author | harti <harti@FreeBSD.org> | 2005-05-24 13:14:24 +0000 |
---|---|---|
committer | harti <harti@FreeBSD.org> | 2005-05-24 13:14:24 +0000 |
commit | 6c1f15aa0b3b5827f9587dedd80316843096497c (patch) | |
tree | 04805199734910b1269c0492d0bf6dc09abc8b9b /usr.bin/make/job.c | |
parent | 103db97f6ecd2a1106c2a14f796c724c6372634c (diff) | |
download | FreeBSD-src-6c1f15aa0b3b5827f9587dedd80316843096497c.zip FreeBSD-src-6c1f15aa0b3b5827f9587dedd80316843096497c.tar.gz |
Another shell attribute 'unsetenv' that will cause to unsetenv("ENV")
before executing the shell. Until now this was done when the default
shell was the ksh. This failed if the default shell was sh or csh and
the user switched to ksh.
Diffstat (limited to 'usr.bin/make/job.c')
-rw-r--r-- | usr.bin/make/job.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/usr.bin/make/job.c b/usr.bin/make/job.c index 49497b3..c2df52b 100644 --- a/usr.bin/make/job.c +++ b/usr.bin/make/job.c @@ -316,6 +316,8 @@ struct Shell { ArgArray builtins; char *meta; + + Boolean unsetenv; /* unsetenv("ENV") before exec */ }; TAILQ_HEAD(Shells, Shell); @@ -409,7 +411,7 @@ static const char *const shells_init[] = { "quiet='set -' echo='set -v' filter='set -' " "hasErrCtl=Y check='set -e' ignore='set +e' " "echoFlag=v errFlag=e " - "meta='" SH_META "' builtins='" SH_BUILTINS "'", + "meta='" SH_META "' builtins='" SH_BUILTINS "' unsetenv=T", NULL }; @@ -646,13 +648,6 @@ Proc_Init() sa.sa_flags = SA_RESTART | SA_NOCLDSTOP; sa.sa_handler = catch_child; sigaction(SIGCHLD, &sa, NULL); - -#if DEFSHELL == 2 - /* - * Turn off ENV to make ksh happier. - */ - unsetenv("ENV"); -#endif } /** @@ -698,6 +693,11 @@ ProcExec(const ProcStuff *ps) Punt("Cannot dup2: %s", strerror(errno)); } + if (commandShell->unsetenv) { + /* for the benfit of ksh */ + unsetenv("ENV"); + } + /* * The file descriptors for stdin, stdout, or stderr might * have been marked close-on-exec. Clear the flag on all @@ -2582,6 +2582,7 @@ JobShellDump(const struct Shell *sh) for (i = 1; i < sh->builtins.argc; i++) fprintf(stderr, " '%s'", sh->builtins.argv[i]); fprintf(stderr, "\n meta='%s'\n", sh->meta); + fprintf(stderr, " unsetenv=%d\n", sh->unsetenv); } /** @@ -2670,6 +2671,10 @@ JobParseShellSpec(const char *spec, Boolean *fullSpec) free(sh->meta); sh->meta = estrdup(eq); *fullSpec = TRUE; + } else if (strcmp(keyw, "unsetenv") == 0) { + sh->unsetenv = (*eq == 'Y' || *eq == 'y' || + *eq == 'T' || *eq == 't'); + *fullSpec = TRUE; } else { Parse_Error(PARSE_FATAL, "unknown keyword in shell " "specification '%s'", keyw); |