ref: 146ff5eb62dbbe5263cea33b297919b7a8f70957
parent: 43fed51141b732bb94b42e8fa37caf7829b6dc04
author: cinap_lenrek <cinap_lenrek@felloff.net>
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)
--
⑨