ref: 5280b703011ef49503f520de93f6eb20fd340d8b
parent: b5aa12ceca7ee1532a457189b8e304c59e15f711
author: Michael Misch <michaelmisch1985@gmail.com>
date: Mon Aug 19 02:13:34 EDT 2024
Small bugfixes, ensure we open the fd when we attach with a bufname
--- a/client.c
+++ b/client.c
@@ -75,7 +75,10 @@
cl->ref++;
cl->current = bufferSearch(root, aname);
+ if(cl->current)
+ cl->current->tag = 0;
cl->showmarkdown = 0;
+ cl->fd = -1;
return cl;
}
@@ -127,9 +130,17 @@
clattach(Req *r)
{Clfid *f;
+ char path[1024];
f = mallocz(sizeof(*f), 1);
f->cl = newclient(r->ifcall.aname);
+
+ /* Attach request has buffer */
+ if(r->ifcall.aname[0]){+ memset(path, 0, sizeof(path));
+ snprint(path, sizeof(path), "%s/%s/%s", logdir, root->name, r->ifcall.aname);
+ f->cl->fd = open(path, OREAD);
+ }
f->level = Qcroot;
clmkqid(&r->fid->qid, f->level, nil);
r->ofcall.qid = r->fid->qid;
@@ -225,7 +236,8 @@
return;
case Qfeed:
// Catch EOF
- if(!f->cl->fd || !f->cl->current){+ if(f->cl->fd < 0 || !f->cl->current){+ r->ofcall.count = 0;
r->ofcall.data[0] = 0;
respond(r, nil);
return;
@@ -239,8 +251,8 @@
n = pread(f->cl->fd, buf, sizeof(buf), r->ifcall.offset);
if(n > 0){// cut off the EOF
- r->ofcall.count = n;
- memmove(r->ofcall.data, buf, n);
+ buf[n] = 0;
+ readstr(r, buf);
} else {qlock(&b->l);
b->unread = 0;
@@ -333,7 +345,7 @@
return;
}
qlock(&b->l);
- if(f->cl->fd){+ if(f->cl->fd > 0){b->tag = flushtag = 1;
rwakeup(&b->rz);
close(f->cl->fd);
--- a/convS2C.c
+++ b/convS2C.c
@@ -5,6 +5,8 @@
#include <9p.h>
#include "alt.h"
+// TODO: Read runes instead of ascii
+
struct state
{Cmd cmd;
@@ -38,10 +40,7 @@
static int
parse_cmd(struct state *s)
{- int n;
- char *first;
-
- n = 0;
+ int n = 0;
for(;;){if(n > s->size)
return -1;
@@ -82,14 +81,13 @@
s->cmd.type = StatusCmd;
else if(strncmp(s->base, "crea", 4) == 0)
s->cmd.type = CreateCmd;
- else if(strncmp(s->base, "buf", 3) == 0)
+ else if(strncmp(s->base, "buff", 4) == 0)
s->cmd.type = BufferCmd;
else if(strncmp(s->base, "mark", 4) == 0)
s->cmd.type = MarkdownCmd;
else {s->cmd.type = ServiceCmd;
- first = strtok(s->base, " ");
- sprint(s->cmd.svccmd, first);
+ snprint(s->cmd.svccmd, n, s->base);
}
s->size -= n;
n++;
@@ -105,8 +103,7 @@
static int
parse_from(struct state *s)
{- int n;
- n = 0;
+ int n = 0;
for(;;){if(n > s->size || n > MaxBuflen)
return -1;
@@ -118,7 +115,7 @@
s->size--;
s->base++;
break;
- case '\0':
+ case 0:
strncpy(s->cmd.buffer, s->base, n);
return 0;
case '\n':
@@ -142,7 +139,29 @@
static int
parse_data(struct state *s)
{- // We may eventually do some processing here
- s->cmd.data = strdup(s->base);
- return 0;
+ int n = 0;
+ char c;
+
+ for(;;) {+ if(n >= s->size || n >= MaxBuflen)
+ return -1;
+ c = s->base[n];
+ switch(c){+ // Useful control chars
+ case '\n':
+ case '\t':
+ case '\r':
+ break;
+ default:
+ // Anything under a space is an unhandled control char
+ if(c < ' '){+ if(n > 0 ){ + s->cmd.data = strdup(s->base);
+ s->cmd.data[n] = 0;
+ }
+ return 0;
+ }
+ }
+ n++;
+ }
}
--- a/service.c
+++ b/service.c
@@ -367,7 +367,7 @@
d->mode = 0666;
if(dirwstat(s, d) < 0){respond(r, "unable to set mode");
- return;
+ goto Out;
}
free(s);
f->svc->isInitialized++;
@@ -375,23 +375,23 @@
respond(r, nil);
} else
respond(r, "Unable to post to srv");
- return;
+ goto Out;
}
// Ignore, something weird going on.
respond(r, nil);
- return;
+ goto Out;
case CreateCmd:
respond(r, bufferPush(f->svc->base, cmd.buffer));
- return;
+ goto Out;
case NotifyCmd:
respond(r, "not implemented yet");
- return;
+ goto Out;
case DeleteCmd:
respond(r, bufferDrop(f->svc->base, cmd.buffer));
- return;
+ goto Out;
case ErrorCmd:
respond(r, "not implemented yet");
- return;
+ goto Out;
}
if(b = bufferSearch(f->svc->base, cmd.buffer)) {qlock(&b->l);
@@ -417,6 +417,8 @@
respond(r, nil);
} else
respond(r, "buffer not found");
+ Out:
+ free(p);
return;
}
respond(r, "not implemented");
--
⑨