lib9p: remove Srv.srvfd, make postsrv() and threadpostsrv() return the mountable file descriptor, update documentation

Now that we have these new functions,
we can also make them return an error
instead of calling sysfatal() like
postmountsrv().

Remove the confusing Srv.srvfd, as it
is only temporarily used and return
it from postsrv() instead.
This commit is contained in:
cinap_lenrek 2021-05-01 19:58:58 +02:00
parent 57c21ae441
commit ee289c2415
8 changed files with 77 additions and 74 deletions

View file

@ -214,7 +214,6 @@ struct Srv {
int infd; int infd;
int outfd; int outfd;
int srvfd;
char* keyspec; char* keyspec;
/* below is implementation-specific; don't use */ /* below is implementation-specific; don't use */
@ -243,13 +242,13 @@ void srvforker(void (*)(void*), void*, int);
void threadsrvforker(void (*)(void*), void*, int); void threadsrvforker(void (*)(void*), void*, int);
void srv(Srv*); void srv(Srv*);
void postsrv(Srv*, char*); int postsrv(Srv*, char*);
void postmountsrv(Srv*, char*, char*, int); void postmountsrv(Srv*, char*, char*, int);
void postsharesrv(Srv*, char*, char*, char*); void postsharesrv(Srv*, char*, char*, char*);
void listensrv(Srv*, char*); void listensrv(Srv*, char*);
void threadsrv(Srv*); void threadsrv(Srv*);
void threadpostsrv(Srv*, char*); int threadpostsrv(Srv*, char*);
void threadpostmountsrv(Srv*, char*, char*, int); void threadpostmountsrv(Srv*, char*, char*, int);
void threadpostsharesrv(Srv*, char*, char*, char*); void threadpostsharesrv(Srv*, char*, char*, char*);
void threadlistensrv(Srv *s, char *addr); void threadlistensrv(Srv *s, char *addr);

View file

@ -63,7 +63,6 @@ typedef struct Srv {
int infd; int infd;
int outfd; int outfd;
int srvfd;
void (*forker)(void (*fn)(void*), void *arg, int flags); void (*forker)(void (*fn)(void*), void *arg, int flags);
} Srv; } Srv;
@ -73,12 +72,12 @@ typedef struct Srv {
.ft L .ft L
.ta \w'\fLvoid* 'u .ta \w'\fLvoid* 'u
void srv(Srv *s) void srv(Srv *s)
void postsrv(Srv *s, char *name); int postsrv(Srv *s, char *name);
void postmountsrv(Srv *s, char *name, char *mtpt, int flag) void postmountsrv(Srv *s, char *name, char *mtpt, int flag)
void postsharesrv(Srv *s, char *name, char *mtpt, char *desc) void postsharesrv(Srv *s, char *name, char *mtpt, char *desc)
void listensrv(Srv *s, char *addr) void listensrv(Srv *s, char *addr)
void threadsrv(Srv *s) void threadsrv(Srv *s)
void threadpostsrv(Srv *s, char *name); int threadpostsrv(Srv *s, char *name);
void threadpostmountsrv(Srv *s, char *name, char *mtpt, int flag) void threadpostmountsrv(Srv *s, char *name, char *mtpt, int flag)
void threadpostsharesrv(Srv *s, char *name, char *mtpt, char *desc) void threadpostsharesrv(Srv *s, char *name, char *mtpt, char *desc)
void threadlistensrv(Srv *s, char *addr) void threadlistensrv(Srv *s, char *addr)
@ -193,14 +192,26 @@ or
(see (see
.IR thread (2)). .IR thread (2)).
.PP .PP
.I Postmountsrv
.I Postsrv
and and
.I threadpostmountsrv .I threadpostsrv
are wrappers that create a separate process in which to run are wrappers that create a separate process in which to run
.IR srv . .IR srv .
They do the following: They do the following:
.IP .IP
Initialize Initialize
.IB s -> infd
and
.IB s -> outfd
to be one end of a freshly allocated pipe.
.IP
If
.B name
is non-nil, post the other end file descriptor under the name
.BI /srv/ name .
.IP
Initialize
.IB s -> forker .IB s -> forker
to eigther to eigther
.I srvforker .I srvforker
@ -208,24 +219,6 @@ or
.I threadsrvforker .I threadsrvforker
unless already initialized to a non-nil value. unless already initialized to a non-nil value.
.IP .IP
Initialize
.IB s -> infd
and
.IB s -> outfd
to be one end of a freshly allocated pipe,
with
.IB s -> srvfd
initialized as the other end.
.IP
If
.B name
is non-nil, post the file descriptor
.IB s -> srvfd
under the name
.BI /srv/ name
using a call to
.IR postsrv .
.IP
Fork a child process via Fork a child process via
.IB s -> forker .IB s -> forker
using the using the
@ -248,27 +241,37 @@ flag. This way, the service loop will share the original
file descriptor table with previously created child file descriptor table with previously created child
processes of the caller. processes of the caller.
.IP .IP
The child process then calls The child process then closes the other end file descriptor
.IB close( s -> srvfd ) and calls
and then .IR srv .
.IB srv( s ) \fR;
it will exit once
.I srv
returns.
.IP .IP
If The parent process returns from the function with the
mountable file descriptor
.IR sfd .
On error,
.I postsrv
and
.I threadpostsrv
return a file descriptor of
.BR -1
with error string set.
.PP
.I Postmountsrv
and
.I threadpostmntsrv
call
.I postsrv
with
.I name
and then if
.I mtpt .I mtpt
is non-nil, is non-nil,
call call
.BI amount( s -> srvfd, .BI amount( sfd ,
.IB mtpt , .IB mtpt ,
.IB flag , .IB flag ,
\fB"")\fR; \fB"")\fR;
otherwise, close otherwise, close the file descriptor.
.IB s -> srvfd \fR.
.IP
The parent returns to the caller.
.LP
If any error occurs during If any error occurs during
this process, the entire process is terminated by calling this process, the entire process is terminated by calling
.I sysfatal .I sysfatal

View file

@ -329,7 +329,6 @@ main()
pipe(fd); pipe(fd);
tabletsrv.infd = tabletsrv.outfd = fd[0]; tabletsrv.infd = tabletsrv.outfd = fd[0];
tabletsrv.srvfd = fd[1];
tabletsrv.tree = alloctree(getuser(), getuser(), 0555, 0); tabletsrv.tree = alloctree(getuser(), getuser(), 0555, 0);
tfile = createfile(tabletsrv.tree->root, "tablet", getuser(), 0400, 0); tfile = createfile(tabletsrv.tree->root, "tablet", getuser(), 0400, 0);
if(rfork(RFPROC | RFMEM | RFNOWAIT | RFNOTEG) > 0) exits(nil); if(rfork(RFPROC | RFMEM | RFNOWAIT | RFNOTEG) > 0) exits(nil);
@ -349,4 +348,4 @@ main()
sendout(m); sendout(m);
msgdecref(m); msgdecref(m);
} }
} }

