X-Git-Url: http://git.demorecorder.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fxcb_out.c;h=a3cb2e4ef58fb332a06973a974598ab3e64a5030;hb=1b83f8f8f326eca9d8852c82dd36696f81a720dc;hp=2487139bf8593882e12c9d24c071dd1bbf458560;hpb=5b1d39e27b1a966df537ead248da5a57e7d9de97;p=free-sw%2Fxcb%2Flibxcb diff --git a/src/xcb_out.c b/src/xcb_out.c index 2487139..a3cb2e4 100644 --- a/src/xcb_out.c +++ b/src/xcb_out.c @@ -27,6 +27,7 @@ #include #include +#include #include #include @@ -47,6 +48,40 @@ static int force_sequence_wrap(XCBConnection *c) return ret; } +static int _xcb_write(const int fd, char (*buf)[], int *count) +{ + int n = write(fd, *buf, *count); + if(n > 0) + { + *count -= n; + if(*count) + memmove(*buf, *buf + n, *count); + } + return n; +} + +static int _xcb_writev(const int fd, struct iovec *vec, int count) +{ + int n = writev(fd, vec, count); + if(n > 0) + { + int rem = n; + for(; count; --count, ++vec) + { + int cur = vec->iov_len; + if(cur > rem) + cur = rem; + vec->iov_len -= cur; + vec->iov_base = (char *) vec->iov_base + cur; + rem -= cur; + if(vec->iov_len) + break; + } + assert(rem == 0); + } + return n; +} + /* Public interface */ CARD32 XCBGetMaximumRequestLength(XCBConnection *c) @@ -199,8 +234,9 @@ int _xcb_out_write(XCBConnection *c) else n = _xcb_write(c->fd, &c->out.queue, &c->out.queue_len); - if(n < 0 && errno == EAGAIN) - n = 1; + /* XXX: should "nothing was written" be considered failure or + * success for this function? it's not an I/O error, but... */ + n = (n > 0) || (n < 0 && errno == EAGAIN); if(c->out.vec_len) {