diff options
author | Russ Cox <rsc@swtch.com> | 2020-01-13 19:20:34 -0500 |
---|---|---|
committer | Russ Cox <rsc@swtch.com> | 2020-01-13 19:20:34 -0500 |
commit | 6c17f630901eec2a4b54b70748d7fbc9b47eecd8 (patch) | |
tree | 8aecc9bf262483cf25a59692f430afbfd4256f57 /src | |
parent | 9962d916e88f66014f1008d4356a2d395ae8d31b (diff) | |
download | plan9port-6c17f630901eec2a4b54b70748d7fbc9b47eecd8.tar.gz plan9port-6c17f630901eec2a4b54b70748d7fbc9b47eecd8.tar.bz2 plan9port-6c17f630901eec2a4b54b70748d7fbc9b47eecd8.zip |
mk: treat X= as empty list in rc shell
This brings mk's behavior when using rc in line with Plan 9's.
The existing code is for Unix environment data structures but
also was assuming Unix shell semantics where empty and missing
variables are mostly equivalent.
The Plan 9 code (/sys/src/cmd/mk/plan9.c in the distribution)
explicitly removes /env/name (creating an empty list) when the
value is missing or an empty string.
Fixes #255.
Diffstat (limited to 'src')
-rw-r--r-- | src/cmd/mk/unix.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/cmd/mk/unix.c b/src/cmd/mk/unix.c index 37f05b71..66bdb1ff 100644 --- a/src/cmd/mk/unix.c +++ b/src/cmd/mk/unix.c @@ -53,20 +53,26 @@ readenv(void) void exportenv(Envy *e, Shell *sh) { - int i; + int w, n; char **p; + Envy *e1; static char buf[16384]; - p = 0; - for(i = 0; e->name; e++, i++) { - p = (char**) Realloc(p, (i+2)*sizeof(char*)); + n = 0; + for(e1 = e; e1->name; e1++) + n++; + p = Malloc((n+1)*sizeof(char*)); + w = 0; + for(; e->name; e++) { + if(sh == &rcshell && (e->values == 0 || e->values->s == 0 || e->values->s[0] == 0)) + continue; /* do not write empty string for empty list */ if(e->values) snprint(buf, sizeof buf, "%s=%s", e->name, wtos(e->values, sh->iws)); else snprint(buf, sizeof buf, "%s=", e->name); - p[i] = strdup(buf); + p[w++] = strdup(buf); } - p[i] = 0; + p[w] = 0; environ = p; } |