shithub: svcfs

Download patch

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");
--