ref: f2c3d3bd0646f56c0d8bde483b698ccd669c10fb
parent: b8eefa9b155bf057f16c346d13f8fb1c0a2cdd7b
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Mar 8 18:00:23 EDT 2020
lib9p: implement automatic remove-on-close cleanup in postsharesrv(), remove postfd() and sharefd() functions with the latest changes to shr(3), we can use ORCLOSE on the control file to get the mount in the share automatically removed when the server exits or something goes wrong during postsharesrv(). do not expose postfd() and sharefd() functions. they where undocumented and leak the control file descriptors.
--- a/sys/include/9p.h
+++ b/sys/include/9p.h
@@ -246,8 +246,6 @@
void _postsharesrv(Srv*, char*, char*, char*);
void listensrv(Srv*, char*);
void _listensrv(Srv*, char*);
-int postfd(char*, int);
-int sharefd(char*, char*, int);
int chatty9p;
void respond(Req*, char*);
void responderror(Req*);
--- a/sys/man/2/9p
+++ b/sys/man/2/9p
@@ -1,12 +1,12 @@
.TH 9P 2
.SH NAME
Srv,
+chatty9p,
dirread9p,
emalloc9p,
erealloc9p,
estrdup9p,
listensrv,
-postfd,
postmountsrv,
postsharesrv,
readbuf,
@@ -72,7 +72,6 @@
void threadpostsharesrv(Srv *s, char *name, char *mtpt, char *desc)
void listensrv(Srv *s, char *addr)
void threadlistensrv(Srv *s, char *addr)
-int postfd(char *srvname, int fd)
void respond(Req *r, char *error)
void responderror(Req*)
void readstr(Req *r, char *src)
@@ -185,12 +184,9 @@
.IP
If
.B name
-is non-nil, call
-.BI postfd( s -> srvfd ,
-.IB name )
-to post
+is non-nil, post the file descriptor
.IB s -> srvfd
-as
+under the name
.BI /srv/ name .
.IP
Fork a child process via
--- a/sys/src/lib9p/post.c
+++ b/sys/src/lib9p/post.c
@@ -5,12 +5,23 @@
#include <9p.h>
#include <auth.h>
-static void postproc(void*);
+static void
+postproc(void *v)
+{+ Srv *s;
-void
-_postmountsrv(Srv *s, char *name, char *mtpt, int flag)
+ s = v;
+ rendezvous(0, 0);
+ close(s->srvfd);
+ srv(s);
+}
+
+static void
+postsrv(Srv *s, char *name)
{+ char buf[80];
int fd[2];
+ int cfd;
if(pipe(fd) < 0)
sysfatal("pipe: %r");@@ -17,9 +28,14 @@
s->infd = s->outfd = fd[1];
s->srvfd = fd[0];
- if(name)
- if(postfd(name, s->srvfd) < 0)
- sysfatal("postfd %s: %r", name);+ if(name != nil){+ snprint(buf, sizeof buf, "/srv/%s", name);
+ if((cfd = create(buf, OWRITE|ORCLOSE|OCEXEC, 0600)) < 0)
+ sysfatal("create %s: %r", buf);+ if(fprint(cfd, "%d", s->srvfd) < 0)
+ sysfatal("write %s: %r", buf);+ } else
+ cfd = -1;
if(_forker == nil)
sysfatal("no forker");@@ -32,10 +48,20 @@
if(s->infd != s->outfd)
close(s->outfd);
- if(mtpt){+ if(cfd >= 0)
+ close(cfd);
+}
+
+void
+_postmountsrv(Srv *s, char *name, char *mtpt, int flag)
+{+ postsrv(s, name);
+
+ if(mtpt != nil){if(amount(s->srvfd, mtpt, flag, "") == -1)
sysfatal("mount %s: %r", mtpt);- }else
+ /* mount closed s->srvfd */
+ } else
close(s->srvfd);
}
@@ -42,43 +68,26 @@
void
_postsharesrv(Srv *s, char *name, char *mtpt, char *desc)
{- int fd[2];
+ char buf[80];
+ int cfd;
- if(pipe(fd) < 0)
- sysfatal("pipe: %r");- s->infd = s->outfd = fd[1];
- s->srvfd = fd[0];
+ if(mtpt != nil && desc != nil){+ snprint(buf, sizeof buf, "#σc/%s", mtpt);
+ if((cfd = create(buf, OREAD, DMDIR|0700)) >= 0)
+ close(cfd);
- if(name)
- if(postfd(name, s->srvfd) < 0)
- sysfatal("postfd %s: %r", name);+ snprint(buf, sizeof buf, "#σc/%s/%s", mtpt, desc);
+ if((cfd = create(buf, OWRITE|ORCLOSE|OCEXEC, 0600)) < 0)
+ sysfatal("create %s: %r", buf);+ } else
+ cfd = -1;
- if(_forker == nil)
- sysfatal("no forker");- _forker(postproc, s, RFNAMEG|RFNOTEG);
+ postsrv(s, name);
- rfork(RFFDG);
- rendezvous(0, 0);
-
- close(s->infd);
- if(s->infd != s->outfd)
- close(s->outfd);
-
- if(mtpt){- if(sharefd(mtpt, desc, s->srvfd) < 0)
- sysfatal("sharefd %s: %r", mtpt);- }else
- close(s->srvfd);
-}
-
-
-static void
-postproc(void *v)
-{- Srv *s;
-
- s = v;
- rendezvous(0, 0);
+ if(cfd >= 0){+ if(fprint(cfd, "%d\n", s->srvfd) < 0)
+ sysfatal("write %s: %r", buf);+ close(cfd);
+ }
close(s->srvfd);
- srv(s);
}
--- a/sys/src/lib9p/srv.c
+++ b/sys/src/lib9p/srv.c
@@ -918,59 +918,3 @@
rerrstr(errbuf, sizeof errbuf);
respond(r, errbuf);
}
-
-int
-postfd(char *name, int pfd)
-{- int fd;
- char buf[80];
-
- snprint(buf, sizeof buf, "/srv/%s", name);
- if(chatty9p)
- fprint(2, "postfd %s\n", buf);
- fd = create(buf, OWRITE|ORCLOSE|OCEXEC, 0600);
- if(fd < 0){- if(chatty9p)
- fprint(2, "create fails: %r\n");
- return -1;
- }
- if(fprint(fd, "%d", pfd) < 0){- if(chatty9p)
- fprint(2, "write fails: %r\n");
- close(fd);
- return -1;
- }
- if(chatty9p)
- fprint(2, "postfd successful\n");
- return 0;
-}
-
-int
-sharefd(char *name, char *desc, int pfd)
-{- int fd;
- char buf[80];
-
- snprint(buf, sizeof buf, "#σc/%s", name);
- if((fd = create(buf, OREAD, 0700|DMDIR)) >= 0)
- close(fd);
- snprint(buf, sizeof buf, "#σc/%s/%s", name, desc);
- if(chatty9p)
- fprint(2, "sharefd %s\n", buf);
- fd = create(buf, OWRITE, 0600);
- if(fd < 0){- if(chatty9p)
- fprint(2, "create fails: %r\n");
- return -1;
- }
- if(fprint(fd, "%d\n", pfd) < 0){- if(chatty9p)
- fprint(2, "write fails: %r\n");
- close(fd);
- return -1;
- }
- close(fd);
- if(chatty9p)
- fprint(2, "sharefd successful\n");
- return 0;
-}
--
⑨