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:
parent
57c21ae441
commit
ee289c2415
8 changed files with 77 additions and 74 deletions
|
@ -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);
|
||||||
|
|
77
sys/man/2/9p
77
sys/man/2/9p
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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];
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue