- padded[0].iov_base = vector[0].iov_base;
- padded[0].iov_len = sizeof(CARD32);
- vector[0].iov_base = ((char *) vector[0].iov_base) + sizeof(CARD32);
- vector[0].iov_len -= sizeof(CARD32);
- ++longlen;
- padded[1].iov_base = &longlen;
- padded[1].iov_len = sizeof(CARD32);
- padlen = 2;
+ CARD16 shortlen = 0;
+ CARD32 longlen = 0;
+ /* set the major opcode, and the minor opcode for extensions */
+ if(req->ext)
+ {
+ const XCBQueryExtensionRep *extension = XCBGetExtensionData(c, req->ext);
+ /* TODO: better error handling here, please! */
+ assert(extension && extension->present);
+ ((CARD8 *) vector[0].iov_base)[0] = extension->major_opcode;
+ ((CARD8 *) vector[0].iov_base)[1] = req->opcode;
+ }
+ else
+ ((CARD8 *) vector[0].iov_base)[0] = req->opcode;
+
+ /* put together the length field, possibly using BIGREQUESTS */
+ for(i = 0; i < req->count; ++i)
+ longlen += (vector[i].iov_len + 3) >> 2;
+
+ if(longlen <= c->setup->maximum_request_length)
+ {
+ /* we don't need BIGREQUESTS. */
+ shortlen = longlen;
+ longlen = 0;
+ }
+ else if(longlen > XCBGetMaximumRequestLength(c))
+ return 0; /* server can't take this; maybe need BIGREQUESTS? */
+
+ /* set the length field. */
+ ((CARD16 *) vector[0].iov_base)[1] = shortlen;
+ if(!shortlen)
+ {
+ padded[0].iov_base = prefix;
+ padded[0].iov_len = sizeof(prefix);
+ prefix[0] = ((CARD32 *) vector[0].iov_base)[0];
+ prefix[1] = ++longlen;
+ vector[0].iov_base = ((char *) vector[0].iov_base) + sizeof(CARD32);
+ vector[0].iov_len -= sizeof(CARD32);
+ padlen = 1;
+ }