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