static inline void send_request(xcb_connection_t *c, int isvoid, enum workarounds workaround, int flags, struct iovec *vector, int count) { if(c->has_error) return; ++c->out.request; if(!isvoid) c->in.request_expected = c->out.request; if(workaround != WORKAROUND_NONE || flags != 0) _xcb_in_expect_reply(c, c->out.request, workaround, flags); while(count && c->out.queue_len + vector[0].iov_len <= sizeof(c->out.queue)) { memcpy(c->out.queue + c->out.queue_len, vector[0].iov_base, vector[0].iov_len); c->out.queue_len += vector[0].iov_len; vector[0].iov_base = (char *) vector[0].iov_base + vector[0].iov_len; vector[0].iov_len = 0; ++vector, --count; } if(!count) return; --vector, ++count; vector[0].iov_base = c->out.queue; vector[0].iov_len = c->out.queue_len; c->out.queue_len = 0; _xcb_out_send(c, vector, count); }
int xcb_writev(xcb_connection_t *c, struct iovec *vector, int count, uint64_t requests) { int ret; if(c->has_error) return 0; pthread_mutex_lock(&c->iolock); c->out.request += requests; ret = _xcb_out_send(c, vector, count); pthread_mutex_unlock(&c->iolock); return ret; }
static int write_setup(xcb_connection_t *c, xcb_auth_info_t *auth_info) { static const char pad[3]; xcb_setup_request_t out; struct iovec parts[6]; int count = 0; static const uint32_t endian = 0x01020304; int ret; memset(&out, 0, sizeof(out)); /* B = 0x42 = MSB first, l = 0x6c = LSB first */ if(htonl(endian) == endian) out.byte_order = 0x42; else out.byte_order = 0x6c; out.protocol_major_version = X_PROTOCOL; out.protocol_minor_version = X_PROTOCOL_REVISION; out.authorization_protocol_name_len = 0; out.authorization_protocol_data_len = 0; parts[count].iov_len = sizeof(xcb_setup_request_t); parts[count++].iov_base = &out; parts[count].iov_len = XCB_PAD(sizeof(xcb_setup_request_t)); parts[count++].iov_base = (char *) pad; if(auth_info) { parts[count].iov_len = out.authorization_protocol_name_len = auth_info->namelen; parts[count++].iov_base = auth_info->name; parts[count].iov_len = XCB_PAD(out.authorization_protocol_name_len); parts[count++].iov_base = (char *) pad; parts[count].iov_len = out.authorization_protocol_data_len = auth_info->datalen; parts[count++].iov_base = auth_info->data; parts[count].iov_len = XCB_PAD(out.authorization_protocol_data_len); parts[count++].iov_base = (char *) pad; } assert(count <= (int) (sizeof(parts) / sizeof(*parts))); pthread_mutex_lock(&c->iolock); ret = _xcb_out_send(c, parts, count); pthread_mutex_unlock(&c->iolock); return ret; }