diff options
Diffstat (limited to 'src/libdraw/drawclient.c')
-rw-r--r-- | src/libdraw/drawclient.c | 61 |
1 files changed, 46 insertions, 15 deletions
diff --git a/src/libdraw/drawclient.c b/src/libdraw/drawclient.c index ae8719a9..8fe1b79f 100644 --- a/src/libdraw/drawclient.c +++ b/src/libdraw/drawclient.c @@ -1,6 +1,7 @@ /* Copyright (c) 2006 Russ Cox */ #include <u.h> +#include <sys/select.h> #include <libc.h> #include <draw.h> #include <mouse.h> @@ -12,8 +13,10 @@ int chattydrawclient; static int drawgettag(Mux *mux, void *vmsg); static void* drawrecv(Mux *mux); +static void* drawnbrecv(Mux *mux); static int drawsend(Mux *mux, void *vmsg); static int drawsettag(Mux *mux, void *vmsg, uint tag); +static int canreadfd(int); int _displayconnect(Display *d) @@ -35,8 +38,8 @@ _displayconnect(Display *d) dup(p[1], 0); dup(p[1], 1); /* execl("strace", "strace", "-o", "drawsrv.out", "drawsrv", nil); */ - execl("drawsrv", "drawsrv", nil); - sysfatal("exec drawsrv: %r"); + execl("devdraw", "devdraw", nil); + sysfatal("exec devdraw: %r"); } close(p[1]); d->srvfd = p[0]; @@ -53,6 +56,7 @@ _displaymux(Display *d) d->mux->maxtag = 255; d->mux->send = drawsend; d->mux->recv = drawrecv; + d->mux->nbrecv = drawnbrecv; d->mux->gettag = drawgettag; d->mux->settag = drawsettag; d->mux->aux = d; @@ -61,9 +65,6 @@ _displaymux(Display *d) return 0; } -#define GET(p, x) \ - ((x) = (((p)[0] << 24) | ((p)[1] << 16) | ((p)[2] << 8) | ((p)[3]))) - static int drawsend(Mux *mux, void *vmsg) { @@ -78,17 +79,17 @@ drawsend(Mux *mux, void *vmsg) } static void* -drawrecv(Mux *mux) +_drawrecv(Mux *mux, int nb) { int n; uchar buf[4], *p; Display *d; - + d = mux->aux; - if((n=readn(d->srvfd, buf, 4)) != 4){ -fprint(2, "readn 4 got %d: %r\n", n); + if(nb && !canreadfd(d->srvfd)) + return nil; + if((n=readn(d->srvfd, buf, 4)) != 4) return nil; - } GET(buf, n); p = malloc(n); if(p == nil){ @@ -96,13 +97,23 @@ fprint(2, "readn 4 got %d: %r\n", n); return nil; } memmove(p, buf, 4); - if(readn(d->srvfd, p+4, n-4) != n-4){ -fprint(2, "short readn\n"); + if(readn(d->srvfd, p+4, n-4) != n-4) return nil; - } return p; } +static void* +drawrecv(Mux *mux) +{ + return _drawrecv(mux, 0); +} + +static void* +drawnbrecv(Mux *mux) +{ + return _drawrecv(mux, 1); +} + static int drawgettag(Mux *mux, void *vmsg) { @@ -186,8 +197,8 @@ _displayinit(Display *d, char *label, char *winsize) Wsysmsg tx, rx; tx.type = Tinit; - tx.label = ""; - tx.winsize = ""; + tx.label = label; + tx.winsize = winsize; return displayrpc(d, &tx, &rx, nil); } @@ -334,3 +345,23 @@ _displayresize(Display *d, Rectangle r) return displayrpc(d, &tx, &rx, nil); } +static int +canreadfd(int fd) +{ + fd_set rs, ws, xs; + struct timeval tv; + + FD_ZERO(&rs); + FD_ZERO(&ws); + FD_ZERO(&xs); + FD_SET(fd, &rs); + FD_SET(fd, &xs); + tv.tv_sec = 0; + tv.tv_usec = 0; + if(select(fd+1, &rs, &ws, &xs, &tv) < 0) + return 0; + if(FD_ISSET(fd, &rs) || FD_ISSET(fd, &xs)) + return 1; + return 0; +} + |