shithub: ridefs

Download patch

ref: 51e6ec12a2616a08679546084131f3f080168c4f
parent: 38f2878c44f584d472560c9a426d01cdd3fb99cb
author: B. Wilson <x@wilsonb.com>
date: Wed Jun 18 08:27:10 EDT 2025

Fix connection setup

--- a/ridefs.c
+++ b/ridefs.c
@@ -19,7 +19,6 @@
 
 	/* internal use */
 	char *user;
-	char *pres;     /* previous result */
 	char *rinfo;
 	char *qctl;
 	long time0;
@@ -61,7 +60,7 @@
 static Client *cpool;
 static char *mtpt;
 static char *service;
-static char *net;
+static char *defport;
 static char *user;
 static char *qrctl;
 static ulong umask;
@@ -114,9 +113,10 @@
 		"nclients %u\n"
 		"debug %i\n"
 		"timeout %i\n"
-		"umask 0%hlo\n",
+		"umask 0%hlo\n"
+		"defport %s\n",
 		VERSION, bufsz, nclients,
-		debug, timeout, umask);
+		debug, timeout, umask, defport);
 
 	return strlen(qrctl);
 }
@@ -169,7 +169,6 @@
 		return;
 
 	if(c->user) free(c->user);
-	if(c->pres) free(c->pres);
 	if(c->qctl) free(c->qctl);
 	if(c->rinfo) free(c->rinfo);
 	if(c->fd) close(c->fd);
@@ -194,8 +193,8 @@
 
 long
 writemsg(int fd, void *pld, long n){
-	long len;
 	char *r;
+	int len;
 
 	len = n+8;
 	r = ecalloc(len+8);
@@ -208,9 +207,9 @@
 	r[6] = 'D';
 	r[7] = 'E';
 	memcpy(&r[8], pld, n);
-	len = write(fd, r, len);
+	write(fd, r, len);
 
-	return len;
+	return n;
 }
 
 long
@@ -243,9 +242,11 @@
 	JSONEl *d;
 
 	c = clientref(client);
-	addr = netmkaddr(c->addr, net, "tcp");
+	addr = netmkaddr(c->addr, "tcp", defport);
+	if(debug)
+		fprintf(stderr, "dialing %s\n", addr);
 	if((fd = dial(addr, nil, nil, &c->cfd)) < 0)
-		return "failed to dial addr";
+		return "failed to dial";
 	c = clientref(client);
 	c->fd = fd;
 
@@ -276,10 +277,10 @@
 	if(nil == (d = j->first->next) || d->val->t != JSONObject)
 		return "malformed identification reply";
 
-	c->rinfo = s = ecalloc(bufsz);
+	s = c->rinfo = ecalloc(bufsz);
 	buf = ecalloc(bufsz);
 	e = s + bufsz-1;
-	for(; d != nil; d = d->next){
+	for(d = d->val->first; d != nil; d = d->next){
 		switch(d->val->t){
 		case JSONBool:
 		case JSONNumber:
@@ -312,6 +313,8 @@
 			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));
 	}
 
 	cpool = erealloc(cpool, nclients*sizeof(*cpool));
@@ -341,33 +344,6 @@
 	return n;
 }
 
-long
-writeqio(char *b, long, int client){
-	Client *c;
-	char *pld, *e, *p, *z;
-	long sz;
-
-	c = clientref(client);
-	pld = z = ecalloc(bufsz);
-	e = pld + bufsz - 1;
-	sz = -1;
-	if(p == (z = strecpy(p = z, e, "[\"Execute\",{\"text\":\"      ")))
-		goto end;
-	if(p == (z = strecpy(p = z, e, b)))
-		goto end;
-	if(p == strecpy(p = z, e, "\",\"trace\":0}]"))
-		goto end;
-
-	sz = strlen(pld);
-	writemsg(c->fd, pld, sz);
-	readmsg(c->fd, pld, bufsz);
-	c->pres = estrdup(pld);
-
-	end:
-	free(pld);
-	return sz;
-}
-
 void
 mkdirent(Dir *d, int kind, int client){
 	Client *c;
@@ -413,7 +389,7 @@
 	switch(kind){
 	case Qrctl: d->length = strlen(qrctl); break;
 	case Qctl: d->length = strlen(c->qctl); break;
-	case Qio: d->length = c->pres == nil ? 0 : strlen(c->pres); break;
+	case Qio: d->length = 0; break;
 	case Qrinfo: d->length = c->rinfo == nil ? 0 : strlen(c->rinfo); break;
 	}
 }
