xserver-multidpi/lbx/lbxexts.c

276 lines
6.9 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 $ */
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#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);
}
}