shithub: ridefs

Download patch

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 ..
 }
--