diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-03-08 22:00:23 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-03-08 22:00:23 +0100 |
commit | e9e55a21f66a3eff114025dcb1fe62570d0fa3e6 (patch) | |
tree | 779a635590ee01c03219b4054757ec7fc905904d /sys/src/lib9p/post.c | |
parent | 11628e90fb85137a3f02e4ad5c343c15a90846b5 (diff) |
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.
Diffstat (limited to 'sys/src/lib9p/post.c')
-rw-r--r-- | sys/src/lib9p/post.c | 99 |
1 files changed, 54 insertions, 45 deletions
diff --git a/sys/src/lib9p/post.c b/sys/src/lib9p/post.c index 65a98e1f6..ba4265494 100644 --- a/sys/src/lib9p/post.c +++ b/sys/src/lib9p/post.c @@ -5,21 +5,37 @@ #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"); 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,53 +48,46 @@ _postmountsrv(Srv *s, char *name, char *mtpt, int flag) if(s->infd != s->outfd) close(s->outfd); - if(mtpt){ - if(amount(s->srvfd, mtpt, flag, "") == -1) - sysfatal("mount %s: %r", mtpt); - }else - close(s->srvfd); + if(cfd >= 0) + close(cfd); } void -_postsharesrv(Srv *s, char *name, char *mtpt, char *desc) +_postmountsrv(Srv *s, char *name, char *mtpt, int flag) { - int fd[2]; - - if(pipe(fd) < 0) - sysfatal("pipe: %r"); - s->infd = s->outfd = fd[1]; - s->srvfd = fd[0]; + postsrv(s, name); - if(name) - if(postfd(name, s->srvfd) < 0) - sysfatal("postfd %s: %r", name); - - if(_forker == nil) - sysfatal("no forker"); - _forker(postproc, s, RFNAMEG|RFNOTEG); - - 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 + if(mtpt != nil){ + if(amount(s->srvfd, mtpt, flag, "") == -1) + sysfatal("mount %s: %r", mtpt); + /* mount closed s->srvfd */ + } else close(s->srvfd); } - -static void -postproc(void *v) +void +_postsharesrv(Srv *s, char *name, char *mtpt, char *desc) { - Srv *s; - - s = v; - rendezvous(0, 0); + char buf[80]; + int cfd; + + if(mtpt != nil && desc != nil){ + snprint(buf, sizeof buf, "#σc/%s", mtpt); + if((cfd = create(buf, OREAD, DMDIR|0700)) >= 0) + close(cfd); + + 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; + + postsrv(s, name); + + if(cfd >= 0){ + if(fprint(cfd, "%d\n", s->srvfd) < 0) + sysfatal("write %s: %r", buf); + close(cfd); + } close(s->srvfd); - srv(s); } |