diff options
author | marha <marha@users.sourceforge.net> | 2013-11-08 13:12:15 +0100 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2013-11-08 13:12:15 +0100 |
commit | f707ea3ce065f0ce40f586c40283fab42059b485 (patch) | |
tree | 055a5ccdecaec105365d1de9a90d7d6b38f257fb /libxcb/src/xcb_conn.c | |
parent | c8483dc2831dc37d93a36804022f6b064f5962ea (diff) | |
parent | 09e94a8e392e8fe6fd89ddefbf3897a92e525b5b (diff) | |
download | vcxsrv-f707ea3ce065f0ce40f586c40283fab42059b485.tar.gz vcxsrv-f707ea3ce065f0ce40f586c40283fab42059b485.tar.bz2 vcxsrv-f707ea3ce065f0ce40f586c40283fab42059b485.zip |
Merge remote-tracking branch 'origin/released'
* origin/released:
Added presentproto-1.0
libxtrans libxcb xcb-proto mesa git update 8 nov 2013
Conflicts:
X11/xtrans/Xtransint.h
X11/xtrans/Xtranssock.c
libxcb/src/.gitignore
mesalib/src/mesa/drivers/dri/common/dri_util.c
Diffstat (limited to 'libxcb/src/xcb_conn.c')
-rw-r--r-- | libxcb/src/xcb_conn.c | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/libxcb/src/xcb_conn.c b/libxcb/src/xcb_conn.c index 403942b79..3655725e2 100644 --- a/libxcb/src/xcb_conn.c +++ b/libxcb/src/xcb_conn.c @@ -235,9 +235,39 @@ 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) { + char cmsgbuf[CMSG_SPACE(sizeof(int) * XCB_MAX_PASS_FD)]; + struct msghdr msg = { + .msg_name = NULL, + .msg_namelen = 0, + .msg_iov = *vector, + .msg_iovlen = n, + .msg_control = cmsgbuf, + .msg_controllen = CMSG_LEN(c->out.out_fd.nfd * sizeof (int)), + }; + int i; + struct cmsghdr *hdr = CMSG_FIRSTHDR(&msg); + + hdr->cmsg_len = msg.msg_controllen; + hdr->cmsg_level = SOL_SOCKET; + hdr->cmsg_type = SCM_RIGHTS; + memcpy(CMSG_DATA(hdr), c->out.out_fd.fd, c->out.out_fd.nfd * sizeof (int)); + + 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) |