diff options
Diffstat (limited to 'nx-X11/programs/Xserver/lbx/lbxexts.c')
-rw-r--r-- | nx-X11/programs/Xserver/lbx/lbxexts.c | 275 |
1 files changed, 275 insertions, 0 deletions
diff --git a/nx-X11/programs/Xserver/lbx/lbxexts.c b/nx-X11/programs/Xserver/lbx/lbxexts.c new file mode 100644 index 000000000..1086b4bc5 --- /dev/null +++ b/nx-X11/programs/Xserver/lbx/lbxexts.c @@ -0,0 +1,275 @@ +/* $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); + } +} |