ref: bcfac7150114a73c6ed00e3742429fd000955db3
parent: a22f731ddb5b59c05f869c740034eb5c2f3e00a6
 parent: db67ba1a1bd0f6fc2de60b25413a5fb03738f9f5
	author: cinap_lenrek <cinap_lenrek@felloff.net>
	date: Sat Sep  8 10:50:41 EDT 2018
	
merge
--- a/sys/src/cmd/rc/exec.c
+++ b/sys/src/cmd/rc/exec.c
@@ -123,6 +123,21 @@
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)
 {--- a/sys/src/cmd/rc/fns.h
+++ b/sys/src/cmd/rc/fns.h
@@ -55,6 +55,7 @@
word* searchpath(char*);
void setstatus(char*);
void setvar(char*, word*);
+void shuffleredir(void);
void skipnl(void);
void start(code*, int, var*);
int truestatus(void);
--- a/sys/src/cmd/rc/havefork.c
+++ b/sys/src/cmd/rc/havefork.c
@@ -185,7 +185,8 @@
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);
--
⑨