#include #include #include "lx.h" #include "proto.h" #include "internal.h" typedef struct priv_QueryExtension PRIV_QueryExtension; struct priv_QueryExtension { unsigned char *req; int *presentp; int *majorp; int *eventp; int *errorp; } ; static void done_QueryExtension(LX_OP *op, const unsigned char *rep, void *pv) { PRIV_QueryExtension *p; p = pv; do <"ret"> { if (r_card32(rep+4) != 0) { lx__protoerr(op->conn,"QueryExtension response length wrong (%u, expecting 0)",r_card32(rep+4)); break <"ret">; } switch (rep[8]) { case 0: case 1: break; default: lx__protoerr(op->conn,"QueryExtension reply has bad present value %d",rep[8]); break <"ret">; } if (p->presentp) *p->presentp = rep[8]; if (p->majorp) *p->majorp = rep[9]; if (p->eventp) *p->eventp = rep[10]; if (p->errorp) *p->errorp = rep[11]; // XXX record details for future use! } while (0); free(p->req); free(p); } LX_OP *lx_QueryExtension(LX_CONN *xc, const char *name, int namelen, int *presentp, int *majorp, int *eventp, int *errorp) { unsigned char *req; PRIV_QueryExtension *p; int reqlen; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_QueryExtension"); return(0); } lx__nochain(xc); if (namelen == -1) namelen = strlen(name); if ((namelen < 0) || (namelen > 65535)) { lx__bad_call(xc,"lx_QueryExtension"); return(0); } reqlen = 2 + ((namelen + 3) >> 2); req = malloc(reqlen*4); if (! req) { lx__nomem_fail(xc); return(0); } p = malloc(sizeof(PRIV_QueryExtension)); if (! p) { free(req); lx__nomem_fail(xc); return(0); } p->req = req; p->presentp = presentp; p->majorp = majorp; p->eventp = eventp; p->errorp = errorp; req[0] = XP_REQ_QueryExtension; req[1] = 0; w_card16(req+2,reqlen); w_card16(req+4,namelen); bcopy(name,req+8,namelen); return(lx__expect_reply(xc,req,reqlen<<2,&done_QueryExtension,p)); }