1 /* $XFree86: xc/programs/Xserver/Xext/xf86misc.c,v 3.21.2.4 1998/02/25 14:26:43 dawes Exp $ */
2 
3 /*
4  * Copyright (c) 1995, 1996  The XFree86 Project, Inc
5  */
6 
7 /* THIS IS NOT AN X CONSORTIUM STANDARD */
8 
9 #define NEED_REPLIES
10 #define NEED_EVENTS
11 #include "X.h"
12 #include "Xproto.h"
13 #include "misc.h"
14 #include "dixstruct.h"
15 #include "extnsionst.h"
16 #include "scrnintstr.h"
17 #include "inputstr.h"
18 #include "servermd.h"
19 #define _XF86MISC_SERVER_
20 #define _XF86MISC_SAVER_COMPAT_
21 #include "xf86mscstr.h"
22 #include "Xfuncproto.h"
23 #include "xf86.h"
24 #include "xf86Priv.h"
25 #include "xf86_OSlib.h"
26 
27 #include <X11/Xtrans.h>
28 #include "../os/osdep.h"
29 #include <X11/Xauth.h>
30 #ifndef ESIX
31 #ifndef Lynx
32 #include <sys/socket.h>
33 #else
34 #include <socket.h>
35 #endif
36 #else
37 #include <lan/socket.h>
38 #endif
39 
40 #include "swaprep.h"
41 
42 extern int xf86ScreenIndex;
43 extern Bool xf86MiscModInDevEnabled;
44 extern Bool xf86MiscModInDevAllowNonLocal;
45 
46 static int miscErrorBase;
47 
48 static void XF86MiscResetProc(
49 #if NeedFunctionPrototypes
50     ExtensionEntry* /* extEntry */
51 #endif
52 );
53 
54 static DISPATCH_PROC(ProcXF86MiscDispatch);
55 static DISPATCH_PROC(ProcXF86MiscGetKbdSettings);
56 static DISPATCH_PROC(ProcXF86MiscGetMouseSettings);
57 static DISPATCH_PROC(ProcXF86MiscGetSaver);
58 static DISPATCH_PROC(ProcXF86MiscQueryVersion);
59 static DISPATCH_PROC(ProcXF86MiscSetKbdSettings);
60 static DISPATCH_PROC(ProcXF86MiscSetMouseSettings);
61 static DISPATCH_PROC(ProcXF86MiscSetSaver);
62 static DISPATCH_PROC(SProcXF86MiscDispatch);
63 static DISPATCH_PROC(SProcXF86MiscGetKbdSettings);
64 static DISPATCH_PROC(SProcXF86MiscGetMouseSettings);
65 static DISPATCH_PROC(SProcXF86MiscGetSaver);
66 static DISPATCH_PROC(SProcXF86MiscQueryVersion);
67 static DISPATCH_PROC(SProcXF86MiscSetKbdSettings);
68 static DISPATCH_PROC(SProcXF86MiscSetMouseSettings);
69 static DISPATCH_PROC(SProcXF86MiscSetSaver);
70 
71 static unsigned char XF86MiscReqCode = 0;
72 
73 extern InputInfo inputInfo;
74 
75 void
XFree86MiscExtensionInit()76 XFree86MiscExtensionInit()
77 {
78     ExtensionEntry* extEntry;
79 
80     if (
81 	(extEntry = AddExtension(XF86MISCNAME,
82 				XF86MiscNumberEvents,
83 				XF86MiscNumberErrors,
84 				ProcXF86MiscDispatch,
85 				SProcXF86MiscDispatch,
86 				XF86MiscResetProc,
87 				StandardMinorOpcode))) {
88 	XF86MiscReqCode = (unsigned char)extEntry->base;
89 	miscErrorBase = extEntry->errorBase;
90     }
91 }
92 
93 /*ARGSUSED*/
94 static void
XF86MiscResetProc(extEntry)95 XF86MiscResetProc (extEntry)
96     ExtensionEntry* extEntry;
97 {
98 }
99 
100 static int
ProcXF86MiscQueryVersion(client)101 ProcXF86MiscQueryVersion(client)
102     register ClientPtr client;
103 {
104     xXF86MiscQueryVersionReply rep;
105     register int n;
106 
107     REQUEST_SIZE_MATCH(xXF86MiscQueryVersionReq);
108     rep.type = X_Reply;
109     rep.length = 0;
110     rep.sequenceNumber = client->sequence;
111     rep.majorVersion = XF86MISC_MAJOR_VERSION;
112     rep.minorVersion = XF86MISC_MINOR_VERSION;
113     if (client->swapped) {
114     	swaps(&rep.sequenceNumber, n);
115     	swapl(&rep.length, n);
116     	swaps(&rep.majorVersion, n);
117     	swaps(&rep.minorVersion, n);
118     }
119     WriteToClient(client, sizeof(xXF86MiscQueryVersionReply), (char *)&rep);
120     return (client->noClientException);
121 }
122 
123 /*
124  * This will go away, but remains for now for compatibility with older
125  * clients.
126  */
127 static int
ProcXF86MiscSetSaver(client)128 ProcXF86MiscSetSaver(client)
129     register ClientPtr client;
130 {
131     REQUEST(xXF86MiscSetSaverReq);
132     ScrnInfoPtr vptr;
133 
134     if (stuff->screen > screenInfo.numScreens)
135 	return BadValue;
136 
137     vptr = (ScrnInfoPtr) screenInfo.screens[stuff->screen]->devPrivates[xf86ScreenIndex].ptr;
138 
139     REQUEST_SIZE_MATCH(xXF86MiscSetSaverReq);
140 
141     if (stuff->suspendTime < 0)
142 	return BadValue;
143     if (stuff->offTime < 0)
144 	return BadValue;
145 
146     return (client->noClientException);
147 }
148 
149 /*
150  * This will go away, but remains for now for compatibility with older
151  * clients.
152  */
153 static int
ProcXF86MiscGetSaver(client)154 ProcXF86MiscGetSaver(client)
155     register ClientPtr client;
156 {
157     REQUEST(xXF86MiscGetSaverReq);
158     xXF86MiscGetSaverReply rep;
159     register int n;
160     ScrnInfoPtr vptr;
161 
162     if (stuff->screen > screenInfo.numScreens)
163 	return BadValue;
164 
165     vptr = (ScrnInfoPtr) screenInfo.screens[stuff->screen]->devPrivates[xf86ScreenIndex].ptr;
166 
167     REQUEST_SIZE_MATCH(xXF86MiscGetSaverReq);
168     rep.type = X_Reply;
169     rep.length = 0;
170     rep.sequenceNumber = client->sequence;
171     rep.suspendTime = 0;
172     rep.offTime = 0;
173 
174     if (client->swapped) {
175     	swaps(&rep.sequenceNumber, n);
176     	swapl(&rep.length, n);
177     	swapl(&rep.suspendTime, n);
178     	swapl(&rep.offTime, n);
179     }
180     WriteToClient(client, SIZEOF(xXF86MiscGetSaverReply), (char *)&rep);
181     return (client->noClientException);
182 }
183 
184 static int
ProcXF86MiscGetMouseSettings(client)185 ProcXF86MiscGetMouseSettings(client)
186     register ClientPtr client;
187 {
188     xXF86MiscGetMouseSettingsReply rep;
189     register int n;
190 
191     REQUEST_SIZE_MATCH(xXF86MiscGetMouseSettingsReq);
192     rep.type = X_Reply;
193     rep.sequenceNumber = client->sequence;
194     rep.mousetype = xf86Info.mouseDev->mseType;
195 #ifdef XQUEUE
196     if (xf86Info.mouseDev->mseProc == xf86XqueMseProc)
197         rep.mousetype = MTYPE_XQUEUE;
198 #endif
199 #if defined(USE_OSMOUSE) || defined(OSMOUSE_ONLY)
200     if (xf86Info.mouseDev->mseProc == xf86OsMouseProc)
201         rep.mousetype = MTYPE_OSMOUSE;
202 #endif
203     rep.baudrate = xf86Info.mouseDev->baudRate;
204     rep.samplerate = xf86Info.mouseDev->sampleRate;
205     rep.resolution = xf86Info.mouseDev->resolution;
206     rep.buttons = xf86Info.mouseDev->buttons;
207     rep.emulate3buttons = xf86Info.mouseDev->emulate3Buttons;
208     rep.emulate3timeout = xf86Info.mouseDev->emulate3Timeout;
209     rep.chordmiddle = xf86Info.mouseDev->chordMiddle;
210     rep.flags = xf86Info.mouseDev->mouseFlags;
211     if (xf86Info.mouseDev->mseDevice)
212         rep.devnamelen = strlen(xf86Info.mouseDev->mseDevice);
213     else
214         rep.devnamelen = 0;
215     rep.length = (sizeof(xXF86MiscGetMouseSettingsReply) -
216 		  sizeof(xGenericReply) + ((rep.devnamelen+3) & ~3)) >> 2;
217 
218     if (client->swapped) {
219     	swaps(&rep.sequenceNumber, n);
220     	swapl(&rep.length, n);
221     	swapl(&rep.mousetype, n);
222     	swapl(&rep.baudrate, n);
223     	swapl(&rep.samplerate, n);
224     	swapl(&rep.resolution, n);
225     	swapl(&rep.buttons, n);
226     	swapl(&rep.emulate3buttons, n);
227     	swapl(&rep.emulate3timeout, n);
228     	swapl(&rep.chordmiddle, n);
229     	swapl(&rep.flags, n);
230     }
231     WriteToClient(client, SIZEOF(xXF86MiscGetMouseSettingsReply), (char *)&rep);
232     if (rep.devnamelen)
233         WriteToClient(client, rep.devnamelen, xf86Info.mouseDev->mseDevice);
234     return (client->noClientException);
235 }
236 
237 static int
ProcXF86MiscGetKbdSettings(client)238 ProcXF86MiscGetKbdSettings(client)
239     register ClientPtr client;
240 {
241     xXF86MiscGetKbdSettingsReply rep;
242     register int n;
243 
244     REQUEST_SIZE_MATCH(xXF86MiscGetKbdSettingsReq);
245     rep.type = X_Reply;
246     rep.length = 0;
247     rep.sequenceNumber = client->sequence;
248     rep.kbdtype = xf86Info.kbdType;
249 #ifdef XQUEUE
250     if (xf86Info.kbdProc == xf86XqueKbdProc)
251         rep.kbdtype = KTYPE_XQUEUE;
252 #endif
253     rep.rate = xf86Info.kbdRate;
254     rep.delay = xf86Info.kbdDelay;
255     rep.servnumlock = xf86Info.serverNumLock;
256     if (client->swapped) {
257     	swaps(&rep.sequenceNumber, n);
258     	swapl(&rep.length, n);
259     	swapl(&rep.kbdtype, n);
260     	swapl(&rep.rate, n);
261     	swapl(&rep.delay, n);
262     }
263     WriteToClient(client, SIZEOF(xXF86MiscGetKbdSettingsReply), (char *)&rep);
264     return (client->noClientException);
265 }
266 
267 static int
ProcXF86MiscSetMouseSettings(client)268 ProcXF86MiscSetMouseSettings(client)
269     register ClientPtr client;
270 {
271     int reopen, msetype, flags, baudrate, samplerate, resolution;
272 
273     REQUEST(xXF86MiscSetMouseSettingsReq);
274 
275     REQUEST_SIZE_MATCH(xXF86MiscSetMouseSettingsReq);
276 
277     if (xf86Verbose) {
278 	ErrorF("SetMouseSettings - type: %d brate: %d srate: %d chdmid: %d\n",
279 		stuff->mousetype, stuff->baudrate,
280 		stuff->samplerate, stuff->chordmiddle);
281 	ErrorF("                   em3but: %d em3tim: %d res: %d flags: %d\n",
282 		stuff->emulate3buttons, stuff->emulate3timeout,
283 		stuff->resolution, stuff->flags);
284     }
285     if (stuff->mousetype > MTYPE_OSMOUSE
286             || stuff->mousetype < MTYPE_MICROSOFT)
287 	return miscErrorBase + XF86MiscBadMouseProtocol;
288 #ifdef OSMOUSE_ONLY
289     if (stuff->mousetype != MTYPE_OSMOUSE)
290 	return miscErrorBase + XF86MiscBadMouseProtocol;
291 #else
292 #ifndef XQUEUE
293     if (stuff->mousetype == MTYPE_XQUEUE)
294 	return miscErrorBase + XF86MiscBadMouseProtocol;
295 #endif
296 #ifndef USE_OSMOUSE
297     if (stuff->mousetype == MTYPE_OSMOUSE)
298 	return miscErrorBase + XF86MiscBadMouseProtocol;
299 #endif
300 #endif /* OSMOUSE_ONLY */
301 
302     if (stuff->emulate3timeout < 0)
303 	return BadValue;
304 
305     if (stuff->mousetype == MTYPE_LOGIMAN
306             && !(stuff->baudrate == 1200 || stuff->baudrate == 9600) )
307 	return miscErrorBase + XF86MiscBadMouseBaudRate;
308     if (stuff->mousetype == MTYPE_LOGIMAN && stuff->samplerate)
309 	return miscErrorBase + XF86MiscBadMouseCombo;
310 
311     samplerate = xf86Info.mouseDev->sampleRate;
312     resolution = xf86Info.mouseDev->resolution;
313     baudrate   = xf86Info.mouseDev->baudRate;
314     flags      = xf86Info.mouseDev->mouseFlags;
315     msetype    = xf86Info.mouseDev->mseType;
316 #ifdef XQUEUE
317     if (xf86Info.mouseDev->mseProc == xf86XqueMseProc)
318         msetype = MTYPE_XQUEUE;
319 #endif
320 #if defined(USE_OSMOUSE) || defined(OSMOUSE_ONLY)
321     if (xf86Info.mouseDev->mseProc == xf86OsMouseProc)
322         msetype = MTYPE_OSMOUSE;
323 #endif
324 
325     reopen     = 0;
326 
327     if (stuff->mousetype != msetype)
328 	if (stuff->mousetype == MTYPE_XQUEUE
329 		|| stuff->mousetype == MTYPE_OSMOUSE
330 		|| msetype == MTYPE_XQUEUE
331 		|| msetype == MTYPE_OSMOUSE)
332 	    return miscErrorBase + XF86MiscBadMouseProtocol;
333 	else {
334 	    reopen++;
335 	    msetype = stuff->mousetype;
336 	}
337 
338     if (stuff->flags & MF_REOPEN) {
339 	reopen++;
340 	stuff->flags &= ~MF_REOPEN;
341     }
342     if (stuff->mousetype != MTYPE_OSMOUSE
343 	    && stuff->mousetype != MTYPE_XQUEUE
344 	    && stuff->mousetype != MTYPE_PS_2
345 	    && stuff->mousetype != MTYPE_BUSMOUSE
346 	    && stuff->mousetype != MTYPE_IMPS2
347 	    && stuff->mousetype != MTYPE_THINKINGPS2
348 	    && stuff->mousetype != MTYPE_MMANPLUSPS2
349 	    && stuff->mousetype != MTYPE_GLIDEPOINTPS2
350 	    && stuff->mousetype != MTYPE_NETPS2
351 	    && stuff->mousetype != MTYPE_NETSCROLLPS2
352 	    && stuff->mousetype != MTYPE_SYSMOUSE)
353     {
354         if (stuff->baudrate < 1200)
355 	    return miscErrorBase + XF86MiscBadMouseBaudRate;
356         if (stuff->baudrate % 1200 != 0
357                 || stuff->baudrate < 1200 || stuff->baudrate > 9600)
358 	    return miscErrorBase + XF86MiscBadMouseBaudRate;
359 	if (xf86Info.mouseDev->baudRate != stuff->baudrate) {
360 		reopen++;
361 		baudrate = stuff->baudrate;
362 	}
363     }
364     if (stuff->flags & (MF_CLEAR_DTR|MF_CLEAR_RTS))
365 	if (stuff->mousetype != MTYPE_MOUSESYS)
366 	    return miscErrorBase + XF86MiscBadMouseFlags;
367 	else if (xf86Info.mouseDev->mouseFlags != stuff->flags) {
368 	    reopen++;
369             flags = stuff->flags;
370 	}
371 
372     if (stuff->mousetype != MTYPE_OSMOUSE
373 	    && stuff->mousetype != MTYPE_XQUEUE
374 	    && stuff->mousetype != MTYPE_BUSMOUSE)
375     {
376         if (stuff->samplerate < 0)
377 	    return BadValue;
378 
379 	if (xf86Info.mouseDev->sampleRate != stuff->samplerate) {
380 		reopen++;
381 		samplerate = stuff->samplerate;
382 	}
383     }
384 
385     if (stuff->resolution < 0)
386 	return BadValue;
387     if (xf86Info.mouseDev->resolution != stuff->resolution) {
388 	reopen++;
389 	resolution = stuff->resolution;
390     }
391 
392 #if 0
393     /* Ignore the buttons field */
394     if (xf86Info.mouseDev->buttons != stuff->buttons)
395 	/* we cannot change this field on the fly... */
396 	return BadValue;
397 #endif
398 
399     if (stuff->chordmiddle)
400         if (stuff->emulate3buttons
401 		|| !(stuff->mousetype == MTYPE_MICROSOFT
402 		     || stuff->mousetype == MTYPE_LOGIMAN) )
403 	    return miscErrorBase + XF86MiscBadMouseCombo;
404 
405     xf86Info.mouseDev->chordMiddle = stuff->chordmiddle!=0;
406     xf86Info.mouseDev->emulate3Buttons = stuff->emulate3buttons!=0;
407     xf86Info.mouseDev->emulate3Timeout = stuff->emulate3timeout;
408 
409     if (reopen && msetype != MTYPE_OSMOUSE && msetype != MTYPE_XQUEUE) {
410 
411         (xf86Info.mouseDev->mseProc)(xf86Info.pMouse, DEVICE_CLOSE);
412 
413         xf86Info.mouseDev->mseType    = msetype;
414         xf86Info.mouseDev->mouseFlags = flags;
415         xf86Info.mouseDev->baudRate   = baudrate;
416         xf86Info.mouseDev->sampleRate = samplerate;
417 	xf86Info.mouseDev->resolution = resolution;
418 
419 	xf86Info.pMouse->public.on = FALSE;
420 	xf86AllowMouseOpenFail = TRUE;
421 	xf86MouseInit(xf86Info.mouseDev);
422         (xf86Info.mouseDev->mseProc)(xf86Info.pMouse, DEVICE_ON);
423     }
424 
425     if (xf86Verbose)
426 	ErrorF("SetMouseSettings - Succeeded\n");
427     return (client->noClientException);
428 }
429 
430 static int
ProcXF86MiscSetKbdSettings(client)431 ProcXF86MiscSetKbdSettings(client)
432     register ClientPtr client;
433 {
434     REQUEST(xXF86MiscSetKbdSettingsReq);
435 
436     REQUEST_SIZE_MATCH(xXF86MiscSetKbdSettingsReq);
437 
438     if (xf86Verbose)
439 	ErrorF("SetKbdSettings - type: %d rate: %d delay: %d snumlk: %d\n",
440 		stuff->kbdtype, stuff->rate,
441 		stuff->delay, stuff->servnumlock);
442     if (stuff->rate < 0)
443 	return BadValue;
444     if (stuff->delay < 0)
445 	return BadValue;
446     if (stuff->kbdtype < KTYPE_UNKNOWN || stuff->kbdtype > KTYPE_XQUEUE)
447 	return miscErrorBase + XF86MiscBadKbdType;
448 
449     if (xf86Info.kbdRate!=stuff->rate || xf86Info.kbdDelay!=stuff->delay) {
450 	char rad;
451 
452 	xf86Info.kbdRate = stuff->rate;
453 	xf86Info.kbdDelay = stuff->delay;
454         if      (xf86Info.kbdDelay <= 375) rad = 0x00;
455         else if (xf86Info.kbdDelay <= 625) rad = 0x20;
456         else if (xf86Info.kbdDelay <= 875) rad = 0x40;
457         else                               rad = 0x60;
458 
459         if      (xf86Info.kbdRate <=  2)   rad |= 0x1F;
460         else if (xf86Info.kbdRate >= 30)   rad |= 0x00;
461         else                               rad |= ((58/xf86Info.kbdRate)-2);
462 
463         xf86SetKbdRepeat(rad);
464     }
465 #if 0	/* Not done yet */
466     xf86Info.kbdType = stuff->kbdtype;
467     xf86Info.serverNumLock = stuff->servnumlock!=0;
468 #endif
469 
470     if (xf86Verbose)
471 	ErrorF("SetKbdSettings - Succeeded\n");
472     return (client->noClientException);
473 }
474 
475 static int
ProcXF86MiscDispatch(client)476 ProcXF86MiscDispatch (client)
477     register ClientPtr	client;
478 {
479     REQUEST(xReq);
480     switch (stuff->data)
481     {
482     case X_XF86MiscQueryVersion:
483 	return ProcXF86MiscQueryVersion(client);
484     case X_XF86MiscGetSaver:
485 	return ProcXF86MiscGetSaver(client);
486     case X_XF86MiscSetSaver:
487 	return ProcXF86MiscSetSaver(client);
488     case X_XF86MiscGetMouseSettings:
489 	return ProcXF86MiscGetMouseSettings(client);
490     case X_XF86MiscGetKbdSettings:
491 	return ProcXF86MiscGetKbdSettings(client);
492     default:
493 	if (!xf86MiscModInDevEnabled)
494 	    return miscErrorBase + XF86MiscModInDevDisabled;
495 	if (xf86MiscModInDevAllowNonLocal || LocalClient (client)) {
496 	    switch (stuff->data) {
497 	        case X_XF86MiscSetMouseSettings:
498 		    return ProcXF86MiscSetMouseSettings(client);
499 	        case X_XF86MiscSetKbdSettings:
500 		    return ProcXF86MiscSetKbdSettings(client);
501 	        default:
502 		    return BadRequest;
503 	    }
504 	} else
505 	    return miscErrorBase + XF86MiscModInDevClientNotLocal;
506     }
507 }
508 
509 static int
SProcXF86MiscQueryVersion(client)510 SProcXF86MiscQueryVersion(client)
511     register ClientPtr	client;
512 {
513     register int n;
514     REQUEST(xXF86MiscQueryVersionReq);
515     swaps(&stuff->length, n);
516     return ProcXF86MiscQueryVersion(client);
517 }
518 
519 static int
SProcXF86MiscGetSaver(client)520 SProcXF86MiscGetSaver(client)
521     ClientPtr client;
522 {
523     register int n;
524     REQUEST(xXF86MiscGetSaverReq);
525     swaps(&stuff->length, n);
526     REQUEST_SIZE_MATCH(xXF86MiscGetSaverReq);
527     swaps(&stuff->screen, n);
528     return ProcXF86MiscGetSaver(client);
529 }
530 
531 static int
SProcXF86MiscSetSaver(client)532 SProcXF86MiscSetSaver(client)
533     ClientPtr client;
534 {
535     register int n;
536     REQUEST(xXF86MiscSetSaverReq);
537     swaps(&stuff->length, n);
538     REQUEST_SIZE_MATCH(xXF86MiscSetSaverReq);
539     swaps(&stuff->screen, n);
540     swapl(&stuff->suspendTime, n);
541     swapl(&stuff->offTime, n);
542     return ProcXF86MiscSetSaver(client);
543 }
544 
545 static int
SProcXF86MiscGetMouseSettings(client)546 SProcXF86MiscGetMouseSettings(client)
547     ClientPtr client;
548 {
549     register int n;
550     REQUEST(xXF86MiscGetMouseSettingsReq);
551     swaps(&stuff->length, n);
552     REQUEST_SIZE_MATCH(xXF86MiscGetMouseSettingsReq);
553     return ProcXF86MiscGetMouseSettings(client);
554 }
555 
556 static int
SProcXF86MiscGetKbdSettings(client)557 SProcXF86MiscGetKbdSettings(client)
558     ClientPtr client;
559 {
560     register int n;
561     REQUEST(xXF86MiscGetKbdSettingsReq);
562     swaps(&stuff->length, n);
563     REQUEST_SIZE_MATCH(xXF86MiscGetKbdSettingsReq);
564     return ProcXF86MiscGetKbdSettings(client);
565 }
566 
567 static int
SProcXF86MiscSetMouseSettings(client)568 SProcXF86MiscSetMouseSettings(client)
569     ClientPtr client;
570 {
571     register int n;
572     REQUEST(xXF86MiscSetMouseSettingsReq);
573     swaps(&stuff->length, n);
574     REQUEST_SIZE_MATCH(xXF86MiscSetMouseSettingsReq);
575     swapl(&stuff->mousetype, n);
576     swapl(&stuff->baudrate, n);
577     swapl(&stuff->samplerate, n);
578     swapl(&stuff->resolution, n);
579     swapl(&stuff->buttons, n);
580     swapl(&stuff->emulate3timeout, n);
581     swapl(&stuff->flags, n);
582     return ProcXF86MiscSetMouseSettings(client);
583 }
584 
585 static int
SProcXF86MiscSetKbdSettings(client)586 SProcXF86MiscSetKbdSettings(client)
587     ClientPtr client;
588 {
589     register int n;
590     REQUEST(xXF86MiscSetKbdSettingsReq);
591     swaps(&stuff->length, n);
592     REQUEST_SIZE_MATCH(xXF86MiscSetKbdSettingsReq);
593     swapl(&stuff->kbdtype, n);
594     swapl(&stuff->rate, n);
595     swapl(&stuff->delay, n);
596     return ProcXF86MiscSetKbdSettings(client);
597 }
598 
599 static int
SProcXF86MiscDispatch(client)600 SProcXF86MiscDispatch (client)
601     register ClientPtr	client;
602 {
603     REQUEST(xReq);
604     switch (stuff->data)
605     {
606     case X_XF86MiscQueryVersion:
607 	return SProcXF86MiscQueryVersion(client);
608     case X_XF86MiscGetSaver:
609 	return SProcXF86MiscGetSaver(client);
610     case X_XF86MiscSetSaver:
611 	return SProcXF86MiscSetSaver(client);
612     case X_XF86MiscGetMouseSettings:
613 	return SProcXF86MiscGetMouseSettings(client);
614     case X_XF86MiscGetKbdSettings:
615 	return SProcXF86MiscGetKbdSettings(client);
616     default:
617 	if (!xf86MiscModInDevEnabled)
618 	    return miscErrorBase + XF86MiscModInDevDisabled;
619 	if (xf86MiscModInDevAllowNonLocal || LocalClient (client)) {
620 	    switch (stuff->data) {
621 	        case X_XF86MiscSetMouseSettings:
622 		    return SProcXF86MiscSetMouseSettings(client);
623 	        case X_XF86MiscSetKbdSettings:
624 		    return SProcXF86MiscSetKbdSettings(client);
625 	        default:
626 		    return BadRequest;
627 	    }
628 	} else
629 	    return miscErrorBase + XF86MiscModInDevClientNotLocal;
630     }
631 }
632 
633