diff --git a/sys/src/cmd/rc/exec.c b/sys/src/cmd/rc/exec.c index 10cb76935..4400e45bc 100644 --- a/sys/src/cmd/rc/exec.c +++ b/sys/src/cmd/rc/exec.c @@ -123,6 +123,21 @@ pushredir(int type, int from, int to) runq->redir = rp; } +void +shuffleredir(void) +{ + redir **rr, *rp; + + rp = runq->redir; + if(rp==0) + return; + runq->redir = rp->next; + rp->next = runq->startredir; + for(rr = &runq->redir; *rr != rp->next; rr = &((*rr)->next)) + ; + *rr = rp; +} + var* newvar(char *name, var *next) { diff --git a/sys/src/cmd/rc/fns.h b/sys/src/cmd/rc/fns.h index 1afe9ce38..e06265f65 100644 --- a/sys/src/cmd/rc/fns.h +++ b/sys/src/cmd/rc/fns.h @@ -55,6 +55,7 @@ void readhere(void); word* searchpath(char*); void setstatus(char*); void setvar(char*, word*); +void shuffleredir(void); void skipnl(void); void start(code*, int, var*); int truestatus(void); diff --git a/sys/src/cmd/rc/havefork.c b/sys/src/cmd/rc/havefork.c index ad5a80298..86d6c91f6 100644 --- a/sys/src/cmd/rc/havefork.c +++ b/sys/src/cmd/rc/havefork.c @@ -185,7 +185,8 @@ Xpipefd(void) default: addwaitpid(pid); close(sidefd); - pushredir(ROPEN, mainfd, mainfd); /* isn't this a noop? */ + pushredir(ROPEN, mainfd, mainfd); + shuffleredir(); /* shuffle redir to bottom of stack for turfredir() */ strcpy(name, Fdprefix); inttoascii(name+strlen(name), mainfd); pushword(name);