shithub: drawfs

Download patch

ref: 4d3501c83004c2f4499583506236111bd21a9380
parent: 403546812898220ca456dea0f559cb2221ec4fcf
author: sirjofri <sirjofri@sirjofri.de>
date: Tue Jan 7 16:30:56 EST 2025

fixes missing cmd.c file

--- /dev/null
+++ b/drawfs/cmd.c
@@ -1,0 +1,258 @@
+#include <u.h>
+#include <libc.h>
+#include <draw.h>
+#include <thread.h>
+#include <fcall.h>
+#include <9p.h>
+#include "fns.h"
+
+Channel *chan;
+
+enum {
+	Qroot,
+	Qctl,
+	Qdisplay,
+	Qrefresh,
+};
+
+static void
+mkqid(Qid *q, int f)
+{
+	q->path = f;
+	q->vers = 0;
+	q->type = f == Qroot ? QTDIR : QTFILE;
+}
+
+static void
+mkqdir(Dir *dir, int q)
+{
+	mkqid(&dir->qid, q);
+	dir->mode = 0666;
+	if (q == Qroot)
+		dir->mode |= DMDIR;
+	
+	dir->atime = dir->mtime = time(0);
+	dir->length = 0;
+	dir->uid = estrdup9p(getuser());
+	dir->muid = estrdup9p(dir->uid);
+	dir->gid = estrdup9p(dir->uid);
+	switch (q) {
+	case Qroot:
+		dir->name = estrdup9p(".");
+		break;
+	case Qctl:
+		dir->name = estrdup9p("ctl");
+		break;
+	case Qdisplay:
+		dir->name = estrdup9p("display");
+		break;
+	case Qrefresh:
+		dir->name = estrdup9p("refresh");
+		break;
+	}
+}
+
+static int
+genroot(int n, Dir *dir, void*)
+{
+	switch (n) {
+	case 0:
+		mkqdir(dir, Qctl);
+		return 0;
+	case 1:
+		mkqdir(dir, Qdisplay);
+		return 0;
+	case 2:
+		mkqdir(dir, Qrefresh);
+		return 0;
+	}
+	return -1;
+}
+
+typedef struct CtlArgs CtlArgs;
+struct CtlArgs {
+	Channel *c;
+	Req *r;
+};
+
+static void
+ctlreadproc(void *arg)
+{
+	char *cptr;
+	CtlArgs a;
+	
+	a = *((CtlArgs*)arg);
+	
+	cptr = recvp(a.c);
+	a.r->ifcall.offset = 0;
+	if (a.r->ifcall.count < strlen(cptr)) {
+		respond(a.r, "short read");
+		goto Out;
+	}
+	fprint(2, "ctl: %s\n", cptr);
+	readstr(a.r, cptr);
+	
+Out:
+	free(cptr);
+	free(arg);
+	if (!a.r->responded)
+		respond(a.r, nil);
+}
+
+static void
+ctlread(Req *r)
+{
+	CtlArgs *arg;
+	
+	switch (r->fid->qid.path) {
+	case Qroot:
+		dirread9p(r, genroot, nil);
+		respond(r, nil);
+		return;
+	case Qctl:
+		arg = malloc(sizeof(CtlArgs));
+		arg->c = chan;
+		arg->r = r;
+		proccreate(ctlreadproc, arg, 1024);
+		return;
+	case Qdisplay:
+		readscreenimage(r, 1);
+		respond(r, nil);
+		return;
+	case Qrefresh:
+		readscreenimage(r, 0);
+		respond(r, nil);
+		return;
+	}
+	respond(r, "file not found");
+}
+
+static void
+ctlwrite(Req *r)
+{
+	int x, y;
+	
+	switch (r->fid->qid.path) {
+	case Qctl:
+		break;
+	default:
+		respond(r, "no write!");
+		return;
+	}
+	
+	switch (r->ifcall.data[0]) {
+	case 'r':
+		x = BGLONG(r->ifcall.data+1);
+		y = BGLONG(r->ifcall.data+1+4);
+		resizescreen(x, y);
+		respond(r, nil);
+		return;
+	}
+	
+	respond(r, "bad request");
+}
+
+static void
+ctlattach(Req *r)
+{
+	mkqid(&r->fid->qid, Qroot);
+	r->ofcall.qid = r->fid->qid;
+	respond(r, nil);
+}
+
+static char*
+ctlwalk(Fid *fid, char *name, Qid *qid)
+{
+	switch (fid->qid.path) {
+	case Qroot:
+		if (strcmp(name, "..") == 0) {
+			mkqid(&fid->qid, Qroot);
+			*qid = fid->qid;
+			return nil;
+		}
+		if (strcmp(name, "ctl") == 0) {
+			mkqid(&fid->qid, Qctl);
+			*qid = fid->qid;
+			return nil;
+		}
+		if (strcmp(name, "display") == 0) {
+			mkqid(&fid->qid, Qdisplay);
+			*qid = fid->qid;
+			return nil;
+		}
+		if (strcmp(name, "refresh") == 0) {
+			mkqid(&fid->qid, Qrefresh);
+			*qid = fid->qid;
+			return nil;
+		}
+	}
+	return "file not found";
+}
+
+static void
+ctlstat(Req *r)
+{
+	mkqdir(&r->d, r->fid->qid.path);
+	respond(r, nil);
+}
+
+static void
+ctlopen(Req *r)
+{
+	switch (r->fid->qid.path) {
+	case Qctl:
+		break;
+	default:
+		respond(r, nil);
+		return;
+	}
+	setlive(1);
+	respond(r, nil);
+}
+
+static void
+ctlclose(Fid *fid)
+{
+	switch (fid->qid.path) {
+	case Qroot:
+		break;
+	default:
+		return;
+	}
+	setlive(0);
+}
+
+static void
+ctlend(Srv*)
+{
+	setlive(0);
+}
+
+static void
+ctlflush(Req *r)
+{
+	respond(r->oldreq, "interrupted");
+}
+
+Srv ctlfs = {
+	.attach = ctlattach,
+	.walk1 = ctlwalk,
+	.stat = ctlstat,
+	.open = ctlopen,
+	.destroyfid = ctlclose,
+	.read = ctlread,
+	.write = ctlwrite,
+	.end = ctlend,
+	.flush = ctlflush,
+};
+
+void
+initcmd(char *srvname, Channel *c)
+{
+	char buf[256];
+	
+	chan = c;
+	
+	snprint(buf, sizeof(buf), "%s.cmd", srvname);
+	threadpostsrv(&ctlfs, buf);
+}
--- a/drawmgr/drawmgr.c
+++ b/drawmgr/drawmgr.c
@@ -21,33 +21,47 @@
 };
 
 int drawdispfd;