View file

@ -18,7 +18,7 @@ listensrv(Srv *os, char *addr)
*s = *os; *s = *os;
s->addr = estrdup9p(addr); s->addr = estrdup9p(addr);
s->infd = s->outfd = s->srvfd = -1; s->infd = s->outfd = -1;
s->fpool = nil; s->fpool = nil;
s->rpool = nil; s->rpool = nil;
s->msize = 0; s->msize = 0;

View file

@ -8,12 +8,15 @@
void void
postmountsrv(Srv *s, char *name, char *mtpt, int flag) postmountsrv(Srv *s, char *name, char *mtpt, int flag)
{ {
postsrv(s, name); int sfd;
sfd = postsrv(s, name);
if(sfd < 0)
sysfatal("postsrv: %r");
if(mtpt != nil){ if(mtpt != nil){
if(amount(s->srvfd, mtpt, flag, "") == -1) if(amount(sfd, mtpt, flag, "") == -1)
sysfatal("mount %s: %r", mtpt); sysfatal("mount %s: %r", mtpt);
/* mount closed s->srvfd */ /* mount closed sfd */
} else } else
close(s->srvfd); close(sfd);
} }

View file

@ -8,43 +8,41 @@ static void
postproc(void *v) postproc(void *v)
{ {
Srv *s = v; Srv *s = v;
rendezvous(0, 0); close((int)(uintptr)rendezvous(s, 0));
close(s->srvfd);
srv(s); srv(s);
} }
void int
postsrv(Srv *s, char *name) postsrv(Srv *s, char *name)
{ {
char buf[80]; int fd[2], cfd;
int fd[2];
int cfd;
if(pipe(fd) < 0) if(pipe(fd) < 0)
sysfatal("pipe: %r"); return -1;
s->infd = s->outfd = fd[1];
s->srvfd = fd[0];
if(name != nil){ if(name != nil){
char buf[80];
snprint(buf, sizeof buf, "/srv/%s", name); snprint(buf, sizeof buf, "/srv/%s", name);
if((cfd = create(buf, OWRITE|ORCLOSE|OCEXEC, 0600)) < 0) if((cfd = create(buf, OWRITE|ORCLOSE|OCEXEC, 0600)) < 0
sysfatal("create %s: %r", buf); || fprint(cfd, "%d", fd[0]) < 0){
if(fprint(cfd, "%d", s->srvfd) < 0) close(fd[0]);
sysfatal("write %s: %r", buf); fd[0] = -1;
goto Out;
}
} else } else
cfd = -1; cfd = -1;
/* now we are commited */
s->infd = s->outfd = fd[1];
if(s->forker == nil) if(s->forker == nil)
s->forker = srvforker; s->forker = srvforker;
(*s->forker)(postproc, s, RFNAMEG|RFNOTEG); (*s->forker)(postproc, s, RFNAMEG|RFNOTEG);
rfork(RFFDG); rfork(RFFDG);
rendezvous(0, 0); rendezvous(s, (void*)(uintptr)fd[0]);
Out:
close(s->infd);
if(s->infd != s->outfd)
close(s->outfd);
if(cfd >= 0) if(cfd >= 0)
close(cfd); close(cfd);
close(fd[1]);
return fd[0];
} }

