import snprints from sources Reference: /n/atom/patch/applied/drawsnprint Date: Tue Jan 14 02:29:22 CET 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/nix/port/devdraw.c Tue Jan 14 02:29:07 2014 +++ /sys/src/nix/port/devdraw.c Tue Jan 14 02:29:09 2014 @@ -229,9 +229,10 @@ case Q3rd: cl = drawclientofpath(c->qid.path); if(cl == nil) - strcpy(up->genbuf, "??"); + strncpy(up->genbuf, "??", sizeof up->genbuf); else - sprint(up->genbuf, "%d", cl->clientid); + snprint(up->genbuf, sizeof up->genbuf, + "%d", cl->clientid); mkqid(&q, Q2nd, 0, QTDIR); devdir(c, q, up->genbuf, 0, eve, 0500, dp); break; @@ -279,7 +280,8 @@ cl = sdraw.client[s-1]; if(cl == 0) return 0; - sprint(up->genbuf, "%d", cl->clientid); + snprint(up->genbuf, sizeof up->genbuf, "%d", + cl->clientid); mkqid(&q, (s<genbuf, 0, eve, 0555, dp); return 1; @@ -1192,10 +1194,13 @@ error(Enodrawimage); i = di->image; } - n = sprint(a, "%11d %11d %11s %11d %11d %11d %11d %11d %11d %11d %11d %11d ", - cl->clientid, cl->infoid, chantostr(buf, i->chan), (i->flags&Frepl)==Frepl, + n = snprint(a, n, + "%11d %11d %11s %11d %11d %11d %11d %11d %11d %11d %11d %11d ", + cl->clientid, cl->infoid, chantostr(buf, i->chan), + (i->flags&Frepl)==Frepl, 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); + i->clipr.min.x, i->clipr.min.y, i->clipr.max.x, + i->clipr.max.y); cl->infoid = -1; break; @@ -1207,7 +1212,9 @@ m = 0; for(index = 0; index < 256; index++){ getcolor(index, &red, &green, &blue); - m += sprint((char*)p+m, "%11d %11ud %11ud %11ud\n", index, red>>24, green>>24, blue>>24); + m += snprint((char*)p+m, 4*12*256+1 - m, + "%11d %11ud %11ud %11ud\n", index, + red>>24, green>>24, blue>>24); } n = readstr(offset, a, n, (char*)p); free(p); @@ -2197,7 +2204,7 @@ { if(active){ drawblankscreen(0); - sdraw.blanktime = MACHP(0)->ticks; + sdraw.blanktime = sys->ticks; }else{ if(blanktime && sdraw.blanktime && TK2SEC(sys->ticks - sdraw.blanktime)/60 >= blanktime) drawblankscreen(1); --- /sys/src/9/port/devdraw.c Tue Jan 14 02:29:13 2014 +++ /sys/src/9/port/devdraw.c Tue Jan 14 02:29:15 2014 @@ -72,6 +72,7 @@ DImage* dimage[NHASH]; CScreen* cscreen; Refresh* refresh; + QLock refrendlk; Rendez refrend; uchar* readdata; int nreaddata; @@ -228,9 +229,10 @@ case Q3rd: cl = drawclientofpath(c->qid.path); if(cl == nil) - strcpy(up->genbuf, "??"); + strncpy(up->genbuf, "??", sizeof up->genbuf); else - sprint(up->genbuf, "%d", cl->clientid); + snprint(up->genbuf, sizeof up->genbuf, + "%d", cl->clientid); mkqid(&q, Q2nd, 0, QTDIR); devdir(c, q, up->genbuf, 0, eve, 0500, dp); break; @@ -261,9 +263,9 @@ } if(t == Qwinname){ - mkqid(&q, Qwinname, 0, QTFILE); - devdir(c, q, "winname", 0, eve, 0444, dp); - return 1; + mkqid(&q, Qwinname, 0, QTFILE); + devdir(c, q, "winname", 0, eve, 0444, dp); + return 1; } /* @@ -278,7 +280,8 @@ cl = sdraw.client[s-1]; if(cl == 0) return 0; - sprint(up->genbuf, "%d", cl->clientid); + snprint(up->genbuf, sizeof up->genbuf, "%d", + cl->clientid); mkqid(&q, (s<genbuf, 0, eve, 0555, dp); return 1; @@ -1192,10 +1195,13 @@ error(Enodrawimage); i = di->image; } - n = sprint(a, "%11d %11d %11s %11d %11d %11d %11d %11d %11d %11d %11d %11d ", - cl->clientid, cl->infoid, chantostr(buf, i->chan), (i->flags&Frepl)==Frepl, + n = snprint(a, n, + "%11d %11d %11s %11d %11d %11d %11d %11d %11d %11d %11d %11d ", + cl->clientid, cl->infoid, chantostr(buf, i->chan), + (i->flags&Frepl)==Frepl, 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); + i->clipr.min.x, i->clipr.min.y, i->clipr.max.x, + i->clipr.max.y); cl->infoid = -1; break; @@ -1207,7 +1213,9 @@ m = 0; for(index = 0; index < 256; index++){ getcolor(index, &red, &green, &blue); - m += sprint((char*)p+m, "%11d %11lud %11lud %11lud\n", index, red>>24, green>>24, blue>>24); + m += snprint((char*)p+m, 4*12*256+1 - m, + "%11d %11lud %11lud %11lud\n", index, + red>>24, green>>24, blue>>24); } n = readstr(offset, a, n, (char*)p); free(p); @@ -1231,12 +1239,15 @@ if(cl->refreshme || cl->refresh) break; dunlock(); + qlock(&cl->refrendlk); if(waserror()){ + qunlock(&cl->refrendlk); dlock(); /* restore lock for waserror() above */ nexterror(); } sleep(&cl->refrend, drawrefactive, cl); poperror(); + qunlock(&cl->refrendlk); dlock(); } p = a; @@ -1375,7 +1386,7 @@ printmesg(char *fmt, uchar *a, int plsprnt) { char buf[256]; - char *p, *q; + char *p, *q, *e; int s; if(1|| plsprnt==0){ @@ -1384,41 +1395,40 @@ return; } q = buf; + e = buf + sizeof buf; *q++ = *a++; for(p=fmt; *p; p++){ switch(*p){ case 'l': - q += sprint(q, " %ld", (long)BGLONG(a)); + q = seprint(q, e, " %ld", (long)BGLONG(a)); a += 4; break; case 'L': - q += sprint(q, " %.8lux", (ulong)BGLONG(a)); + q = seprint(q, e, " %.8lux", (ulong)BGLONG(a)); a += 4; break; case 'R': - q += sprint(q, " [%d %d %d %d]", BGLONG(a), BGLONG(a+4), BGLONG(a+8), BGLONG(a+12)); + q = seprint(q, e, " [%d %d %d %d]", BGLONG(a), BGLONG(a+4), BGLONG(a+8), BGLONG(a+12)); a += 16; break; case 'P': - q += sprint(q, " [%d %d]", BGLONG(a), BGLONG(a+4)); + q = seprint(q, e, " [%d %d]", BGLONG(a), BGLONG(a+4)); a += 8; break; case 'b': - q += sprint(q, " %d", *a++); + q = seprint(q, e, " %d", *a++); break; case 's': - q += sprint(q, " %d", BGSHORT(a)); + q = seprint(q, e, " %d", BGSHORT(a)); a += 2; break; case 'S': - q += sprint(q, " %.4ux", BGSHORT(a)); + q = seprint(q, e, " %.4ux", BGSHORT(a)); a += 2; break; } } - *q++ = '\n'; - *q = 0; - iprint("%.*s", (int)(q-buf), buf); + iprint("%s\n", buf); } void