@@ -494,7 +470,7 @@
 static void
 fsopen(Req *r){
 	int e, pid;
-	char *res;
+	char *err;
 	Rfid *f;
 	Client *c;
 
@@ -526,13 +502,13 @@
 		switch(pid = rfork(RFPROC|RFNOWAIT|RFMEM)){
 		case 0:
 			alarm(timeout);
-			res = rideinit(f->client);
+			err = rideinit(f->client);
 			alarm(0);
-			if(res == nil)
+			if(err == nil)
 				c->oio = 1;
 			c->iopid = 0;
-			respond(r, res);
-			break;
+			respond(r, err);
+			exits(nil);
 		case -1:
 			respond(r, "failed to init ride");
 			break;
@@ -549,9 +525,10 @@
 fsread(Req *r){
 	Rfid *f;
 	Client *c;
-	char *buf;
+	char *buf, *err;
+	int pid, n;
 
-	buf = nil;
+	buf = err = nil;
 	f = r->fid->aux;
 	c = clientref(f->client);
 	switch(f->kind){
@@ -560,16 +537,31 @@
 	case Qclone: respond(r, "read prohibited"); return;
 	case Qclient: dirread9p(r, genqclient, (void*)f->client); break;
 	case Qctl: buf = estrdup(c->qctl); break;
-	case Qio: buf = estrdup(c->pres); 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);
+			c->iopid = 0;
+			readbuf(r, buf, n);
+			exits(nil);
+		case -1:
+			err = "failed to fork read";
+			break;
+		default:
+			c->iopid = pid;
+		}
+		break;
 	case Qrinfo: buf = estrdup(c->rinfo); break;
 	}
 
 	if(buf != nil){
 		readbuf(r, buf, strlen(buf));
-		free(buf);
 	}
 
-	respond(r, nil);
+	respond(r, err);
 }
 
 static void
@@ -597,10 +589,10 @@
 		switch(pid = rfork(RFPROC|RFNOWAIT|RFMEM)){
 		case 0:
 			alarm(c->timeout);
-			r->ofcall.count = writeqio(d, n, f->client);
+			r->ofcall.count = writemsg(c->fd, d, n);
 			alarm(0);
 			c->iopid = 0;
-			break;
+			exits(nil);
 		case -1:
 			err = "failed to fork write";
 			break;
@@ -723,7 +715,7 @@
 
 void
 usage(void){
-	fprintf(stderr, "usage: %s [-Dd] [-T timeout] [-m mtpt] [-s service] [-x net]\n", argv0);
+	fprintf(stderr, "usage: %s [-Dd] [-T timeout] [-m mtpt] [-s service]\n", argv0);
 }
 
 void
@@ -730,6 +722,7 @@
 main(int argc, char **argv){
 	user = getuser();
 	mtpt = "/mnt/ride";
+	defport = "4502";
 	umask = 0755;
 	bufsz = 4096;
 	time0 = time(0);
@@ -742,7 +735,6 @@
 	case 'T': timeout = atoi(EARGF(usage()));
 	case 'm': mtpt = EARGF(usage()); break;
 	case 's': service = EARGF(usage()); break;
-	case 'x': net = EARGF(usage()); break;
 	default:  usage(); return;
 	}ARGEND
 
@@ -750,6 +742,8 @@
 	qrctl = ecalloc(bufsz);
 	genqrctl();
 
+	JSONfmtinstall();
+
 	if(debug)
 		fprintf(stderr,
 			"ridefs:\n"
@@ -758,11 +752,11 @@
 			"\ttimeout = %i\n"
 			"\tmtpt = %s\n"
 			"\tservice = %s\n"
-			"\tnet = %s\n"
+			"\tdefport = %s\n"
 			"\tfs = %p\n"
 			"\tcpool = %p\n",
 			chatty9p, debug, timeout,
-			mtpt, service, net,
+			mtpt, service, defport,
 			&fs, cpool);
 
 	rfork(RFNOTEG);
--- a/test
+++ b/test
@@ -1,6 +1,6 @@
 #!/bin/rc
 
-fn fail{ echo $1; exit $1}
+fn fail{ echo $1 >[1=2]; exit $1}
 
 ./6.out $* ||
 	fail 'Crashed at startup'
@@ -49,3 +49,19 @@
 n=`{read clone}
 ls -d $n >[2]/dev/null &&
 	fail 'Did not clean up closed client'
+
+<clone {
+	cd `{read}
+
+	echo 'connect 192.168.11.17' >ctl ||
+		fail 'Could not connect to server'
+
+	<>io >[1=0] {
+		~ `{wc -c rinfo} 0 &&
+			fail 'Did not receive RIDE info'
+
+		echo '["Execute",{"text":"      ⍳5\n","trace":0}]' ||
+			fail 'Could not write message'
+	}
+	cd ..
+}
--