X-Git-Url: http://git.demorecorder.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fxcb_out.c;h=a3cb2e4ef58fb332a06973a974598ab3e64a5030;hb=55c1842686d2e668708cd106b5e08847df0184c3;hp=62d7053338742e54f59433cbaa0d2690e917df38;hpb=6149c7a6b57a193bc132fbc35b1772b75e5c7ca7;p=free-sw%2Fxcb%2Flibxcb diff --git a/src/xcb_out.c b/src/xcb_out.c index 62d7053..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)