Module Name: src Committed By: kre Date: Mon Jan 31 16:54:28 UTC 2022
Modified Files: src/bin/sh: cd.c histedit.c Log Message: Add some comments explaining accesses to the environment via getenv()/setenv()/unsetenv() which manipulate the envornoment the shell was passed at entry. These are a little odd in sh as that environment is copied into the shell's internal variable data struct at shell startup, and normally never accessed after that - in builtin commands (test. printf, ...) getenv() is #defined to become an internal sh lookup function instead, so even those never use the startup environment). NFCI To generate a diff of this commit: cvs rdiff -u -r1.52 -r1.53 src/bin/sh/cd.c cvs rdiff -u -r1.57 -r1.58 src/bin/sh/histedit.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/bin/sh/cd.c diff -u src/bin/sh/cd.c:1.52 src/bin/sh/cd.c:1.53 --- src/bin/sh/cd.c:1.52 Tue Nov 16 16:57:15 2021 +++ src/bin/sh/cd.c Mon Jan 31 16:54:28 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: cd.c,v 1.52 2021/11/16 16:57:15 kre Exp $ */ +/* $NetBSD: cd.c,v 1.53 2022/01/31 16:54:28 kre Exp $ */ /*- * Copyright (c) 1991, 1993 @@ -37,7 +37,7 @@ #if 0 static char sccsid[] = "@(#)cd.c 8.2 (Berkeley) 5/4/95"; #else -__RCSID("$NetBSD: cd.c,v 1.52 2021/11/16 16:57:15 kre Exp $"); +__RCSID("$NetBSD: cd.c,v 1.53 2022/01/31 16:54:28 kre Exp $"); #endif #endif /* not lint */ @@ -404,6 +404,20 @@ getpwd(int noerror) return; if (first) { + /* + * Note that this happens via the call from initpwd() + * just above, which is called early from main() during + * sh startup, so fetching PWD from the entry environment + * (which is what getenv() does) is acceptable. Here we + * could use normal sh var lookup functions instead, as + * the arriving environment has already been imported before + * we get here, but it makes little difference. + * + * XXX What would be better perhaps would be to move all of + * this into initpwd() instead of here, so we could get rid of + * this "first" static - that function is only ever called once. + * XXX Some other day. + */ first = 0; pwd = getenv("PWD"); if (is_curdir(pwd)) { Index: src/bin/sh/histedit.c diff -u src/bin/sh/histedit.c:1.57 src/bin/sh/histedit.c:1.58 --- src/bin/sh/histedit.c:1.57 Tue Sep 14 15:04:09 2021 +++ src/bin/sh/histedit.c Mon Jan 31 16:54:28 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: histedit.c,v 1.57 2021/09/14 15:04:09 christos Exp $ */ +/* $NetBSD: histedit.c,v 1.58 2022/01/31 16:54:28 kre Exp $ */ /*- * Copyright (c) 1993 @@ -37,7 +37,7 @@ #if 0 static char sccsid[] = "@(#)histedit.c 8.2 (Berkeley) 5/4/95"; #else -__RCSID("$NetBSD: histedit.c,v 1.57 2021/09/14 15:04:09 christos Exp $"); +__RCSID("$NetBSD: histedit.c,v 1.58 2022/01/31 16:54:28 kre Exp $"); #endif #endif /* not lint */ @@ -129,6 +129,23 @@ histedit(void) if (tracefile) el_err = tracefile; #endif + /* + * This odd piece of code doesn't affect the shell + * at all, the environment modified here is the + * stuff accessed via "environ" (the incoming + * envoironment to the shell) which is only ever + * touched at sh startup time (long before we get + * here) and ignored thereafter. + * + * But libedit calls getenv() to discover TERM + * and that searches the "environ" environment, + * not the shell's internal variable data struct, + * so we need to make sure that TERM in there is + * correct. + * + * This sequence copies TERM from the shell into + * the old "environ" environment. + */ term = lookupvar("TERM"); if (term) setenv("TERM", term, 1);