ref: 6b897c1d48b7f6e8a1ef0f5d3d7eb963c8183218
parent: 51e6ec12a2616a08679546084131f3f080168c4f
author: B. Wilson <x@wilsonb.com>
date: Thu Jun 19 04:38:06 EDT 2025
Write was calling respond on parent thread
--- a/ridefs.c
+++ b/ridefs.c
@@ -15,7 +15,6 @@
char *addr;
ulong umask;
- int timeout;
/* internal use */
char *user;
@@ -68,7 +67,6 @@
static long time0;
static uint nclients;
static int debug;
-static int timeout;
void*
ecalloc(ulong n){
@@ -112,11 +110,10 @@
"bufsz %u\n"
"nclients %u\n"
"debug %i\n"
- "timeout %i\n"
"umask 0%hlo\n"
"defport %s\n",
VERSION, bufsz, nclients,
- debug, timeout, umask, defport);
+ debug, umask, defport);
return strlen(qrctl);
}
@@ -129,9 +126,8 @@
sprintf(c->qctl,
"%i\n"
"connect %s\n"
- "timeout %i\n"
"umask 0%hlo\n",
- client, c->addr, c->timeout, c->umask);
+ client, c->addr, c->umask);
return strlen(c->qctl);
}
@@ -150,7 +146,6 @@
incref(c);
c->id = i;
- c->timeout = timeout;
c->umask = umask;
c->user = estrdup(getuser());
c->time0 = time(0);
@@ -213,23 +208,21 @@
}
long
-readmsg(int fd, char *pld, long n){
- int len;
+readmsg(int fd, void *pld, long n){
+ int len, e;
char buf[9];
- if(0 > readn(fd, buf, 8))
- return -1;
+ if(0 > (e = readn(fd, buf, 8)))
+ return e;
buf[9] = '\0';
- if(0 != strcmp(&buf[4], "RIDE"))
- return -2;
+ if(0 != (e = strcmp(&buf[4], "RIDE")))
+ return e;
len = -8 + (buf[0]<<24 | buf[1]<<16 | buf[2]<<8 | buf[3]);
if(len > n)
- return -3;
- if(0 > readn(fd, pld, len))
- return -4;
+ return n-len;
+ if(0 > (e = readn(fd, pld, len)))
+ return e;
- pld = erealloc(pld, len+1);
- pld[len] = '\0';
return len;
}
@@ -311,8 +304,6 @@
nclients = strtoul(strtok(nil, sep), nil, 0);
if(strcmp(s, "debug") == 0)
debug = atoi(strtok(nil, sep));
- if(strcmp(s, "timeout") == 0)
- timeout = atoi(strtok(nil, sep));
if(strcmp(s, "defport") == 0)
defport = estrdup(strtok(nil, sep));
}
@@ -333,8 +324,6 @@
for(s = strtok(b, sep); s != nil; s = strtok(nil, sep)){
if(strcmp(s, "connect") == 0)
c->addr = estrdup(strtok(nil, sep));
- if(strcmp(s, "timeout") == 0)
- c->timeout = atoi(strtok(nil, sep));
if(strcmp(s, "umask") == 0)
c->umask = strtoul(strtok(nil, sep), nil, 0);
}
@@ -476,7 +465,6 @@
f = r->fid->aux;
c = clientref(f->client);
-
switch(f->kind){
case Qclone:
if((f->client = mkclient()) == -1){
@@ -501,9 +489,7 @@
switch(pid = rfork(RFPROC|RFNOWAIT|RFMEM)){
case 0:
- alarm(timeout);
err = rideinit(f->client);
- alarm(0);
if(err == nil)
c->oio = 1;
c->iopid = 0;
@@ -514,6 +500,7 @@
break;
default:
c->iopid = pid;
+ return;
}
break;
default:
@@ -534,18 +521,24 @@
switch(f->kind){
case Qroot: dirread9p(r, genqroot, nil); break;
case Qrctl: buf = estrdup(qrctl); break;
- case Qclone: respond(r, "read prohibited"); return;
+ case Qclone: err = "read prohibited"; break;
case Qclient: dirread9p(r, genqclient, (void*)f->client); break;
case Qctl: buf = estrdup(c->qctl); break;
+ case Qrinfo: buf = estrdup(c->rinfo); break;
case Qio:
switch(pid = rfork(RFPROC|RFNOWAIT|RFMEM)){
case 0:
- alarm(c->timeout);
buf = ecalloc(bufsz);
n = readmsg(c->fd, buf, bufsz);
- alarm(0);
+ if(n < 0)
+ err = "failed to read response";
+ else
+ readbuf(r, buf, n);
+
c->iopid = 0;
- readbuf(r, buf, n);
+ respond(r, err);
+
+ free(buf);
exits(nil);
case -1:
err = "failed to fork read";
@@ -552,13 +545,14 @@
break;
default:
c->iopid = pid;
+ return;
}
break;
- case Qrinfo: buf = estrdup(c->rinfo); break;
}
if(buf != nil){
- readbuf(r, buf, strlen(buf));
+ readstr(r, buf);
+ free(buf);
}
respond(r, err);
@@ -588,10 +582,9 @@
case Qio:
switch(pid = rfork(RFPROC|RFNOWAIT|RFMEM)){
case 0:
- alarm(c->timeout);
r->ofcall.count = writemsg(c->fd, d, n);
- alarm(0);
c->iopid = 0;
+ respond(r, nil);
exits(nil);
case -1:
err = "failed to fork write";
@@ -598,6 +591,7 @@
break;
default:
c->iopid = pid;
+ return;
}
break;
default:
@@ -715,7 +709,7 @@
void
usage(void){
- fprintf(stderr, "usage: %s [-Dd] [-T timeout] [-m mtpt] [-s service]\n", argv0);
+ fprintf(stderr, "usage: %s [-Dd] [-m mtpt] [-s service]\n", argv0);
}
void
@@ -727,12 +721,10 @@
bufsz = 4096;
time0 = time(0);
nclients = 256;
- timeout = 10000;
ARGBEGIN{
case 'D': chatty9p++; break;
case 'd': debug++; break;
- case 'T': timeout = atoi(EARGF(usage()));
case 'm': mtpt = EARGF(usage()); break;
case 's': service = EARGF(usage()); break;
default: usage(); return;
@@ -749,15 +741,13 @@
"ridefs:\n"
"\tchatty9p = %i\n"
"\tdebug = %i\n"
- "\ttimeout = %i\n"
"\tmtpt = %s\n"
"\tservice = %s\n"
"\tdefport = %s\n"
"\tfs = %p\n"
"\tcpool = %p\n",
- chatty9p, debug, timeout,
- mtpt, service, defport,
- &fs, cpool);
+ chatty9p, debug, mtpt, service,
+ defport, &fs, cpool);
rfork(RFNOTEG);
postmountsrv(&fs, service, mtpt, MREPL);
--- a/test
+++ b/test
@@ -14,14 +14,14 @@
cat ctl >/dev/null ||
fail 'Could not read ctl'
-ot=`{grep timeout ctl}
-echo 'timeout 5000' >ctl ||
+x=`{grep debug ctl}
+echo 'debug 1' >ctl ||
fail 'Could not write ctl'
-nt=`{grep timeout ctl}
-~ $nt(2) 5000 ||
+y=`{grep debug ctl}
+~ $y(2) 1 ||
fail 'Written and read ctl values differ'
-echo timeout $ot(2) >ctl
+echo debug $x(2) >ctl
cat clone >/dev/null ||
fail 'Could not clone'
@@ -33,14 +33,14 @@
cat ctl >/dev/null ||
fail 'Could not read client ctl'
- ot=`{grep timeout ctl}
- echo 'timeout 5000' >ctl ||
+ x=`{grep umask ctl}
+ echo 'umask 0777' >ctl ||
fail 'Could not write client ctl'
- nt=`{grep timeout ctl}
- ~ $nt(2) 5000 ||
+ y=`{grep umask ctl}
+ ~ $y(2) 0777 ||
fail 'Written and read client ctl values differ'
- echo timeout $ot(2) >ctl
+ echo umask $x(2) >ctl
cd .. ||
fail 'Could not cd out of client directory'
@@ -60,8 +60,9 @@
~ `{wc -c rinfo} 0 &&
fail 'Did not receive RIDE info'
- echo '["Execute",{"text":" ⍳5\n","trace":0}]' ||
+ echo -n '["Execute",{"text":" ⍳5\n","trace":0}]' ||
fail 'Could not write message'
+ cat >[1=2]
}
cd ..
}
--
⑨