272 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			272 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C
		
	
	
	
| /* $Xorg: lbxexts.c,v 1.3 2000/08/17 19:53:31 cpqbld Exp $ */
 | |
| /*
 | |
|  * Copyright 1994 Network Computing Devices, Inc.
 | |
|  *
 | |
|  * Permission to use, copy, modify, distribute, and sell this software and
 | |
|  * its documentation for any purpose is hereby granted without fee, provided
 | |
|  * that the above copyright notice appear in all copies and that both that
 | |
|  * copyright notice and this permission notice appear in supporting
 | |
|  * documentation, and that the name Network Computing Devices, Inc. not be
 | |
|  * used in advertising or publicity pertaining to distribution of this
 | |
|  * software without specific, written prior permission.
 | |
|  *
 | |
|  * THIS SOFTWARE IS PROVIDED `AS-IS'.  NETWORK COMPUTING DEVICES, INC.,
 | |
|  * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT
 | |
|  * LIMITATION ALL IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 | |
|  * PARTICULAR PURPOSE, OR NONINFRINGEMENT.  IN NO EVENT SHALL NETWORK
 | |
|  * COMPUTING DEVICES, INC., BE LIABLE FOR ANY DAMAGES WHATSOEVER, INCLUDING
 | |
|  * SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS OF USE, DATA,
 | |
|  * OR PROFITS, EVEN IF ADVISED OF THE POSSIBILITY THEREOF, AND REGARDLESS OF
 | |
|  * WHETHER IN AN ACTION IN CONTRACT, TORT OR NEGLIGENCE, ARISING OUT OF OR IN
 | |
|  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | |
|  *
 | |
|  */
 | |
| /* $XFree86: xc/programs/Xserver/lbx/lbxexts.c,v 1.2 2000/05/18 23:46:24 dawes Exp $ */
 | |
| 
 | |
| #include <X11/X.h>
 | |
| #include <X11/Xproto.h>
 | |
| #include "misc.h"
 | |
| #include "dixstruct.h"
 | |
| #include "colormapst.h"
 | |
| #include "propertyst.h"
 | |
| #define _XLBX_SERVER_
 | |
| #include <X11/extensions/lbxstr.h>
 | |
| #include "lbxserve.h"
 | |
| #ifdef XCSECURITY
 | |
| #define _SECURITY_SERVER
 | |
| #include <X11/extensions/security.h>
 | |
| #endif
 | |
| 
 | |
| typedef struct _lbxext {
 | |
|     char       *name;
 | |
|     char      **aliases;
 | |
|     int         num_aliases;
 | |
|     int         idx;
 | |
|     int         opcode;
 | |
|     int         ev_base;
 | |
|     int         err_base;
 | |
|     int         num_reqs;
 | |
|     CARD8      *rep_mask;
 | |
|     CARD8      *ev_mask;
 | |
| #ifdef XCSECURITY
 | |
|     Bool	secure;
 | |
| #endif
 | |
| }           LbxExtensionEntry;
 | |
| 
 | |
| static LbxExtensionEntry **lbx_extensions = NULL;
 | |
| static int  num_exts = 0;
 | |
| 
 | |
| 
 | |
| Bool
 | |
| LbxAddExtension(char       *name,
 | |
| 		int         opcode,
 | |
| 		int         ev_base,
 | |
|                 int	    err_base)
 | |
