diff --git a/sys/include/9p.h b/sys/include/9p.h index 1a51ffeab..bfbe0d7ec 100644 --- a/sys/include/9p.h +++ b/sys/include/9p.h @@ -214,7 +214,6 @@ struct Srv { int infd; int outfd; - int srvfd; char* keyspec; /* below is implementation-specific; don't use */ @@ -243,13 +242,13 @@ void srvforker(void (*)(void*), void*, int); void threadsrvforker(void (*)(void*), void*, int); void srv(Srv*); -void postsrv(Srv*, char*); +int postsrv(Srv*, char*); void postmountsrv(Srv*, char*, char*, int); void postsharesrv(Srv*, char*, char*, char*); void listensrv(Srv*, char*); void threadsrv(Srv*); -void threadpostsrv(Srv*, char*); +int threadpostsrv(Srv*, char*); void threadpostmountsrv(Srv*, char*, char*, int); void threadpostsharesrv(Srv*, char*, char*, char*); void threadlistensrv(Srv *s, char *addr); diff --git a/sys/man/2/9p b/sys/man/2/9p index d68fbaa2c..4fb831d09 100644 --- a/sys/man/2/9p +++ b/sys/man/2/9p @@ -63,7 +63,6 @@ typedef struct Srv { int infd; int outfd; - int srvfd; void (*forker)(void (*fn)(void*), void *arg, int flags); } Srv; @@ -73,12 +72,12 @@ typedef struct Srv { .ft L .ta \w'\fLvoid* 'u 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 postsharesrv(Srv *s, char *name, char *mtpt, char *desc) void listensrv(Srv *s, char *addr) 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 threadpostsharesrv(Srv *s, char *name, char *mtpt, char *desc) void threadlistensrv(Srv *s, char *addr) @@ -193,14 +192,26 @@ or (see .IR thread (2)). .PP -.I Postmountsrv + +.I Postsrv and -.I threadpostmountsrv +.I threadpostsrv are wrappers that create a separate process in which to run .IR srv . They do the following: .IP 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 to eigther .I srvforker @@ -208,24 +219,6 @@ or .I threadsrvforker unless already initialized to a non-nil value. .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 .IB s -> forker using the @@ -248,27 +241,37 @@ flag. This way, the service loop will share the original file descriptor table with previously created child processes of the caller. .IP -The child process then calls -.IB close( s -> srvfd ) -and then -.IB srv( s ) \fR; -it will exit once -.I srv -returns. +The child process then closes the other end file descriptor +and calls +.IR srv . .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 is non-nil, call -.BI amount( s -> srvfd, +.BI amount( sfd , .IB mtpt , .IB flag , \fB"")\fR; -otherwise, close -.IB s -> srvfd \fR. -.IP -The parent returns to the caller. -.LP +otherwise, close the file descriptor. If any error occurs during this process, the entire process is terminated by calling .I sysfatal diff --git a/sys/src/cmd/aux/wacom.c b/sys/src/cmd/aux/wacom.c index 5b076873c..876d4ab15 100644 --- a/sys/src/cmd/aux/wacom.c +++ b/sys/src/cmd/aux/wacom.c @@ -329,7 +329,6 @@ main() pipe(fd); tabletsrv.infd = tabletsrv.outfd = fd[0]; - tabletsrv.srvfd = fd[1]; tabletsrv.tree = alloctree(getuser(), getuser(), 0555, 0); tfile = createfile(tabletsrv.tree->root, "tablet", getuser(), 0400, 0); if(rfork(RFPROC | RFMEM | RFNOWAIT | RFNOTEG) > 0) exits(nil); @@ -349,4 +348,4 @@ main() sendout(m); msgdecref(m); } -} \ No newline at end of file +} diff --git a/sys/src/lib9p/listen.c b/sys/src/lib9p/listen.c index c7e8dd02c..b093bc287 100644 --- a/sys/src/lib9p/listen.c +++ b/sys/src/lib9p/listen.c @@ -18,7 +18,7 @@ listensrv(Srv *os, char *addr) *s = *os; s->addr = estrdup9p(addr); - s->infd = s->outfd = s->srvfd = -1; + s->infd = s->outfd = -1; s->fpool = nil; s->rpool = nil; s->msize = 0; diff --git a/sys/src/lib9p/mount.c b/sys/src/lib9p/mount.c index 1adc90bed..1ab41825c 100644 --- a/sys/src/lib9p/mount.c +++ b/sys/src/lib9p/mount.c @@ -8,12 +8,15 @@ void 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(amount(s->srvfd, mtpt, flag, "") == -1) + if(amount(sfd, mtpt, flag, "") == -1) sysfatal("mount %s: %r", mtpt); - /* mount closed s->srvfd */ + /* mount closed sfd */ } else - close(s->srvfd); + close(sfd); } diff --git a/sys/src/lib9p/post.c b/sys/src/lib9p/post.c index 18ded63ba..b2134968c 100644 --- a/sys/src/lib9p/post.c +++ b/sys/src/lib9p/post.c @@ -8,43 +8,41 @@ static void postproc(void *v) { Srv *s = v; - rendezvous(0, 0); - close(s->srvfd); + close((int)(uintptr)rendezvous(s, 0)); srv(s); } -void +int postsrv(Srv *s, char *name) { - char buf[80]; - int fd[2]; - int cfd; + int fd[2], cfd; if(pipe(fd) < 0) - sysfatal("pipe: %r"); - s->infd = s->outfd = fd[1]; - s->srvfd = fd[0]; - + return -1; if(name != nil){ + char buf[80]; + 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); + if((cfd = create(buf, OWRITE|ORCLOSE|OCEXEC, 0600)) < 0 + || fprint(cfd, "%d", fd[0]) < 0){ + close(fd[0]); + fd[0] = -1; + goto Out; + } } else cfd = -1; + /* now we are commited */ + s->infd = s->outfd = fd[1]; if(s->forker == nil) s->forker = srvforker; (*s->forker)(postproc, s, RFNAMEG|RFNOTEG); rfork(RFFDG); - rendezvous(0, 0); - - close(s->infd); - if(s->infd != s->outfd) - close(s->outfd); - + rendezvous(s, (void*)(uintptr)fd[0]); +Out: if(cfd >= 0) close(cfd); + close(fd[1]); + return fd[0]; } diff --git a/sys/src/lib9p/share.c b/sys/src/lib9p/share.c index ff73e9c3e..afa01c2f2 100644 --- a/sys/src/lib9p/share.c +++ b/sys/src/lib9p/share.c @@ -8,7 +8,7 @@ void postsharesrv(Srv *s, char *name, char *mtpt, char *desc) { char buf[80]; - int cfd; + int cfd, sfd; if(mtpt != nil && desc != nil){ snprint(buf, sizeof buf, "#σc/%s", mtpt); @@ -21,12 +21,13 @@ postsharesrv(Srv *s, char *name, char *mtpt, char *desc) } else cfd = -1; - postsrv(s, name); - + sfd = postsrv(s, name); + if(sfd < 0) + sysfatal("postsrv: %r"); if(cfd >= 0){ - if(fprint(cfd, "%d\n", s->srvfd) < 0) + if(fprint(cfd, "%d\n", sfd) < 0) sysfatal("write %s: %r", buf); close(cfd); } - close(s->srvfd); + close(sfd); } diff --git a/sys/src/lib9p/threadpostsrv.c b/sys/src/lib9p/threadpostsrv.c index abdb882e8..b627a8653 100644 --- a/sys/src/lib9p/threadpostsrv.c +++ b/sys/src/lib9p/threadpostsrv.c @@ -4,10 +4,10 @@ #include #include <9p.h> -void +int threadpostsrv(Srv *s, char *name) { if(s->forker == nil) s->forker = threadsrvforker; - postsrv(s, name); + return postsrv(s, name); }