static int ProcGEQueryVersion(ClientPtr client) { int n; GEClientInfoPtr pGEClient = GEGetClient(client); xGEQueryVersionReply rep; REQUEST(xGEQueryVersionReq); REQUEST_SIZE_MATCH(xGEQueryVersionReq); rep.repType = X_Reply; rep.RepType = X_GEQueryVersion; rep.length = 0; rep.sequenceNumber = client->sequence; /* return the supported version by the server */ rep.majorVersion = SERVER_GE_MAJOR_VERSION; rep.minorVersion = SERVER_GE_MINOR_VERSION; /* Remember version the client requested */ pGEClient->major_version = stuff->majorVersion; pGEClient->minor_version = stuff->minorVersion; if (client->swapped) { swaps(&rep.sequenceNumber, n); swapl(&rep.length, n); swaps(&rep.majorVersion, n); swaps(&rep.minorVersion, n); } WriteToClient(client, sizeof(xGEQueryVersionReply), (char*)&rep); return Success; }
/** * Called when a new client inits a connection to the X server. * * We alloc a simple struct to store the client's major/minor version. Can be * used in the furture for versioning support. */ static void GEClientCallback(CallbackListPtr *list, void *closure, void *data) { NewClientInfoRec *clientinfo = (NewClientInfoRec *) data; ClientPtr pClient = clientinfo->client; GEClientInfoPtr pGEClient = GEGetClient(pClient); pGEClient->major_version = 0; pGEClient->minor_version = 0; }
static int ProcGEQueryVersion(ClientPtr client) { GEClientInfoPtr pGEClient = GEGetClient(client); xGEQueryVersionReply rep; REQUEST(xGEQueryVersionReq); REQUEST_SIZE_MATCH(xGEQueryVersionReq); rep = (xGEQueryVersionReply) { .repType = X_Reply, .RepType = X_GEQueryVersion, .sequenceNumber = client->sequence, .length = 0, /* return the supported version by the server */ .majorVersion = SERVER_GE_MAJOR_VERSION, .minorVersion = SERVER_GE_MINOR_VERSION }; /* Remember version the client requested */ pGEClient->major_version = stuff->majorVersion; pGEClient->minor_version = stuff->minorVersion; if (client->swapped) { swaps(&rep.sequenceNumber); swapl(&rep.length); swaps(&rep.majorVersion); swaps(&rep.minorVersion); } WriteToClient(client, sizeof(xGEQueryVersionReply), &rep); return Success; } int (*ProcGEVector[GENumberRequests]) (ClientPtr) = { /* Version 1.0 */ ProcGEQueryVersion}; /************************************************************/ /* swapped request handlers */ /************************************************************/ static int SProcGEQueryVersion(ClientPtr client) { REQUEST(xGEQueryVersionReq); swaps(&stuff->length); REQUEST_SIZE_MATCH(xGEQueryVersionReq); swaps(&stuff->majorVersion); swaps(&stuff->minorVersion); return (*ProcGEVector[stuff->ReqType]) (client); }
/* dispatch requests */ static int ProcGEDispatch(ClientPtr client) { GEClientInfoPtr pGEClient = GEGetClient(client); REQUEST(xGEReq); if (pGEClient->major_version >= NUM_VERSION_REQUESTS) return BadRequest; if (stuff->ReqType > version_requests[pGEClient->major_version]) return BadRequest; return (ProcGEVector[stuff->ReqType])(client); }