2003-11-14 16:54:54 +01:00
|
|
|
/* $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.
|
|
|
|
*
|
|
|
|
*/
|
2004-03-14 09:34:49 +01:00
|
|
|
/* $XFree86: xc/programs/Xserver/lbx/lbxexts.c,v 1.4 2001/02/16 13:24:10 eich Exp $ */
|
2003-11-14 16:54:54 +01:00
|
|
|
|
|
|
|
#include "X.h"
|
|
|
|
#include "Xproto.h"
|
|
|
|
#include "misc.h"
|
|
|
|
#include "dixstruct.h"
|
2003-11-14 17:49:22 +01:00
|
|
|
#include "colormapst.h"
|
|
|
|
#include "propertyst.h"
|
2003-11-14 16:54:54 +01:00
|
|
|
#define _XLBX_SERVER_
|
|
|
|
#include "lbxstr.h"
|
2003-11-14 17:49:22 +01:00
|
|
|
#include "lbxserve.h"
|
2003-11-14 16:54:54 +01:00
|
|
|
#ifdef XCSECURITY
|
|
|
|
#define _SECURITY_SERVER
|
|
|
|
#include "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
|
2003-11-14 17:49:22 +01:00
|
|
|
LbxAddExtension(char *name,
|
|
|
|
int opcode,
|
|
|
|
int ev_base,
|
|
|
|
int err_base)
|
2003-11-14 16:54:54 +01:00
|
|
|
{
|
|
|
|
int i;
|
2003-11-14 17:49:22 +01:00
|
|
|
LbxExtensionEntry *ext,
|
|
|
|
**newexts;
|
2003-11-14 16:54:54 +01:00
|
|
|
|
|
|
|
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
|
2003-11-14 17:49:22 +01:00
|
|
|
LbxAddExtensionAlias(int idx,
|
|
|
|
char *alias)
|
2003-11-14 16:54:54 +01:00
|
|
|
{
|
|
|
|
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
|
2003-11-14 17:49:22 +01:00
|
|
|
LbxFindExtension(char *extname,
|
|
|
|
int len)
|
2003-11-14 16:54:54 +01:00
|
|
|
{
|
|
|
|
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
|
2003-11-14 17:49:22 +01:00
|
|
|
LbxDeclareExtensionSecurity(char *extname,
|
|
|
|
Bool secure)
|
2003-11-14 16:54:54 +01:00
|
|
|
{
|
|
|
|
#ifdef XCSECURITY
|
|
|
|
int i = LbxFindExtension(extname, strlen(extname));
|
|
|
|
if (i >= 0)
|
|
|
|
lbx_extensions[i]->secure = secure;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
Bool
|
2003-11-14 17:49:22 +01:00
|
|
|
LbxRegisterExtensionGenerationMasks(int idx,
|
|
|
|
int num_reqs,
|
|
|
|
char *rep_mask,
|
|
|
|
char *ev_mask)
|
2003-11-14 16:54:54 +01:00
|
|
|
{
|
|
|
|
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
|
2003-11-14 17:49:22 +01:00
|
|
|
LbxQueryExtension(ClientPtr client,
|
|
|
|
char *ename,
|
|
|
|
int nlen)
|
2003-11-14 16:54:54 +01:00
|
|
|
{
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2003-11-14 17:49:22 +01:00
|
|
|
void
|
|
|
|
LbxCloseDownExtensions(void)
|
2003-11-14 16:54:54 +01:00
|
|
|
{
|
2003-11-14 17:49:22 +01:00
|
|
|
int i,j;
|
2003-11-14 16:54:54 +01:00
|
|
|
|
|
|
|
for (i = 0; i < num_exts; i++) {
|
|
|
|
xfree(lbx_extensions[i]->name);
|
2003-11-14 17:49:22 +01:00
|
|
|
for (j = 0; j < lbx_extensions[i]->num_aliases; j++)
|
|
|
|
xfree(lbx_extensions[i]->aliases[j]);
|
2003-11-14 16:54:54 +01:00
|
|
|
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;
|
2003-11-14 17:49:22 +01:00
|
|
|
|
2003-11-14 16:54:54 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2003-11-14 17:49:22 +01:00
|
|
|
LbxSetReqMask(CARD8 *mask,
|
|
|
|
int req,
|
|
|
|
Bool on)
|
2003-11-14 16:54:54 +01:00
|
|
|
{
|
|
|
|
int mword = req / (8 * sizeof(CARD8));
|
|
|
|
|
|
|
|
req = req % (8 * sizeof(CARD8));
|
|
|
|
if (on) {
|
|
|
|
mask[mword] |= (1 << req);
|
|
|
|
} else {
|
|
|
|
mask[mword] &= ~(1 << req);
|
|
|
|
}
|
|
|
|
}
|