X-Git-Url: http://git.demorecorder.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fxcb_conn.c;h=c06c7cbfa59a6088aa788c183f196d07decc50fa;hb=cca607409068ad0948e7283fb8d0465cabc51686;hp=6a7a8060a2d53885542b0bddb3e327adcb2ed90a;hpb=23911a707b8845bff52cd7853fc5d59fb0823cef;p=free-sw%2Fxcb%2Flibxcb diff --git a/src/xcb_conn.c b/src/xcb_conn.c index 6a7a806..c06c7cb 100644 --- a/src/xcb_conn.c +++ b/src/xcb_conn.c @@ -214,9 +214,34 @@ static int write_vec(xcb_connection_t *c, struct iovec **vector, int *count) if (n > IOV_MAX) n = IOV_MAX; - n = writev(c->fd, *vector, n); - if(n < 0 && errno == EAGAIN) - return 1; +#if HAVE_SENDMSG + if (c->out.out_fd.nfd) { + struct msghdr msg = { + .msg_name = NULL, + .msg_namelen = 0, + .msg_iov = *vector, + .msg_iovlen = n, + .msg_control = &c->out.out_fd, + .msg_controllen = sizeof (struct cmsghdr) + c->out.out_fd.nfd * sizeof (int), + }; + int i; + c->out.out_fd.cmsghdr.cmsg_len = msg.msg_controllen; + c->out.out_fd.cmsghdr.cmsg_level = SOL_SOCKET; + c->out.out_fd.cmsghdr.cmsg_type = SCM_RIGHTS; + n = sendmsg(c->fd, &msg, 0); + if(n < 0 && errno == EAGAIN) + return 1; + for (i = 0; i < c->out.out_fd.nfd; i++) + close(c->out.out_fd.fd[i]); + c->out.out_fd.nfd = 0; + } else +#endif + { + n = writev(c->fd, *vector, n); + if(n < 0 && errno == EAGAIN) + return 1; + } + #endif /* _WIN32 */ if(n <= 0) @@ -443,14 +468,14 @@ int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vec */ int may_read = c->in.reading == 1 || !count; #if USE_POLL - if(may_read && (fd.revents & POLLIN) == POLLIN) + if(may_read && (fd.revents & POLLIN) != 0) #else if(may_read && FD_ISSET(c->fd, &rfds)) #endif ret = ret && _xcb_in_read(c); #if USE_POLL - if((fd.revents & POLLOUT) == POLLOUT) + if((fd.revents & POLLOUT) != 0) #else if(FD_ISSET(c->fd, &wfds)) #endif