ref: 344034ea3fd4be80713a50989a03e331fd609dc9
parent: 1437af59aab6295023dff89337b24b84f2096d9f
author: Michael Forney <mforney@mforney.org>
date: Wed Mar 30 16:59:57 EDT 2022
add -s option for 9p over stdin/stdout
--- a/dat.h
+++ b/dat.h
@@ -539,7 +539,8 @@
struct Conn {
Conn *next;
- int fd;
+ int rfd;
+ int wfd;
int iounit;
int versioned;
--- a/fns.h
+++ b/fns.h
@@ -78,6 +78,8 @@
int compresslog(Arena*);
void setval(Blk*, Kvp*);
+Conn* newconn(int, int);
+
char* loadusers(int, Tree*);
User* uid2user(int);
User* name2user(char*);
--- a/fs.c
+++ b/fs.c
@@ -164,7 +164,7 @@
}
static void
-fshangup(int fd, char *fmt, ...)
+fshangup(Conn *c, char *fmt, ...)
{
char buf[ERRMAX];
va_list ap;
@@ -173,7 +173,8 @@
vsnprint(buf, sizeof(buf), fmt, ap);
va_end(ap);
fprint(2, "%s\n", buf);
- close(fd);
+ close(c->rfd);
+ close(c->wfd);
abort();
}
@@ -188,9 +189,9 @@
dprint("→ %F\n", r);
if((n = convS2M(r, buf, sizeof(buf))) == 0)
abort();
- w = write(m->conn->fd, buf, n);
+ w = write(m->conn->wfd, buf, n);
if(w != n)
- fshangup(m->conn->fd, Eio);
+ fshangup(m->conn, Eio);
if(m->type != Tflush) {
lock(&fs->mflushlk);
fs->mflush[m->tag] = nil;
@@ -503,7 +504,7 @@
for(c = fs->conns; c != nil; c = c->next){
lock(&c->fidtablk);
- fprint(fd, "fids:%d\n", c->fd);
+ fprint(fd, "fids:%d\n", c->rfd);
for(i = 0; i < Nfidtab; i++)
for(f = c->fidtab[i]; f != nil; f = f->next){
rlock(f->dent);
@@ -608,7 +609,7 @@
int sz, n;
Fmsg *m;
- n = readn(c->fd, szbuf, 4);
+ n = readn(c->rfd, szbuf, 4);
if(n <= 0){
*pm = nil;
return n;
@@ -624,7 +625,7 @@
}
if((m = malloc(sizeof(Fmsg)+sz)) == nil)
return -1;
- if(readn(c->fd, m->buf+4, sz-4) != sz-4){
+ if(readn(c->rfd, m->buf+4, sz-4) != sz-4){
werrstr("short read: %r");
free(m);
return -1;
@@ -1966,39 +1967,45 @@
unlock(&fs->mflushlk);
}
-void
-runfs(int, void *pfd)
+Conn *
+newconn(int rfd, int wfd)
{
Conn *c;
- int fd;
- char err[128];
- Fcall r;
- Fmsg *m;
- fd = (uintptr)pfd;
- if((c = mallocz(sizeof(*c), 1)) == nil){
- fshangup(fd, "malloc: %r");
- return;
- }
- c->fd = fd;
+ if((c = mallocz(sizeof(*c), 1)) == nil)
+ return nil;
+ c->rfd = rfd;
+ c->wfd = wfd;
c->iounit = Max9p;
- lock(&fs->connlk);
c->next = fs->conns;
+ lock(&fs->connlk);
fs->conns = c;
unlock(&fs->connlk);
+ return c;
+}
+
+void
+runfs(int, void *pc)
+{
+ Conn *c;
+ char err[128];
+ Fcall r;
+ Fmsg *m;
+
+ c = pc;
while(1){
if(readmsg(c, &m) < 0){
- fshangup(fd, "read message: %r");
+ fshangup(c, "read message: %r");
return;
}
if(m == nil)
break;
if(convM2S(m->buf, m->sz, m) == 0){
- fshangup(fd, "invalid message: %r");
+ fshangup(c, "invalid message: %r");
return;
}
if(m->type != Tversion && !c->versioned){
- fshangup(fd, "version required");
+ fshangup(c, "version required");
return;
}
dprint("← %F\n", &m->Fcall);
--- a/main.c
+++ b/main.c
@@ -10,6 +10,7 @@
int ream;
int debug;
+int stdio;
int noauth;
int nproc;
char *forceuser;
@@ -86,6 +87,7 @@
{
char *ann, adir[40], ldir[40];
int actl, lctl, fd;
+ Conn *c;
ann = arg;
if((actl = announce(ann, adir)) < 0)
@@ -101,7 +103,13 @@
fprint(2, "accept %s: %r", ldir);
continue;
}
- launch(runfs, -1, (void *)fd, "netio");
+ if(!(c = newconn(fd, fd))){
+ close(fd);
+ fprint(2, "%r");
+ continue;
+ }
+
+ launch(runfs, -1, c, "netio");
}
close(actl);
}
@@ -118,6 +126,7 @@
{
int i, srvfd, ctlfd, nann;
char *s, *ann[16];
+ Conn *c;
nann = 0;
ARGBEGIN{
@@ -138,6 +147,9 @@
case 'n':
srvname = EARGF(usage());
break;
+ case 's':
+ stdio = 1;
+ break;
case 'A':
noauth = 1;
break;
@@ -211,7 +223,15 @@
launch(runsync, -1, &fs->syncq[i], "syncio");
for(i = 0; i < nann; i++)
launch(runannounce, -1, ann[i], "announce");
- if(srvfd != -1)
- launch(runfs, -1, (void *)srvfd, "srvio");
+ if(srvfd != -1){
+ if((c = newconn(srvfd, srvfd)) == nil)
+ sysfatal("%r");
+ launch(runfs, -1, c, "srvio");
+ }
+ if(stdio){
+ if((c = newconn(0, 1)) == nil)
+ sysfatal("%r");
+ runfs(-1, c);
+ }
exits(nil);
}