xref: /OK3568_Linux_fs/external/xserver/Xext/xcmisc.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun 
3*4882a593Smuzhiyun Copyright 1993, 1998  The Open Group
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun Permission to use, copy, modify, distribute, and sell this software and its
6*4882a593Smuzhiyun documentation for any purpose is hereby granted without fee, provided that
7*4882a593Smuzhiyun the above copyright notice appear in all copies and that both that
8*4882a593Smuzhiyun copyright notice and this permission notice appear in supporting
9*4882a593Smuzhiyun documentation.
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun The above copyright notice and this permission notice shall be included
12*4882a593Smuzhiyun in all copies or substantial portions of the Software.
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15*4882a593Smuzhiyun OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16*4882a593Smuzhiyun MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17*4882a593Smuzhiyun IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*4882a593Smuzhiyun OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*4882a593Smuzhiyun ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*4882a593Smuzhiyun OTHER DEALINGS IN THE SOFTWARE.
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun Except as contained in this notice, the name of The Open Group shall
23*4882a593Smuzhiyun not be used in advertising or otherwise to promote the sale, use or
24*4882a593Smuzhiyun other dealings in this Software without prior written authorization
25*4882a593Smuzhiyun from The Open Group.
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun */
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #ifdef HAVE_DIX_CONFIG_H
30*4882a593Smuzhiyun #include <dix-config.h>
31*4882a593Smuzhiyun #endif
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #include <X11/X.h>
34*4882a593Smuzhiyun #include <X11/Xproto.h>
35*4882a593Smuzhiyun #include "misc.h"
36*4882a593Smuzhiyun #include "os.h"
37*4882a593Smuzhiyun #include "dixstruct.h"
38*4882a593Smuzhiyun #include "extnsionst.h"
39*4882a593Smuzhiyun #include "swaprep.h"
40*4882a593Smuzhiyun #include <X11/extensions/xcmiscproto.h>
41*4882a593Smuzhiyun #include "extinit.h"
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun #include <stdint.h>
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun static int
ProcXCMiscGetVersion(ClientPtr client)46*4882a593Smuzhiyun ProcXCMiscGetVersion(ClientPtr client)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun     xXCMiscGetVersionReply rep = {
49*4882a593Smuzhiyun         .type = X_Reply,
50*4882a593Smuzhiyun         .sequenceNumber = client->sequence,
51*4882a593Smuzhiyun         .length = 0,
52*4882a593Smuzhiyun         .majorVersion = XCMiscMajorVersion,
53*4882a593Smuzhiyun         .minorVersion = XCMiscMinorVersion
54*4882a593Smuzhiyun     };
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXCMiscGetVersionReq);
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun     if (client->swapped) {
59*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
60*4882a593Smuzhiyun         swaps(&rep.majorVersion);
61*4882a593Smuzhiyun         swaps(&rep.minorVersion);
62*4882a593Smuzhiyun     }
63*4882a593Smuzhiyun     WriteToClient(client, sizeof(xXCMiscGetVersionReply), &rep);
64*4882a593Smuzhiyun     return Success;
65*4882a593Smuzhiyun }
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun static int
ProcXCMiscGetXIDRange(ClientPtr client)68*4882a593Smuzhiyun ProcXCMiscGetXIDRange(ClientPtr client)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun     xXCMiscGetXIDRangeReply rep;
71*4882a593Smuzhiyun     XID min_id, max_id;
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXCMiscGetXIDRangeReq);
74*4882a593Smuzhiyun     GetXIDRange(client->index, FALSE, &min_id, &max_id);
75*4882a593Smuzhiyun     rep = (xXCMiscGetXIDRangeReply) {
76*4882a593Smuzhiyun         .type = X_Reply,
77*4882a593Smuzhiyun         .sequenceNumber = client->sequence,
78*4882a593Smuzhiyun         .length = 0,
79*4882a593Smuzhiyun         .start_id = min_id,
80*4882a593Smuzhiyun         .count = max_id - min_id + 1
81*4882a593Smuzhiyun     };
82*4882a593Smuzhiyun     if (client->swapped) {
83*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
84*4882a593Smuzhiyun         swapl(&rep.start_id);
85*4882a593Smuzhiyun         swapl(&rep.count);
86*4882a593Smuzhiyun     }
87*4882a593Smuzhiyun     WriteToClient(client, sizeof(xXCMiscGetXIDRangeReply), &rep);
88*4882a593Smuzhiyun     return Success;
89*4882a593Smuzhiyun }
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun static int
ProcXCMiscGetXIDList(ClientPtr client)92*4882a593Smuzhiyun ProcXCMiscGetXIDList(ClientPtr client)
93*4882a593Smuzhiyun {
94*4882a593Smuzhiyun     REQUEST(xXCMiscGetXIDListReq);
95*4882a593Smuzhiyun     xXCMiscGetXIDListReply rep;
96*4882a593Smuzhiyun     XID *pids;
97*4882a593Smuzhiyun     unsigned int count;
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXCMiscGetXIDListReq);
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun     if (stuff->count > UINT32_MAX / sizeof(XID))
102*4882a593Smuzhiyun         return BadAlloc;
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun     pids = xallocarray(stuff->count, sizeof(XID));
105*4882a593Smuzhiyun     if (!pids) {
106*4882a593Smuzhiyun         return BadAlloc;
107*4882a593Smuzhiyun     }
108*4882a593Smuzhiyun     count = GetXIDList(client, stuff->count, pids);
109*4882a593Smuzhiyun     rep = (xXCMiscGetXIDListReply) {
110*4882a593Smuzhiyun         .type = X_Reply,
111*4882a593Smuzhiyun         .sequenceNumber = client->sequence,
112*4882a593Smuzhiyun         .length = count,
113*4882a593Smuzhiyun         .count = count
114*4882a593Smuzhiyun     };
115*4882a593Smuzhiyun     if (client->swapped) {
116*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
117*4882a593Smuzhiyun         swapl(&rep.length);
118*4882a593Smuzhiyun         swapl(&rep.count);
119*4882a593Smuzhiyun     }
120*4882a593Smuzhiyun     WriteToClient(client, sizeof(xXCMiscGetXIDListReply), &rep);
121*4882a593Smuzhiyun     if (count) {
122*4882a593Smuzhiyun         client->pSwapReplyFunc = (ReplySwapPtr) Swap32Write;
123*4882a593Smuzhiyun         WriteSwappedDataToClient(client, count * sizeof(XID), pids);
124*4882a593Smuzhiyun     }
125*4882a593Smuzhiyun     free(pids);
126*4882a593Smuzhiyun     return Success;
127*4882a593Smuzhiyun }
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun static int
ProcXCMiscDispatch(ClientPtr client)130*4882a593Smuzhiyun ProcXCMiscDispatch(ClientPtr client)
131*4882a593Smuzhiyun {
132*4882a593Smuzhiyun     REQUEST(xReq);
133*4882a593Smuzhiyun     switch (stuff->data) {
134*4882a593Smuzhiyun     case X_XCMiscGetVersion:
135*4882a593Smuzhiyun         return ProcXCMiscGetVersion(client);
136*4882a593Smuzhiyun     case X_XCMiscGetXIDRange:
137*4882a593Smuzhiyun         return ProcXCMiscGetXIDRange(client);
138*4882a593Smuzhiyun     case X_XCMiscGetXIDList:
139*4882a593Smuzhiyun         return ProcXCMiscGetXIDList(client);
140*4882a593Smuzhiyun     default:
141*4882a593Smuzhiyun         return BadRequest;
142*4882a593Smuzhiyun     }
143*4882a593Smuzhiyun }
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun static int _X_COLD
SProcXCMiscGetVersion(ClientPtr client)146*4882a593Smuzhiyun SProcXCMiscGetVersion(ClientPtr client)
147*4882a593Smuzhiyun {
148*4882a593Smuzhiyun     REQUEST(xXCMiscGetVersionReq);
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun     swaps(&stuff->length);
151*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXCMiscGetVersionReq);
152*4882a593Smuzhiyun     swaps(&stuff->majorVersion);
153*4882a593Smuzhiyun     swaps(&stuff->minorVersion);
154*4882a593Smuzhiyun     return ProcXCMiscGetVersion(client);
155*4882a593Smuzhiyun }
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun static int _X_COLD
SProcXCMiscGetXIDRange(ClientPtr client)158*4882a593Smuzhiyun SProcXCMiscGetXIDRange(ClientPtr client)
159*4882a593Smuzhiyun {
160*4882a593Smuzhiyun     REQUEST(xReq);
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun     swaps(&stuff->length);
163*4882a593Smuzhiyun     return ProcXCMiscGetXIDRange(client);
164*4882a593Smuzhiyun }
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun static int _X_COLD
SProcXCMiscGetXIDList(ClientPtr client)167*4882a593Smuzhiyun SProcXCMiscGetXIDList(ClientPtr client)
168*4882a593Smuzhiyun {
169*4882a593Smuzhiyun     REQUEST(xXCMiscGetXIDListReq);
170*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXCMiscGetXIDListReq);
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun     swaps(&stuff->length);
173*4882a593Smuzhiyun     swapl(&stuff->count);
174*4882a593Smuzhiyun     return ProcXCMiscGetXIDList(client);
175*4882a593Smuzhiyun }
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun static int _X_COLD
SProcXCMiscDispatch(ClientPtr client)178*4882a593Smuzhiyun SProcXCMiscDispatch(ClientPtr client)
179*4882a593Smuzhiyun {
180*4882a593Smuzhiyun     REQUEST(xReq);
181*4882a593Smuzhiyun     switch (stuff->data) {
182*4882a593Smuzhiyun     case X_XCMiscGetVersion:
183*4882a593Smuzhiyun         return SProcXCMiscGetVersion(client);
184*4882a593Smuzhiyun     case X_XCMiscGetXIDRange:
185*4882a593Smuzhiyun         return SProcXCMiscGetXIDRange(client);
186*4882a593Smuzhiyun     case X_XCMiscGetXIDList:
187*4882a593Smuzhiyun         return SProcXCMiscGetXIDList(client);
188*4882a593Smuzhiyun     default:
189*4882a593Smuzhiyun         return BadRequest;
190*4882a593Smuzhiyun     }
191*4882a593Smuzhiyun }
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun void
XCMiscExtensionInit(void)194*4882a593Smuzhiyun XCMiscExtensionInit(void)
195*4882a593Smuzhiyun {
196*4882a593Smuzhiyun     AddExtension(XCMiscExtensionName, 0, 0,
197*4882a593Smuzhiyun                  ProcXCMiscDispatch, SProcXCMiscDispatch,
198*4882a593Smuzhiyun                  NULL, StandardMinorOpcode);
199*4882a593Smuzhiyun }
200