diff options
author | Julien Cristau <jcristau@debian.org> | 2008-08-21 01:32:03 +0200 |
---|---|---|
committer | Adam Jackson <ajax@redhat.com> | 2008-09-03 13:04:19 -0400 |
commit | 67ed1f23fe29affe14587fbb809d0e95197db78b (patch) | |
tree | 4e7ae429d43efe17ea0d785aab6fdc00b7ec0eca | |
parent | 62524d9d7648cfd9e2d7d6a3312ff20722d7f6a5 (diff) |
Add swapped dispatch for randr 1.2 requests
(cherry picked from commit 01264f17925005969c3b71ca945fc1014bcd8c8e)
-rw-r--r-- | randr/rrcrtc.c | 11 | ||||
-rw-r--r-- | randr/rrproperty.c | 58 | ||||
-rw-r--r-- | randr/rrsdispatch.c | 215 |
3 files changed, 215 insertions, 69 deletions
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c index 7c22437a9..ec65a040e 100644 --- a/randr/rrcrtc.c +++ b/randr/rrcrtc.c @@ -894,6 +894,7 @@ ProcRRGetCrtcGamma (ClientPtr client) RRCrtcPtr crtc; int n; unsigned long len; + char *extra; REQUEST_SIZE_MATCH(xRRGetCrtcGammaReq); crtc = LookupCrtc (client, stuff->crtc, DixReadAccess); @@ -902,6 +903,12 @@ ProcRRGetCrtcGamma (ClientPtr client) len = crtc->gammaSize * 3 * 2; + if (crtc->gammaSize) { + extra = xalloc(len); + if (!extra) + return BadAlloc; + } + reply.type = X_Reply; reply.sequenceNumber = client->sequence; reply.length = (len + 3) >> 2; @@ -914,8 +921,10 @@ ProcRRGetCrtcGamma (ClientPtr client) WriteToClient (client, sizeof (xRRGetCrtcGammaReply), (char *) &reply); if (crtc->gammaSize) { + memcpy(extra, crtc->gammaRed, len); client->pSwapReplyFunc = (ReplySwapPtr)CopySwap16Write; - WriteSwappedDataToClient (client, len, (char *) crtc->gammaRed); + WriteSwappedDataToClient (client, len, extra); + xfree(extra); } return client->noClientException; } diff --git a/randr/rrproperty.c b/randr/rrproperty.c index 4617064e4..429246c68 100644 --- a/randr/rrproperty.c +++ b/randr/rrproperty.c @@ -398,12 +398,13 @@ ProcRRListOutputProperties (ClientPtr client) int n; swaps (&rep.sequenceNumber, n); swapl (&rep.length, n); + swaps (&rep.nAtoms, n); } temppAtoms = pAtoms; for (prop = output->properties; prop; prop = prop->next) *temppAtoms++ = prop->propertyName; - WriteReplyToClient(client, sizeof(xRRListOutputPropertiesReply), &rep); + WriteToClient(client, sizeof(xRRListOutputPropertiesReply), (char*)&rep); if (numProps) { client->pSwapReplyFunc = (ReplySwapPtr)Swap32Write; @@ -420,6 +421,7 @@ ProcRRQueryOutputProperty (ClientPtr client) xRRQueryOutputPropertyReply rep; RROutputPtr output; RRPropertyPtr prop; + char *extra; REQUEST_SIZE_MATCH(xRRQueryOutputPropertyReq); @@ -432,6 +434,11 @@ ProcRRQueryOutputProperty (ClientPtr client) if (!prop) return BadName; + if (prop->num_valid) { + extra = xalloc(prop->num_valid * sizeof(INT32)); + if (!extra) + return BadAlloc; + } rep.type = X_Reply; rep.length = prop->num_valid; rep.sequenceNumber = client->sequence; @@ -444,12 +451,14 @@ ProcRRQueryOutputProperty (ClientPtr client) swaps (&rep.sequenceNumber, n); swapl (&rep.length, n); } - WriteReplyToClient (client, sizeof (xRRQueryOutputPropertyReply), &rep); + WriteToClient (client, sizeof (xRRQueryOutputPropertyReply), (char*)&rep); if (prop->num_valid) { + memcpy(extra, prop->valid_values, prop->num_valid * sizeof(INT32)); client->pSwapReplyFunc = (ReplySwapPtr)Swap32Write; WriteSwappedDataToClient(client, prop->num_valid * sizeof(INT32), - prop->valid_values); + extra); + xfree(extra); } return(client->noClientException); } @@ -564,6 +573,7 @@ ProcRRGetOutputProperty (ClientPtr client) unsigned long n, len, ind; RROutputPtr output; xRRGetOutputPropertyReply reply; + char *extra; REQUEST_SIZE_MATCH(xRRGetOutputPropertyReq); if (stuff->delete) @@ -603,7 +613,16 @@ ProcRRGetOutputProperty (ClientPtr client) reply.bytesAfter = 0; reply.propertyType = None; reply.format = 0; - WriteReplyToClient(client, sizeof(xRRGetOutputPropertyReply), &reply); + if (client->swapped) { + int n; + + swaps(&reply.sequenceNumber, n); + swapl(&reply.length, n); + swapl(&reply.propertyType, n); + swapl(&reply.bytesAfter, n); + swapl(&reply.nItems, n); + } + WriteToClient(client, sizeof(xRRGetOutputPropertyReply), &reply); return(client->noClientException); } @@ -627,7 +646,16 @@ ProcRRGetOutputProperty (ClientPtr client) reply.length = 0; reply.nItems = 0; reply.propertyType = prop_value->type; - WriteReplyToClient(client, sizeof(xRRGetOutputPropertyReply), &reply); + if (client->swapped) { + int n; + + swaps(&reply.sequenceNumber, n); + swapl(&reply.length, n); + swapl(&reply.propertyType, n); + swapl(&reply.bytesAfter, n); + swapl(&reply.nItems, n); + } + WriteToClient(client, sizeof(xRRGetOutputPropertyReply), &reply); return(client->noClientException); } @@ -648,6 +676,11 @@ ProcRRGetOutputProperty (ClientPtr client) len = min(n - ind, 4 * stuff->longLength); + if (len) { + extra = xalloc(len); + if (!extra) + return BadAlloc; + } reply.bytesAfter = n - (ind + len); reply.format = prop_value->format; reply.length = (len + 3) >> 2; @@ -670,16 +703,27 @@ ProcRRGetOutputProperty (ClientPtr client) RRDeliverEvent (output->pScreen, (xEvent *) &event, RROutputPropertyNotifyMask); } - WriteReplyToClient(client, sizeof(xGenericReply), &reply); + if (client->swapped) { + int n; + + swaps(&reply.sequenceNumber, n); + swapl(&reply.length, n); + swapl(&reply.propertyType, n); + swapl(&reply.bytesAfter, n); + swapl(&reply.nItems, n); + } + WriteToClient(client, sizeof(xGenericReply), &reply); if (len) { + memcpy(extra, (char *)prop_value->data + ind, len); switch (reply.format) { case 32: client->pSwapReplyFunc = (ReplySwapPtr)CopySwap32Write; break; case 16: client->pSwapReplyFunc = (ReplySwapPtr)CopySwap16Write; break; default: client->pSwapReplyFunc = (ReplySwapPtr)WriteToClient; break; } WriteSwappedDataToClient(client, len, - (char *)prop_value->data + ind); + extra); + xfree(extra); } if (stuff->delete && (reply.bytesAfter == 0)) diff --git a/randr/rrsdispatch.c b/randr/rrsdispatch.c index 4a6a6e43f..80d16b75a 100644 --- a/randr/rrsdispatch.c +++ b/randr/rrsdispatch.c @@ -84,191 +84,284 @@ SProcRRSelectInput (ClientPtr client) static int SProcRRGetScreenSizeRange (ClientPtr client) { + int n; REQUEST(xRRGetScreenSizeRangeReq); - + REQUEST_SIZE_MATCH(xRRGetScreenSizeRangeReq); - (void) stuff; - return BadImplementation; + swaps(&stuff->length, n); + swapl(&stuff->window, n); + return (*ProcRandrVector[stuff->randrReqType]) (client); } static int SProcRRSetScreenSize (ClientPtr client) { + int n; REQUEST(xRRSetScreenSizeReq); - + REQUEST_SIZE_MATCH(xRRSetScreenSizeReq); - (void) stuff; - return BadImplementation; + swaps(&stuff->length, n); + swapl(&stuff->window, n); + swaps(&stuff->width, n); + swaps(&stuff->height, n); + swapl(&stuff->widthInMillimeters, n); + swapl(&stuff->heightInMillimeters, n); + return (*ProcRandrVector[stuff->randrReqType]) (client); } static int SProcRRGetScreenResources (ClientPtr client) { + int n; REQUEST(xRRGetScreenResourcesReq); - + REQUEST_SIZE_MATCH(xRRGetScreenResourcesReq); - (void) stuff; - return BadImplementation; + swaps(&stuff->length, n); + swapl(&stuff->window, n); + return (*ProcRandrVector[stuff->randrReqType]) (client); } static int SProcRRGetOutputInfo (ClientPtr client) { + int n; REQUEST(xRRGetOutputInfoReq);; - + REQUEST_SIZE_MATCH(xRRGetOutputInfoReq); - (void) stuff; - return BadImplementation; + swaps(&stuff->length, n); + swapl(&stuff->output, n); + swapl(&stuff->configTimestamp, n); + return (*ProcRandrVector[stuff->randrReqType]) (client); } static int SProcRRListOutputProperties (ClientPtr client) { + int n; REQUEST(xRRListOutputPropertiesReq); - + REQUEST_SIZE_MATCH(xRRListOutputPropertiesReq); - (void) stuff; - return BadImplementation; + swaps(&stuff->length, n); + swapl(&stuff->output, n); + return (*ProcRandrVector[stuff->randrReqType]) (client); } static int SProcRRQueryOutputProperty (ClientPtr client) { + int n; REQUEST(xRRQueryOutputPropertyReq); - + REQUEST_SIZE_MATCH(xRRQueryOutputPropertyReq); - (void) stuff; - return BadImplementation; + swaps(&stuff->length, n); + swapl(&stuff->output, n); + swapl(&stuff->property, n); + return (*ProcRandrVector[stuff->randrReqType]) (client); } static int SProcRRConfigureOutputProperty (ClientPtr client) { + int n; REQUEST(xRRConfigureOutputPropertyReq); - - REQUEST_SIZE_MATCH(xRRConfigureOutputPropertyReq); - (void) stuff; - return BadImplementation; + + swaps(&stuff->length, n); + swapl(&stuff->output, n); + swapl(&stuff->property, n); + SwapRestL(stuff); + return (*ProcRandrVector[stuff->randrReqType]) (client); } static int SProcRRChangeOutputProperty (ClientPtr client) { + int n; REQUEST(xRRChangeOutputPropertyReq); - - REQUEST_SIZE_MATCH(xRRChangeOutputPropertyReq); - (void) stuff; - return BadImplementation; + + REQUEST_AT_LEAST_SIZE (xRRChangeOutputPropertyReq); + swaps(&stuff->length, n); + swapl(&stuff->output, n); + swapl(&stuff->property, n); + swapl(&stuff->type, n); + swapl(&stuff->nUnits, n); + switch(stuff->format) { + case 8: + break; + case 16: + SwapRestS(stuff); + break; + case 32: + SwapRestL(stuff); + break; + default: + client->errorValue = stuff->format; + return BadValue; + } + return (*ProcRandrVector[stuff->randrReqType]) (client); } static int SProcRRDeleteOutputProperty (ClientPtr client) { + int n; REQUEST(xRRDeleteOutputPropertyReq); REQUEST_SIZE_MATCH(xRRDeleteOutputPropertyReq); - (void) stuff; - return BadImplementation; + swaps(&stuff->length, n); + swapl(&stuff->output, n); + swapl(&stuff->property, n); + return (*ProcRandrVector[stuff->randrReqType]) (client); } static int SProcRRGetOutputProperty (ClientPtr client) { + int n; REQUEST(xRRGetOutputPropertyReq); - + REQUEST_SIZE_MATCH(xRRGetOutputPropertyReq); - (void) stuff; - return BadImplementation; + swaps(&stuff->length, n); + swapl(&stuff->output, n); + swapl(&stuff->property, n); + swapl(&stuff->type, n); + swapl(&stuff->longOffset, n); + swapl(&stuff->longLength, n); + return (*ProcRandrVector[stuff->randrReqType]) (client); } static int SProcRRCreateMode (ClientPtr client) { + int n; + xRRModeInfo *modeinfo; REQUEST(xRRCreateModeReq); - - REQUEST_SIZE_MATCH(xRRCreateModeReq); - (void) stuff; - return BadImplementation; + + REQUEST_AT_LEAST_SIZE(xRRCreateModeReq); + swaps(&stuff->length, n); + swapl(&stuff->window, n); + + modeinfo = &stuff->modeInfo; + swapl(&modeinfo->id, n); + swaps(&modeinfo->width, n); + swaps(&modeinfo->height, n); + swapl(&modeinfo->dotClock, n); + swaps(&modeinfo->hSyncStart, n); + swaps(&modeinfo->hSyncEnd, n); + swaps(&modeinfo->hTotal, n); + swaps(&modeinfo->vSyncStart, n); + swaps(&modeinfo->vSyncEnd, n); + swaps(&modeinfo->vTotal, n); + swaps(&modeinfo->nameLength, n); + swapl(&modeinfo->modeFlags, n); + return (*ProcRandrVector[stuff->randrReqType]) (client); } static int SProcRRDestroyMode (ClientPtr client) { + int n; REQUEST(xRRDestroyModeReq); - + REQUEST_SIZE_MATCH(xRRDestroyModeReq); - (void) stuff; - return BadImplementation; + swaps(&stuff->length, n); + swapl(&stuff->mode, n); + return (*ProcRandrVector[stuff->randrReqType]) (client); } static int SProcRRAddOutputMode (ClientPtr client) { + int n; REQUEST(xRRAddOutputModeReq); - + REQUEST_SIZE_MATCH(xRRAddOutputModeReq); - (void) stuff; - return BadImplementation; + swaps(&stuff->length, n); + swapl(&stuff->output, n); + swapl(&stuff->mode, n); + return (*ProcRandrVector[stuff->randrReqType]) (client); } static int SProcRRDeleteOutputMode (ClientPtr client) { + int n; REQUEST(xRRDeleteOutputModeReq); - + REQUEST_SIZE_MATCH(xRRDeleteOutputModeReq); - (void) stuff; - return BadImplementation; + swaps(&stuff->length, n); + swapl(&stuff->output, n); + swapl(&stuff->mode, n); + return (*ProcRandrVector[stuff->randrReqType]) (client); } static int SProcRRGetCrtcInfo (ClientPtr client) { + int n; REQUEST(xRRGetCrtcInfoReq); - + REQUEST_SIZE_MATCH(xRRGetCrtcInfoReq); - (void) stuff; - return BadImplementation; + swaps(&stuff->length, n); + swapl(&stuff->crtc, n); + swapl(&stuff->configTimestamp, n); + return (*ProcRandrVector[stuff->randrReqType]) (client); } static int SProcRRSetCrtcConfig (ClientPtr client) { + int n; REQUEST(xRRSetCrtcConfigReq); - - REQUEST_SIZE_MATCH(xRRSetCrtcConfigReq); - (void) stuff; - return BadImplementation; + + REQUEST_AT_LEAST_SIZE(xRRSetCrtcConfigReq); + swaps(&stuff->length, n); + swapl(&stuff->crtc, n); + swapl(&stuff->timestamp, n); + swapl(&stuff->configTimestamp, n); + swaps(&stuff->x, n); + swaps(&stuff->y, n); + swapl(&stuff->mode, n); + swaps(&stuff->rotation, n); + SwapRestL(stuff); + return (*ProcRandrVector[stuff->randrReqType]) (client); } static int SProcRRGetCrtcGammaSize (ClientPtr client) { + int n; REQUEST(xRRGetCrtcGammaSizeReq); - + REQUEST_SIZE_MATCH(xRRGetCrtcGammaSizeReq); - (void) stuff; - return BadImplementation; + swaps(&stuff->length, n); + swapl(&stuff->crtc, n); + return (*ProcRandrVector[stuff->randrReqType]) (client); } static int SProcRRGetCrtcGamma (ClientPtr client) { + int n; REQUEST(xRRGetCrtcGammaReq); - + REQUEST_SIZE_MATCH(xRRGetCrtcGammaReq); - (void) stuff; - return BadImplementation; + swaps(&stuff->length, n); + swapl(&stuff->crtc, n); + return (*ProcRandrVector[stuff->randrReqType]) (client); } static int SProcRRSetCrtcGamma (ClientPtr client) { + int n; REQUEST(xRRSetCrtcGammaReq); - - REQUEST_SIZE_MATCH(xRRSetCrtcGammaReq); - (void) stuff; - return BadImplementation; + + REQUEST_AT_LEAST_SIZE(xRRSetCrtcGammaReq); + swaps(&stuff->length, n); + swapl(&stuff->crtc, n); + swaps(&stuff->size, n); + SwapRestS(stuff); + return (*ProcRandrVector[stuff->randrReqType]) (client); } int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = { |