commit dbf57689c45611b8da9e269c24e409ee33a877d5 from: Russ Cox date: Mon Jan 13 21:46:14 2020 UTC libdraw: connect to devdraw via $wsysid when set commit - 41547af3f614061dd2c94bb52ae118f146925743 commit + dbf57689c45611b8da9e269c24e409ee33a877d5 blob - acab98c5e2aca940fabb72cf5c1d8621ee913a0f blob + 8b9656d55db5b68c589522f75517bea2fdf1463c --- include/drawfcall.h +++ include/drawfcall.h @@ -25,6 +25,9 @@ tag[1] Rrdkbd rune[2] tag[1] Tlabel label[s] tag[1] Rlabel +tag[1] Tctxt wsysid[s] +tag[1] Rctxt + tag[1] Tinit winsize[s] label[s] font[s] tag[1] Rinit @@ -94,6 +97,8 @@ enum { Rresize, Tcursor2 = 28, Rcursor2, + Tctxt = 30, + Rctxt, Tmax, }; @@ -116,6 +121,7 @@ struct Wsysmsg char *label; char *snarf; char *error; + char *id; uchar *data; uint count; Rectangle rect; blob - ef0356b8b0d2c38ef83d7b4372f689dd8b68f5fc blob + 9376f9c00958cf19f755850320077dfe11a96a09 --- src/libdraw/drawclient.c +++ src/libdraw/drawclient.c @@ -22,10 +22,68 @@ static int canreadfd(int); int _displayconnect(Display *d) { - int pid, p[2]; + int pid, p[2], fd, nbuf, n; + char *wsysid, *addr, *id; + uchar *buf; + Wsysmsg w; fmtinstall('W', drawfcallfmt); fmtinstall('H', encodefmt); + + wsysid = getenv("wsysid"); + if(wsysid != nil) { + // Connect to running devdraw service. + // wsysid=devdrawname/id + id = strchr(wsysid, '/'); + if(id == nil) { + werrstr("invalid $wsysid"); + return -1; + } + *id++ = '\0'; + addr = smprint("unix!%s/%s", getns(), wsysid); + if(addr == nil) + return -1; + fd = dial(addr, 0, 0, 0); + free(addr); + if(fd < 0) + return -1; + nbuf = strlen(id) + 500; + buf = malloc(nbuf); + if(buf == nil) { + close(fd); + return -1; + } + memset(&w, 0, sizeof w); + w.type = Tctxt; + w.id = id; + n = convW2M(&w, buf, nbuf); + if(write(fd, buf, n) != n) { + close(fd); + werrstr("wsys short write: %r"); + return -1; + } + n = readwsysmsg(fd, buf, nbuf); + if(n < 0) { + close(fd); + werrstr("wsys short read: %r"); + return -1; + } + if(convM2W(buf, n, &w) <= 0) { + close(fd); + werrstr("wsys decode error"); + return -1; + } + if(w.type != Rctxt) { + close(fd); + if(w.type == Rerror) + werrstr("%s", w.error); + else + werrstr("wsys rpc phase error (%d)", w.type); + return -1; + } + d->srvfd = fd; + return 0; + } if(pipe(p) < 0) return -1; @@ -36,6 +94,10 @@ _displayconnect(Display *d) } if(pid == 0){ char *devdraw; + + devdraw = getenv("DEVDRAW"); + if(devdraw == nil) + devdraw = "devdraw"; close(p[0]); dup(p[1], 0); dup(p[1], 1); blob - c74b3fafb6d22d56d621fee72a74ade97db7ce87 blob + eea140956f54bba15c9d5a34954527879b72752a --- src/libdraw/drawfcall.c +++ src/libdraw/drawfcall.c @@ -51,6 +51,7 @@ sizeW2M(Wsysmsg *m) case Rcursor2: case Trdkbd: case Rlabel: + case Rctxt: case Rinit: case Trdsnarf: case Rwrsnarf: @@ -74,6 +75,9 @@ sizeW2M(Wsysmsg *m) return 4+1+1+2; case Tlabel: return 4+1+1+_stringsize(m->label); + case Tctxt: + return 4+1+1 + +_stringsize(m->id); case Tinit: return 4+1+1 +_stringsize(m->winsize) @@ -114,6 +118,7 @@ convW2M(Wsysmsg *m, uchar *p, uint n) case Rcursor2: case Trdkbd: case Rlabel: + case Rctxt: case Rinit: case Trdsnarf: case Rwrsnarf: @@ -163,6 +168,9 @@ convW2M(Wsysmsg *m, uchar *p, uint n) break; case Tlabel: PUTSTRING(p+6, m->label); + break; + case Tctxt: + PUTSTRING(p+6, m->id); break; case Tinit: p += 6; @@ -214,6 +222,7 @@ convM2W(uchar *p, uint n, Wsysmsg *m) case Rcursor2: case Trdkbd: case Rlabel: + case Rctxt: case Rinit: case Trdsnarf: case Rwrsnarf: @@ -264,6 +273,9 @@ convM2W(uchar *p, uint n, Wsysmsg *m) case Tlabel: GETSTRING(p+6, &m->label); break; + case Tctxt: + GETSTRING(p+6, &m->id); + break; case Tinit: p += 6; p += GETSTRING(p, &m->winsize); @@ -352,6 +364,10 @@ drawfcallfmt(Fmt *fmt) return fmtprint(fmt, "Tlabel label='%s'", m->label); case Rlabel: return fmtprint(fmt, "Rlabel"); + case Tctxt: + return fmtprint(fmt, "Tctxt id='%s'", m->id); + case Rctxt: + return fmtprint(fmt, "Rctxt"); case Tinit: return fmtprint(fmt, "Tinit label='%s' winsize='%s'", m->label, m->winsize); case Rinit: