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;
}
}
--
⑨