diff options
Diffstat (limited to 'app/xfs/difs/swapreq.c')
-rw-r--r-- | app/xfs/difs/swapreq.c | 297 |
1 files changed, 297 insertions, 0 deletions
diff --git a/app/xfs/difs/swapreq.c b/app/xfs/difs/swapreq.c new file mode 100644 index 000000000..f4741587a --- /dev/null +++ b/app/xfs/difs/swapreq.c @@ -0,0 +1,297 @@ +/* $Xorg: swapreq.c,v 1.4 2001/02/09 02:05:43 xorgcvs Exp $ */ +/* + * swapped requests + */ +/* + +Copyright 1990, 1991, 1998 The Open Group + +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. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + + * Copyright 1990, 1991 Network Computing Devices; + * Portions Copyright 1987 by Digital Equipment Corporation + * + * 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 names of Network Computing Devices, or Digital + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. + * + * NETWORK COMPUTING DEVICES, AND DIGITAL DISCLAIM ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL NETWORK COMPUTING DEVICES, + * OR DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF + * THIS SOFTWARE. + */ +/* $XFree86: xc/programs/xfs/difs/swapreq.c,v 1.6 2001/06/25 20:40:17 paulo Exp $ */ + +#include <swapreq.h> + +#include <X11/fonts/FSproto.h> +#include "clientstr.h" +#include "globals.h" +#include "dispatch.h" + +void +SwapLongs(long *list, unsigned long count) +{ + int n; + register char *longs = (char *)list; + + while (count >= 8) { + swapl(longs + 0, n); + swapl(longs + 4, n); + swapl(longs + 8, n); + swapl(longs + 12, n); + swapl(longs + 16, n); + swapl(longs + 20, n); + swapl(longs + 24, n); + swapl(longs + 28, n); + longs += 32; + count -= 8; + } + if (count != 0) { + do { + swapl(longs, n); + longs += 4; + } while (--count != 0); + } +} + +/* Byte swap a list of shorts */ + +void +SwapShorts(short *list, unsigned long count) +{ + register char *shorts = (char *)list; + register int n; + + while (count >= 16) { + swaps(shorts + 0, n); + swaps(shorts + 2, n); + swaps(shorts + 4, n); + swaps(shorts + 6, n); + swaps(shorts + 8, n); + swaps(shorts + 10, n); + swaps(shorts + 12, n); + swaps(shorts + 14, n); + swaps(shorts + 16, n); + swaps(shorts + 18, n); + swaps(shorts + 20, n); + swaps(shorts + 22, n); + swaps(shorts + 24, n); + swaps(shorts + 26, n); + swaps(shorts + 28, n); + swaps(shorts + 30, n); + shorts += 32; + count -= 16; + } + if (count != 0) { + do { + swaps(shorts, n); + shorts += 2; + } while (--count != 0); + } +} + +/* + * used for all requests that have nothing but 'length' swapped + */ +int +SProcSimpleRequest(ClientPtr client) +{ + REQUEST(fsReq); + stuff->length = lswaps(stuff->length); + return ((*ProcVector[stuff->reqType]) (client)); +} + +/* + * used for all requests that have nothing but 'length' & a resource id swapped + */ +int +SProcResourceRequest(ClientPtr client) +{ + REQUEST(fsResourceReq); + stuff->length = lswaps(stuff->length); + stuff->id = lswapl(stuff->id); + return ((*ProcVector[stuff->reqType]) (client)); +} + +static int +swap_auth(ClientPtr client, pointer data, int num, int length) +{ + unsigned char *p; + unsigned char t; + CARD16 namelen, + datalen; + int i; + + p = data; + for (i = 0; i < num; i++) { + if (p - (unsigned char *)data > length - 4) { + int lengthword = length; + + SendErrToClient(client, FSBadLength, (pointer)&lengthword); + return (FSBadLength); + } + namelen = *(CARD16 *) p; + t = p[0]; + p[0] = p[1]; + p[1] = t; + p += 2; + datalen = *(CARD16 *) p; + t = p[0]; + p[0] = p[1]; + p[1] = t; + p += 2; + p += (namelen + 3) & ~3; + p += (datalen + 3) & ~3; + } + if (!num) + p += 4; + if (p - (unsigned char *)data != length) { + int lengthword = length; + + SendErrToClient(client, FSBadLength, (pointer)&lengthword); + return (FSBadLength); + } + + return (FSSuccess); +} + +int +SProcCreateAC(ClientPtr client) +{ + int status; + + REQUEST(fsCreateACReq); + stuff->length = lswaps(stuff->length); + stuff->acid = lswapl(stuff->acid); + status = swap_auth(client, (pointer) &stuff[1], + stuff->num_auths, stuff->length); + if (status != FSSuccess) + return (status); + return ((*ProcVector[stuff->reqType]) (client)); +} + +int +SProcSetResolution(ClientPtr client) +{ + REQUEST(fsSetResolutionReq); + stuff->length = lswaps(stuff->length); + stuff->num_resolutions = lswaps(stuff->num_resolutions); + if ((int)stuff->length - (&stuff[1] - &stuff[0]) != + stuff->num_resolutions * sizeof(fsResolution)) + return (FSBadLength); + SwapShorts((short *) &stuff[1], stuff->num_resolutions); + + return ((*ProcVector[stuff->reqType]) (client)); +} + + +int +SProcQueryExtension(ClientPtr client) +{ + REQUEST(fsQueryExtensionReq); + stuff->length = lswaps(stuff->length); + return ((*ProcVector[FS_QueryExtension]) (client)); +} + +int +SProcListCatalogues(ClientPtr client) +{ + REQUEST(fsListCataloguesReq); + stuff->length = lswaps(stuff->length); + stuff->maxNames = lswapl(stuff->maxNames); + stuff->nbytes = lswaps(stuff->nbytes); + return ((*ProcVector[FS_ListCatalogues]) (client)); +} + +int +SProcListFonts(ClientPtr client) +{ + REQUEST(fsListFontsReq); + stuff->length = lswaps(stuff->length); + stuff->maxNames = lswapl(stuff->maxNames); + stuff->nbytes = lswaps(stuff->nbytes); + return ((*ProcVector[FS_ListFonts]) (client)); +} + +int +SProcListFontsWithXInfo(ClientPtr client) +{ + REQUEST(fsListFontsWithXInfoReq); + stuff->length = lswaps(stuff->length); + stuff->maxNames = lswapl(stuff->maxNames); + stuff->nbytes = lswaps(stuff->nbytes); + return ((*ProcVector[FS_ListFontsWithXInfo]) (client)); +} + +int +SProcOpenBitmapFont(ClientPtr client) +{ + REQUEST(fsOpenBitmapFontReq); + stuff->length = lswaps(stuff->length); + stuff->fid = lswapl(stuff->fid); + stuff->format_hint = lswapl(stuff->format_hint); + stuff->format_mask = lswapl(stuff->format_mask); + return ((*ProcVector[FS_OpenBitmapFont]) (client)); +} + +int +SProcQueryXExtents(ClientPtr client) +{ + REQUEST(fsQueryXExtents8Req); /* 8 and 16 are the same here */ + stuff->length = lswaps(stuff->length); + stuff->fid = lswapl(stuff->fid); + stuff->num_ranges = lswapl(stuff->num_ranges); + + return ((*ProcVector[stuff->reqType]) (client)); +} + +int +SProcQueryXBitmaps(ClientPtr client) +{ + REQUEST(fsQueryXBitmaps8Req); /* 8 and 16 are the same here */ + stuff->length = lswaps(stuff->length); + stuff->fid = lswapl(stuff->fid); + stuff->format = lswapl(stuff->format); + stuff->num_ranges = lswapl(stuff->num_ranges); + + return ((*ProcVector[stuff->reqType]) (client)); +} + +int +SwapConnClientPrefix(ClientPtr client, fsConnClientPrefix *pCCP) +{ + REQUEST(fsFakeReq); + + pCCP->major_version = lswaps(pCCP->major_version); + pCCP->minor_version = lswaps(pCCP->minor_version); + pCCP->auth_len = lswaps(pCCP->auth_len); + return (swap_auth(client, (pointer) &pCCP[1], + pCCP->num_auths, stuff->length)); +} |