x=foo; @{x=bar}; echo `{cat /env/x}

yields "foo" but

x=foo; echo; @{x=bar}; echo `{cat /env/x}

yields "bar"

the problem is that the environment variables are
only flushed to /env on exec, but not on fork.

in the first example, after executing the
subshell, x is still marked as "modified" by
us and the cat/echo will cause the old value
to be flushed and the changed value from the
subshell be overridden.

havntfork.c does flush the variables on fork tho.

i think it would be more consistent todo this for
havefork.c as well.

is there a good reason not to?

the following patch seems to work fine:

diff -r 5a4a76cd3657 sys/src/cmd/rc/havefork.c
--- a/sys/src/cmd/rc/havefork.c Mon Aug 19 16:07:07 2013 +0200
+++ b/sys/src/cmd/rc/havefork.c Mon Aug 19 21:31:06 2013 +0200
@@ -12,10 +12,12 @@
        int null = open("/dev/null", 0);
        int pid;
        char npid[10];
+
        if(null<0){
                Xerror("Can't open /dev/null\n");
                return;
        }
+       Updenv();
        switch(pid = rfork(RFFDG|RFPROC|RFNOTEG)){
        case -1:
                close(null);
@@ -45,10 +47,12 @@
        int lfd = p->code[pc++].i;
        int rfd = p->code[pc++].i;
        int pfd[2];
+
        if(pipe(pfd)<0){
                Xerror("can't get pipe");
                return;
        }
+       Updenv();
        switch(forkid = fork()){
        case -1:
                Xerror("try again");
@@ -91,6 +95,7 @@
                Xerror("can't make pipe");
                return;
        }
+       Updenv();
        switch(pid = fork()){
        case -1:
                Xerror("try again");
@@ -152,6 +157,7 @@
        char name[40];
        int pfd[2];
        int sidefd, mainfd;
+
        if(pipe(pfd)<0){
                Xerror("can't get pipe");
                return;
@@ -164,6 +170,7 @@
                sidefd = pfd[PRD];
                mainfd = pfd[PWR];
        }
+       Updenv();
        switch(pid = fork()){
        case -1:
                Xerror("try again");
@@ -191,6 +198,8 @@
 Xsubshell(void)
 {
        int pid;
+
+       Updenv();
        switch(pid = fork()){
        case -1:
                Xerror("try again");

--
cinap

Reply via email to