ref: 225c359beab9e2f17c66e65647b9e0a94f942620
parent: e1cdcfdb172071bafef18b1ac160138c97459b79
author: cinap_lenrek <[email protected]>
date: Sat Mar 7 15:19:14 EST 2020
lib9p: get rid of Srv.nopipe and Srv.leavefdsopen hacks it is unclear how Srv.nopipe flag should work inside postmountserv(). if a server wants to serve on stdio descriptors, he can just call srv() after initializing Srv.infd and Srv.outfd. The Srv.leavefdsopen hack can be removed now that acme win has been fixed.
--- a/sys/include/9p.h
+++ b/sys/include/9p.h
@@ -215,9 +215,7 @@
int infd;
int outfd;
- int nopipe;
int srvfd;
- int leavefdsopen; /* magic for acme win */
char* keyspec;
/* below is implementation-specific; don't use */
--- a/sys/man/2/9p
+++ b/sys/man/2/9p
@@ -59,7 +59,6 @@
int infd;
int outfd;
int srvfd;
- int nopipe;
} Srv;
.fi
.PP
@@ -175,10 +174,7 @@
.IR srv .
They do the following:
.IP
-If
-.IB s -> nopipe
-is zero (the common case),
-initialize
+Initialize
.IB s -> infd
and
.IB s -> outfd
--- a/sys/src/lib9p/post.c
+++ b/sys/src/lib9p/post.c
@@ -12,12 +12,11 @@
{
int fd[2];
- if(!s->nopipe){
- if(pipe(fd) < 0)
- sysfatal("pipe: %r");
- s->infd = s->outfd = fd[1];
- s->srvfd = fd[0];
- }
+ if(pipe(fd) < 0)
+ sysfatal("pipe: %r");
+ s->infd = s->outfd = fd[1];
+ s->srvfd = fd[0];
+
if(name)
if(postfd(name, s->srvfd) < 0)
sysfatal("postfd %s: %r", name);
@@ -24,30 +23,11 @@
if(_forker == nil)
sysfatal("no forker");
- _forker(postproc, s, RFNAMEG);
+ _forker(postproc, s, RFNAMEG|RFFDG|RFNOTEG);
- /*
- * Normally the server is posting as the last thing it does
- * before exiting, so the correct thing to do is drop into
- * a different fd space and close the 9P server half of the
- * pipe before trying to mount the kernel half. This way,
- * if the file server dies, we don't have a ref to the 9P server
- * half of the pipe. Then killing the other procs will drop
- * all the refs on the 9P server half, and the mount will fail.
- * Otherwise the mount hangs forever.
- *
- * Libthread in general and acme win in particular make
- * it hard to make this fd bookkeeping work out properly,
- * so leaveinfdopen is a flag that win sets to opt out of this
- * safety net.
- */
- if(!s->leavefdsopen){
- rfork(RFFDG);
- rendezvous(0, 0);
- close(s->infd);
- if(s->infd != s->outfd)
- close(s->outfd);
- }
+ close(s->infd);
+ if(s->infd != s->outfd)
+ close(s->outfd);
if(mtpt){
if(amount(s->srvfd, mtpt, flag, "") == -1)
@@ -61,12 +41,11 @@
{
int fd[2];
- if(!s->nopipe){
- if(pipe(fd) < 0)
- sysfatal("pipe: %r");
- s->infd = s->outfd = fd[1];
- s->srvfd = fd[0];
- }
+ if(pipe(fd) < 0)
+ sysfatal("pipe: %r");
+ s->infd = s->outfd = fd[1];
+ s->srvfd = fd[0];
+
if(name)
if(postfd(name, s->srvfd) < 0)
sysfatal("postfd %s: %r", name);
@@ -73,30 +52,11 @@
if(_forker == nil)
sysfatal("no forker");
- _forker(postproc, s, RFNAMEG);
+ _forker(postproc, s, RFNAMEG|RFFDG|RFNOTEG);
- /*
- * Normally the server is posting as the last thing it does
- * before exiting, so the correct thing to do is drop into
- * a different fd space and close the 9P server half of the
- * pipe before trying to mount the kernel half. This way,
- * if the file server dies, we don't have a ref to the 9P server
- * half of the pipe. Then killing the other procs will drop
- * all the refs on the 9P server half, and the mount will fail.
- * Otherwise the mount hangs forever.
- *
- * Libthread in general and acme win in particular make
- * it hard to make this fd bookkeeping work out properly,
- * so leaveinfdopen is a flag that win sets to opt out of this
- * safety net.
- */
- if(!s->leavefdsopen){
- rfork(RFFDG);
- rendezvous(0, 0);
- close(s->infd);
- if(s->infd != s->outfd)
- close(s->outfd);
- }
+ close(s->infd);
+ if(s->infd != s->outfd)
+ close(s->outfd);
if(mtpt){
if(sharefd(mtpt, desc, s->srvfd) < 0)
@@ -112,10 +72,6 @@
Srv *s;
s = v;
- if(!s->leavefdsopen){
- rfork(RFNOTEG);
- rendezvous(0, 0);
- close(s->srvfd);
- }
+ close(s->srvfd);
srv(s);
}
--- a/sys/src/lib9p/ramfs.c
+++ b/sys/src/lib9p/ramfs.c
@@ -158,7 +158,7 @@
usage();
if(chatty9p)
- fprint(2, "ramsrv.nopipe %d srvname %s mtpt %s\n", fs.nopipe, srvname, mtpt);
+ fprint(2, "srvname %s mtpt %s\n", srvname, mtpt);
if(addr == nil && srvname == nil && mtpt == nil)
sysfatal("must specify -a, -s, or -m option");
if(addr)