View file

@ -8,7 +8,7 @@ void
postsharesrv(Srv *s, char *name, char *mtpt, char *desc) postsharesrv(Srv *s, char *name, char *mtpt, char *desc)
{ {
char buf[80]; char buf[80];
int cfd; int cfd, sfd;
if(mtpt != nil && desc != nil){ if(mtpt != nil && desc != nil){
snprint(buf, sizeof buf, "#σc/%s", mtpt); snprint(buf, sizeof buf, "#σc/%s", mtpt);
@ -21,12 +21,13 @@ postsharesrv(Srv *s, char *name, char *mtpt, char *desc)
} else } else
cfd = -1; cfd = -1;
postsrv(s, name); sfd = postsrv(s, name);
if(sfd < 0)
sysfatal("postsrv: %r");
if(cfd >= 0){ if(cfd >= 0){
if(fprint(cfd, "%d\n", s->srvfd) < 0) if(fprint(cfd, "%d\n", sfd) < 0)
sysfatal("write %s: %r", buf); sysfatal("write %s: %r", buf);
close(cfd); close(cfd);
} }
close(s->srvfd); close(sfd);
} }

View file

@ -4,10 +4,10 @@
#include <thread.h> #include <thread.h>
#include <9p.h> #include <9p.h>
void int
threadpostsrv(Srv *s, char *name) threadpostsrv(Srv *s, char *name)
{ {
if(s->forker == nil) if(s->forker == nil)
s->forker = threadsrvforker; s->forker = threadsrvforker;
postsrv(s, name); return postsrv(s, name);
} }