From e543c475e7ac135ce1497d7a0d339eacf8f6cfe1 Mon Sep 17 00:00:00 2001 From: rsc Date: Mon, 19 Apr 2004 05:56:17 +0000 Subject: fix drawread, add changes from david tolpin --- src/libdraw/devdraw.c | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) (limited to 'src/libdraw/devdraw.c') diff --git a/src/libdraw/devdraw.c b/src/libdraw/devdraw.c index 76b79684..4f35cd19 100644 --- a/src/libdraw/devdraw.c +++ b/src/libdraw/devdraw.c @@ -744,31 +744,28 @@ drawcoord(uchar *p, uchar *maxp, int oldx, int *newx) int _drawmsgread(Display *d, void *a, int n) { - int inbuf; + Client *cl; qlock(&sdraw.lk); - inbuf = d->obufp - d->obuf; - if(n > inbuf) - n = inbuf; - memmove(a, d->obuf, n); - inbuf -= n; - if(inbuf) - memmove(d->obuf, d->obufp-inbuf, inbuf); - d->obufp = d->obuf+inbuf; + cl = client0; + if(cl->readdata == nil){ + werrstr("no draw data"); + goto err; + } + if(n < cl->nreaddata){ + werrstr("short read"); + goto err; + } + n = cl->nreaddata; + memmove(a, cl->readdata, cl->nreaddata); + free(cl->readdata); + cl->readdata = nil; qunlock(&sdraw.lk); return n; -} - -static void -drawmsgsquirrel(Display *d, void *a, int n) -{ - uchar *ep; - ep = d->obuf + d->obufsize; - if(d->obufp + n > ep) - abort(); - memmove(d->obufp, a, n); - d->obufp += n; +err: + qunlock(&sdraw.lk); + return -1; } int @@ -1086,7 +1083,12 @@ _drawmsgwrite(Display *d, void *v, int n) i->r.min.x, i->r.min.y, i->r.max.x, i->r.max.y, i->clipr.min.x, i->clipr.min.y, i->clipr.max.x, i->clipr.max.y); - drawmsgsquirrel(d, ibuf, ni); + free(client->readdata); + client->readdata = malloc(ni); + if(client->readdata == nil) + goto Enomem; + memmove(client->readdata, ibuf, ni); + client->nreaddata = ni; client->infoid = -1; continue; -- cgit v1.2.3