| {
 | |
|     int         i;
 | |
|     LbxExtensionEntry *ext,
 | |
| 	**newexts;
 | |
| 
 | |
|     ext = (LbxExtensionEntry *) xalloc(sizeof(LbxExtensionEntry));
 | |
|     if (!ext)
 | |
| 	return FALSE;
 | |
|     ext->name = (char *) xalloc(strlen(name) + 1);
 | |
|     ext->num_aliases = 0;
 | |
|     ext->aliases = (char **) NULL;
 | |
|     if (!ext->name) {
 | |
| 	xfree(ext);
 | |
| 	return FALSE;
 | |
|     }
 | |
|     strcpy(ext->name, name);
 | |
|     i = num_exts;
 | |
|     newexts = (LbxExtensionEntry **) xrealloc(lbx_extensions,
 | |
| 				      (i + 1) * sizeof(LbxExtensionEntry *));
 | |
|     if (!newexts) {
 | |
| 	xfree(ext->name);
 | |
| 	xfree(ext);
 | |
| 	return FALSE;
 | |
|     }
 | |
|     num_exts++;
 | |
|     lbx_extensions = newexts;
 | |
|     lbx_extensions[i] = ext;
 | |
|     ext->idx = i;
 | |
| 
 | |
|     ext->opcode = opcode;;
 | |
|     ext->ev_base = ev_base;;
 | |
|     ext->err_base = err_base;
 | |
|     ext->ev_mask = NULL;
 | |
|     ext->rep_mask = NULL;
 | |
|     ext->num_reqs = 0;
 | |
| #ifdef XCSECURITY
 | |
|     ext->secure = FALSE;
 | |
| #endif
 | |
| 
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| Bool
 | |
| LbxAddExtensionAlias(int         idx,
 | |
| 		     char       *alias)
 | |
| {
 | |
|     char       *name;
 | |
|     char      **aliases;
 | |
|     LbxExtensionEntry *ext = lbx_extensions[idx];
 | |
| 
 | |
|     aliases = (char **) xrealloc(ext->aliases,
 | |
| 				 (ext->num_aliases + 1) * sizeof(char *));
 | |
|     if (!aliases)
 | |
| 	return FALSE;
 | |
|     ext->aliases = aliases;
 | |
|     name = (char *) xalloc(strlen(alias) + 1);
 | |
|     if (!name)
 | |
| 	return FALSE;
 | |
|     strcpy(name, alias);
 | |
|     ext->aliases[ext->num_aliases] = name;
 | |
|     ext->num_aliases++;
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| static int
 | |
| LbxFindExtension(char *extname,
 | |
| 		 int len)
 | |
| {
 | |
|     int i, j;
 | |
| 
 | |
|     for (i = 0; i < num_exts; i++) {
 | |
| 	if ((strlen(lbx_extensions[i]->name) == len) &&
 | |
| 		(strncmp(lbx_extensions[i]->name, extname, len) == 0))
 | |
| 	    return i;
 | |
| 	for (j = lbx_extensions[i]->num_aliases; --j >= 0;) {
 | |
| 	    if ((strlen(lbx_extensions[i]->aliases[j]) == len) &&
 | |
| 		(strncmp(lbx_extensions[i]->aliases[j], extname, len) == 0))
 | |
| 		return i;
 | |
| 	}
 | |
|     }
 | |
|     return -1;
 | |
| }
 | |
| 
 | |
| void
 | |
| LbxDeclareExtensionSecurity(char *extname,
 | |
| 			    Bool secure)
 | |
| {
 | |
| #ifdef XCSECURITY
 | |
|     int i = LbxFindExtension(extname, strlen(extname));
 | |
|     if (i >= 0)
 | |
| 	lbx_extensions[i]->secure = secure;
 | |
| #endif
 | |
| }
 | |
| 
 | |
| Bool
 | |
| LbxRegisterExtensionGenerationMasks(int         idx,
 | |
| 				    int         num_reqs,
 | |
| 				    char       *rep_mask,
 | |
| 				    char       *ev_mask)
 | |
| {
 | |
|     LbxExtensionEntry *ext = lbx_extensions[idx];
 | |
|     CARD8      *nrm,
 | |
|                *nem;
 | |
|     int         mlen = mlen = num_reqs / (8 * sizeof(CARD8)) + 1;
 | |
| 
 | |
|     nrm = (CARD8 *) xalloc(sizeof(CARD8) * mlen);
 | |
|     nem = (CARD8 *) xalloc(sizeof(CARD8) * mlen);
 | |
| 
 | |
|     if (!nrm || !nem) {
 | |
| 	xfree(nrm);
 | |
| 	xfree(nem);
 | |
| 	return FALSE;
 | |
|     }
 | |
|     memcpy((char *) nrm, (char *) rep_mask, mlen);
 | |
|     memcpy((char *) nem, (char *) ev_mask, mlen);
 | |
|     ext->rep_mask = nrm;
 | |
|     ext->ev_mask = nem;
 | |
|     ext->num_reqs = num_reqs;
 | |
| 
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| int
 | |
| LbxQueryExtension(ClientPtr   client,
 | |
| 		  char       *ename,
 | |
| 		  int         nlen)
 | |
| {
 | |
|     xLbxQueryExtensionReply rep;
 | |
|     int         i;
 | |
|     int         mlen = 0;
 | |
| 
 | |
|     rep.type = X_Reply;
 | |
|     rep.sequenceNumber = client->sequence;
 | |
|     rep.major_opcode = 0;
 | |
|     rep.present = FALSE;
 | |
|     rep.length = 0;
 | |
|     rep.pad0 = rep.pad1 = rep.pad2 = rep.pad3 = rep.pad4 = 0;
 | |
| 
 | |
|     i = LbxFindExtension(ename, nlen);
 | |
| 
 | |
|     if (i < 0
 | |
| #ifdef XCSECURITY
 | |
| 	    /* don't show insecure extensions to untrusted clients */
 | |
| 	    || (client->trustLevel == XSecurityClientUntrusted &&
 | |
| 		!lbx_extensions[i]->secure)
 | |
| #endif
 | |
| 	)
 | |
| 	rep.present = FALSE;
 | |
|     else {
 | |
| 	rep.present = TRUE;
 | |
| 	rep.major_opcode = lbx_extensions[i]->opcode;
 | |
| 	rep.first_event = lbx_extensions[i]->ev_base;
 | |
| 	rep.first_error = lbx_extensions[i]->err_base;
 | |
| 	rep.numReqs = lbx_extensions[i]->num_reqs;
 | |
| 	if (lbx_extensions[i]->rep_mask) {
 | |
| 	    mlen = (lbx_extensions[i]->num_reqs + 7) >> 3;
 | |
| 	    rep.length = ((mlen + 3) >> 2) * 2;
 | |
| 	}
 | |
|     }
 | |
|     if (client->swapped) {
 | |
|     	char	n;
 | |
| 
 | |
| 	swaps(&rep.sequenceNumber, n);
 | |
| 	swapl(&rep.length, n);
 | |
|     }
 | |
|     WriteToClient(client, sizeof(xLbxQueryExtensionReply), (char *)&rep);
 | |
|     if (mlen) {
 | |
| 	WriteToClient(client, mlen, (char *)lbx_extensions[i]->rep_mask);
 | |
| 	WriteToClient(client, mlen, (char *)lbx_extensions[i]->ev_mask);
 | |
|     }
 | |
|     return Success;
 | |
| }
 | |
| 
 | |
| void
 | |
| LbxCloseDownExtensions(void)
 | |
| {
 | |
|     int         i,j;
 | |
| 
 | |
|     for (i = 0; i < num_exts; i++) {
 | |
| 	xfree(lbx_extensions[i]->name);
 | |
| 	for (j = 0; j < lbx_extensions[i]->num_aliases; j++)
 | |
| 	  xfree(lbx_extensions[i]->aliases[j]);
 | |
| 	xfree(lbx_extensions[i]->aliases);
 | |
| 	xfree(lbx_extensions[i]->rep_mask);
 | |
| 	xfree(lbx_extensions[i]->ev_mask);
 | |
| 	xfree(lbx_extensions[i]);
 | |
|     }
 | |
|     xfree(lbx_extensions);
 | |
|     lbx_extensions = NULL;
 | |
|     num_exts = 0;
 | |
| 
 | |
| }
 | |
| 
 | |
| void
 | |
| LbxSetReqMask(CARD8      *mask,
 | |
| 	      int         req,
 | |
| 	      Bool        on)
 | |
| {
 | |
|     int         mword = req / (8 * sizeof(CARD8));
 | |
| 
 | |
|     req = req % (8 * sizeof(CARD8));
 | |
|     if (on) {
 | |
| 	mask[mword] |= (1 << req);
 | |
|     } else {
 | |
| 	mask[mword] &= ~(1 << req);
 | |
|     }
 | |
| }
 |