+int drawrefrfd;
 int drawctlfd;
 int mouseinfd;
 
 void
-refreshimage(void)
+dorefresh(int fd)
 {
-	Image *timg;
+	Image *t;
 	
-	fprint(2, "refreshimage\n");
-	
-	if (drawdispfd < 0)
-		drawdispfd = open("/mnt/drawcmd/display", OREAD);
-	if (drawdispfd < 0)
-		sysfatal("drawfs: display: %r");
-	seek(drawdispfd, 0, 0);
-	
-	timg = readimage(display, drawdispfd, 0);
-	if (!timg) {
+	seek(fd, 0, 0);
+	t = readimage(display, fd, 0);
+	if (!t) {
 		fprint(2, "readimage: %r\n");
 		return;
 	}
-	fprint(2, "img: %R\n", timg->r);
-	draw(screen, rectaddpt(timg->r, screen->r.min), timg, nil, ZP);
-	freeimage(timg);
+	fprint(2, "img: %R\n", t->r);
+	draw(screen, rectaddpt(t->r, screen->r.min), t, nil, ZP);
+	freeimage(t);
 }
 
 void
+refreshimage(int full)
+{
+	fprint(2, "refreshimage\n");
+	
+	if (full) {
+		if (drawdispfd < 0)
+			drawdispfd = open("/mnt/drawcmd/display", OREAD);
+		if (drawdispfd < 0)
+			sysfatal("drawfs: display: %r");
+		dorefresh(drawdispfd);
+	} else {
+		if (drawrefrfd < 0)
+			drawrefrfd = open("/mnt/drawcmd/refresh", OREAD);
+		if (drawrefrfd < 0)
+			sysfatal("drawfs: refresh: %r");
+		dorefresh(drawrefrfd);
+	}
+}
+
+void
 resized(int new)
 {
 	Point size;
@@ -73,7 +87,7 @@
 	
 	fprint(2, "resize %P\n", size);
 	
-	refreshimage();
+	refreshimage(1);
 }
 
 void
@@ -185,7 +199,7 @@
 {
 	switch (d->cmd) {
 	case Drefresh:
-		refreshimage();
+		refreshimage(0);
 		break;
 	}
 }
--