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