diff options
author | Kaleb Keithley <kaleb@freedesktop.org> | 2003-11-14 15:54:36 +0000 |
---|---|---|
committer | Kaleb Keithley <kaleb@freedesktop.org> | 2003-11-14 15:54:36 +0000 |
commit | 9e8dd4f7585c334c5b08f05f01c8900b5e4edf52 (patch) | |
tree | 08494132be3630db3c4360520a23391e40b275c9 |
R6.6 is the Xorg base-lineXORG-MAINXORG-STABLE
-rw-r--r-- | include/X11/fonts/FSlib.h | 256 | ||||
-rw-r--r-- | src/FSClServ.c | 91 | ||||
-rw-r--r-- | src/FSCloseFt.c | 67 | ||||
-rw-r--r-- | src/FSConnServ.c | 240 | ||||
-rw-r--r-- | src/FSErrDis.c | 118 | ||||
-rw-r--r-- | src/FSErrHndlr.c | 87 | ||||
-rw-r--r-- | src/FSFlush.c | 60 | ||||
-rw-r--r-- | src/FSFontInfo.c | 327 | ||||
-rw-r--r-- | src/FSFtNames.c | 123 | ||||
-rw-r--r-- | src/FSGetCats.c | 106 | ||||
-rw-r--r-- | src/FSListCats.c | 124 | ||||
-rw-r--r-- | src/FSListExt.c | 116 | ||||
-rw-r--r-- | src/FSMisc.c | 61 | ||||
-rw-r--r-- | src/FSNextEv.c | 76 | ||||
-rw-r--r-- | src/FSOpenFont.c | 89 | ||||
-rw-r--r-- | src/FSOpenServ.c | 280 | ||||
-rw-r--r-- | src/FSQGlyphs.c | 186 | ||||
-rw-r--r-- | src/FSQXExt.c | 164 | ||||
-rw-r--r-- | src/FSQXInfo.c | 122 | ||||
-rw-r--r-- | src/FSQuExt.c | 79 | ||||
-rw-r--r-- | src/FSServName.c | 74 | ||||
-rw-r--r-- | src/FSSetCats.c | 90 | ||||
-rw-r--r-- | src/FSSync.c | 78 | ||||
-rw-r--r-- | src/FSSynchro.c | 90 | ||||
-rw-r--r-- | src/FSlibInt.c | 1322 | ||||
-rw-r--r-- | src/FSlibint.h | 382 | ||||
-rw-r--r-- | src/FSlibos.h | 317 |
27 files changed, 5125 insertions, 0 deletions
diff --git a/include/X11/fonts/FSlib.h b/include/X11/fonts/FSlib.h new file mode 100644 index 0000000..7cf9c4e --- /dev/null +++ b/include/X11/fonts/FSlib.h @@ -0,0 +1,256 @@ +/* $Xorg: FSlib.h,v 1.5 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 1994, 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. + +*/ + +/* + * Font server C interface library + */ + +#ifndef _FSLIB_H_ +#define _FSLIB_H_ + +#include <X11/fonts/FS.h> + +#define Bool int +#define Status int +#define True 1 +#define False 0 + +#define QueuedAlready 0 +#define QueuedAfterReading 1 +#define QueuedAfterFlush 2 + +#define FSServerString(svr) ((svr)->server_name) +#define FSVendorRelease(svr) ((svr)->release) +#define FSProtocolVersion(svr) ((svr)->proto_version) +#define FSServerVendor(svr) ((svr)->vendor) +#define FSAuthorizationData(svr) ((svr)->auth_data) +#define FSAlternateServers(svr) ((svr)->alternate_servers) +#define FSNumAlternateServers(svr) ((svr)->num_alternates) +#define FSQLength(svr) ((svr)->qlen) +#define FSNextRequest(svr) ((svr)->request + 1) +#define FSLastKnownRequestProcessed(svr) ((svr)->last_request_read) + +#define FSAllocID(svr) ((*(svr)->resource_alloc)((svr))) + +typedef struct _alternate { + Bool subset; + char *name; +} AlternateServer; + +/* extension stuff */ +typedef struct _FSExtData { + int number; /* number returned by FSRegisterExtension */ + struct _FSExtData *next; /* next item on list of data for structure */ + int (*free_private) (); /* called to free private storage */ + char *private_data; /* data private to this extension. */ +} FSExtData; + + +typedef struct { /* public to extension, cannot be changed */ + int extension; /* extension number */ + int major_opcode; /* major op-code assigned by server */ + int first_event; /* first event number for the extension */ + int first_error; /* first error number for the extension */ +} FSExtCodes; + +typedef struct _FSExtent { + struct _FSExtent *next; /* next in list */ + FSExtCodes codes; /* public information, all extension told */ + int (*close_server) (); /* routine to call when connection + * closed */ + int (*error) (); /* who to call when an error occurs */ + int (*error_string) (); /* routine to supply error string */ + char *name; +} _FSExtension; + + +/* server data structure */ +typedef struct _FSServer { + struct _FSServer *next; + int fd; + int proto_version; + char *vendor; + int byte_order; + int vnumber; + int release; + int resource_id; + struct _FSQEvent *head, + *tail; + int qlen; + unsigned long last_request_read; + unsigned long request; + char *last_req; + char *buffer; + char *bufptr; + char *bufmax; + unsigned max_request_size; + char *server_name; + char *auth_data; + AlternateServer *alternate_servers; + int num_alternates; + FSExtData *ext_data; + _FSExtension *ext_procs; + int ext_number; + Bool (*event_vec[132]) (); + Status(*wire_vec[132]) (); + char *scratch_buffer; + unsigned long scratch_length; + int (*synchandler) (); + unsigned long flags; + struct _XtransConnInfo *trans_conn; /* transport connection object */ +} FSServer; + +typedef struct { + int type; + unsigned long serial; + Bool send_event; + FSServer *server; +} FSAnyEvent; + +typedef struct { + int type; + FSServer *server; + FSID resourceid; + unsigned long serial; + unsigned char error_code; + unsigned char request_code; + unsigned char minor_code; +} FSErrorEvent; + +typedef union _FSEvent { + int type; + FSAnyEvent fsany; +} FSEvent; + +typedef struct _FSQEvent { + struct _FSQEvent *next; + FSEvent event; +} _FSQEvent; + + +/* protocol-related stuctures */ + +typedef unsigned long FSBitmapFormat; +typedef unsigned long FSBitmapFormatMask; + +typedef struct _FSChar2b { + unsigned char high; + unsigned char low; +} FSChar2b; + +typedef struct _FSRange { + FSChar2b min_char; + FSChar2b max_char; +} FSRange; + +typedef struct _FSOffset { + unsigned int position; + unsigned int length; +} FSOffset; + +/* use names as in xCharInfo? */ +typedef struct _FSXCharInfo { + short left; + short right; + short width; + short ascent; + short descent; + unsigned short attributes; +} FSXCharInfo; + +typedef struct _FSPropOffset { + FSOffset name; + FSOffset value; + unsigned char type; +} FSPropOffset; + +typedef struct _FSPropInfo { + unsigned int num_offsets; + unsigned int data_len; +} FSPropInfo; + +/* should names match FontInfoRec? */ +typedef struct _FSXFontInfoHeader { + int flags; + FSRange char_range; + unsigned draw_direction; + FSChar2b default_char; + FSXCharInfo min_bounds; + FSXCharInfo max_bounds; + short font_ascent; + short font_descent; +} FSXFontInfoHeader; + + +/* function decls */ + +FSServer *FSOpenServer(); + +extern int (*FSSynchronize()) (); +extern int (*FSSetAfterFunction()) (); + +char *FSServerName(); +char **FSListExtensions(); +Bool FSQueryExtension(); + +char **FSListCatalogues(); +char **FSGetCatalogues(); + +long FSMaxRequestSize(); + +char **FSListFonts(); +char **FSListFontsWithXInfo(); + +Font FSOpenBitmapFont(); + +#endif /* _FSLIB_H_ */ diff --git a/src/FSClServ.c b/src/FSClServ.c new file mode 100644 index 0000000..f7cc8ad --- /dev/null +++ b/src/FSClServ.c @@ -0,0 +1,91 @@ +/* $Xorg: FSClServ.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* @(#)FSClServ.c 4.1 91/05/02 + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 1994, 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. + +*/ + +#include "FSlibint.h" + +extern FSServer *_FSHeadOfServerList; + +int +FSCloseServer(svr) + FSServer *svr; +{ + _FSExtension *ext; + FSServer **sv = &_FSHeadOfServerList; + FSServer *s = _FSHeadOfServerList; + extern void _FSFreeQ(); + extern void _FSDisconnectServer(); + extern int FSSync(); + + svr->flags |= FSlibServerClosing; + (void) FSSync(svr, 1); /* throw out pending events */ + ext = svr->ext_procs; + while (ext) { + if (ext->close_server != NULL) + (*ext->close_server) (svr, &ext->codes); + ext = ext->next; + } + _FSDisconnectServer(svr->trans_conn); + while (s != NULL) { + if (s == svr) { + *sv = s->next; + _FSFreeServerStructure(svr); + break; + } + sv = &(s->next); + s = *sv; + } + if (_FSHeadOfServerList == NULL) { + _FSFreeQ(); + } + return 1; +} diff --git a/src/FSCloseFt.c b/src/FSCloseFt.c new file mode 100644 index 0000000..ba5e67c --- /dev/null +++ b/src/FSCloseFt.c @@ -0,0 +1,67 @@ +/* $Xorg: FSCloseFt.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* @(#)FSCloseFt.c 4.1 91/05/02 + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 1994, 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. + +*/ + +#include "FSlibint.h" + + +int +FSCloseFont(svr, fid) + FSServer *svr; + Font fid; +{ + fsResourceReq *req; + + GetResReq(CloseFont, fid, req); + SyncHandle(); + return 1; +} diff --git a/src/FSConnServ.c b/src/FSConnServ.c new file mode 100644 index 0000000..5def4c3 --- /dev/null +++ b/src/FSConnServ.c @@ -0,0 +1,240 @@ +/* $Xorg: FSConnServ.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 1994, 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. + +*/ + +#include <stdio.h> +#include "FSlibint.h" +#include "X11/Xpoll.h" +#ifdef NCD +#include <fcntl.h> +#endif +#ifdef WIN32 +#define ECHECK(err) (WSAGetLastError() == err) +#else +#define ECHECK(err) (errno == err) +#endif + +/* + * Attempts to connect to server, given server name. Returns transport + * connection object or NULL if connection fails. + */ + +#define FS_CONNECTION_RETRIES 5 + +XtransConnInfo +_FSConnectServer(server_name) + char *server_name; +{ + XtransConnInfo trans_conn; /* transport connection object */ + int retry, connect_stat; + int madeConnection = 0; + + /* + * Open the network connection. + */ + + for (retry = FS_CONNECTION_RETRIES; retry >= 0; retry--) + { + if ((trans_conn = _FSTransOpenCOTSClient(server_name)) == NULL) + { + break; + } + + if ((connect_stat = _FSTransConnect(trans_conn,server_name)) < 0) + { + _FSTransClose(trans_conn); + + if (connect_stat == TRANS_TRY_CONNECT_AGAIN) + { + sleep(1); + continue; + } + else + break; + } + else + { + madeConnection = 1; + break; + } + } + + if (!madeConnection) + return (NULL); + + + /* + * set it non-blocking. This is so we can read data when blocked for + * writing in the library. + */ + + _FSTransSetOption(trans_conn, TRANS_NONBLOCKING, 1); + + return (trans_conn); +} + +/* + * Disconnect from server. + */ + +void +_FSDisconnectServer(trans_conn) + XtransConnInfo trans_conn; + +{ + (void) _FSTransClose(trans_conn); +} + +#undef NULL +#define NULL ((char *) 0) +/* + * This is an OS dependent routine which: + * 1) returns as soon as the connection can be written on.... + * 2) if the connection can be read, must enqueue events and handle errors, + * until the connection is writable. + */ +void _FSWaitForWritable(svr) + FSServer *svr; +{ + fd_set r_mask; + fd_set w_mask; + int nfound; + + FD_ZERO(&r_mask); + FD_ZERO(&w_mask); + + while (1) { + FD_SET(svr->fd, &r_mask); + FD_SET(svr->fd, &w_mask); + + do { + nfound = Select(svr->fd + 1, &r_mask, &w_mask, NULL, NULL); + if (nfound < 0 && !ECHECK(EINTR)) + (*_FSIOErrorFunction) (svr); + } while (nfound <= 0); + + if (XFD_ANYSET(&r_mask)) { + char buf[BUFSIZE]; + BytesReadable_t pend_not_register; + register BytesReadable_t pend; + register fsEvent *ev; + + /* find out how much data can be read */ + if (_FSTransBytesReadable(svr->trans_conn, &pend_not_register) < 0) + (*_FSIOErrorFunction) (svr); + pend = pend_not_register; + + /* + * must read at least one fsEvent; if none is pending, then we'll + * just block waiting for it + */ + if (pend < SIZEOF(fsEvent)) + pend = SIZEOF(fsEvent); + + /* but we won't read more than the max buffer size */ + if (pend > BUFSIZE) + pend = BUFSIZE; + + /* round down to an integral number of FSReps */ + pend = (pend / SIZEOF(fsEvent)) * SIZEOF(fsEvent); + + _FSRead(svr, buf, pend); + + /* no space between comma and type or else macro will die */ + STARTITERATE(ev, fsEvent, buf, (pend > 0), + (pend -= SIZEOF(fsEvent))) { + if (ev->type == FS_Error) + _FSError(svr, (fsError *) ev); + else /* it's an event packet; enqueue it */ + _FSEnq(svr, ev); + } + ENDITERATE + } + if (XFD_ANYSET(&w_mask)) + return; + } +} + + +void _FSWaitForReadable(svr) + FSServer *svr; +{ + fd_set r_mask; + int result; + + FD_ZERO(&r_mask); + do { + FD_SET(svr->fd, &r_mask); + result = Select(svr->fd + 1, &r_mask, NULL, NULL, NULL); + if (result == -1 && !ECHECK(EINTR)) + (*_FSIOErrorFunction) (svr); + } while (result <= 0); +} + +void _FSSendClientPrefix(svr, client) + FSServer *svr; + fsConnClientPrefix *client; +{ + struct iovec iovarray[5], + *iov = iovarray; + int niov = 0; + +#define add_to_iov(b,l) \ + { iov->iov_base = (b); iov->iov_len = (l); iov++, niov++; } + + add_to_iov((caddr_t) client, SIZEOF(fsConnClientPrefix)); + +#undef add_to_iov + + (void) _FSTransWritev(svr->trans_conn, iovarray, niov); + return; +} diff --git a/src/FSErrDis.c b/src/FSErrDis.c new file mode 100644 index 0000000..3138128 --- /dev/null +++ b/src/FSErrDis.c @@ -0,0 +1,118 @@ +/* $Xorg: FSErrDis.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* @(#)FSErrDis.c 4.1 91/05/02 + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 1994, 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. + +*/ + +#include <stdio.h> +#include "FSlibint.h" +#include <X11/Xos.h> + +char *FSErrorList[] = { + /* FSBadRequest */ "BadRequest, invalid request code or no such operation", + /* FSBadFormat */ "BadFormat, bad font format mask", + /* FSBadFont */ "BadFont, invalid Font parameter", + /* FSBadRange */ "BadRange, invalid character range attributes", + /* FSBadEventMask */ "BadEventMask, illegal event mask", + /* FSBadAccessContext */ "BadAccessContext, insufficient permissions for operation", + /* FSBadIDChoice */ "BadIDChoice, invalid resource ID chosen for this connection", + /* FSBadName */ "BadName, named font does not exist", + /* FSBadResolution */ "BadResolution, improperly formatted resolution", + /* FSBadAlloc */ "BadAlloc, insufficient resources for operation", + /* FSBadLength */ "BadLength, request too large or internal FSlib length error", + /* FSBadImplementation */ "BadImplementation, request unsupported", +}; +int FSErrorListSize = sizeof(FSErrorList); + + +/* ARGSUSED */ +int FSGetErrorDatabaseText(svr, name, type, defaultp, buffer, nbytes) + register char *name, + *type; + char *defaultp; + FSServer *svr; + char *buffer; + int nbytes; +{ + if (nbytes == 0) + return 0; + (void) strncpy(buffer, (char *) defaultp, nbytes); + if ((strlen(defaultp) + 1) > nbytes) + buffer[nbytes - 1] = '\0'; + return 1; +} + +int FSGetErrorText(svr, code, buffer, nbytes) + register int code; + register FSServer *svr; + char *buffer; + int nbytes; +{ + + char *defaultp = NULL; + char buf[32]; + register _FSExtension *ext; + + if (nbytes == 0) + return 0; + sprintf(buf, "%d", code); + if (code <= (FSErrorListSize / sizeof(char *)) && code > 0) { + defaultp = FSErrorList[code]; + FSGetErrorDatabaseText(svr, "FSProtoError", buf, defaultp, buffer, nbytes); + } + ext = svr->ext_procs; + while (ext) { /* call out to any extensions interested */ + if (ext->error_string != NULL) + (*ext->error_string) (svr, code, &ext->codes, buffer, nbytes); + ext = ext->next; + } + return 1; +} + diff --git a/src/FSErrHndlr.c b/src/FSErrHndlr.c new file mode 100644 index 0000000..129605b --- /dev/null +++ b/src/FSErrHndlr.c @@ -0,0 +1,87 @@ +/* $Xorg: FSErrHndlr.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* @(#)FSErrHndlr.c 4.1 91/05/02 + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 1994, 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. + +*/ + +#include "FSlibint.h" + +extern int _FSDefaultError(); +extern int _FSDefaultIOError(); + +int (* + FSSetErrorHandler(handler)) () + int (*handler) (); +{ + int (*oldhandler) () = _FSErrorFunction; + + if (handler != NULL) { + _FSErrorFunction = handler; + } else { + _FSErrorFunction = _FSDefaultError; + } + return oldhandler; +} + +extern int _FSIOError(); + +int (* + FSSetIOErrorHandler(handler)) () + int (*handler) (); +{ + int (*oldhandler) () = _FSIOErrorFunction; + + if (handler != NULL) { + _FSIOErrorFunction = handler; + } else { + _FSIOErrorFunction = _FSDefaultIOError; + } + return oldhandler; +} diff --git a/src/FSFlush.c b/src/FSFlush.c new file mode 100644 index 0000000..caa3d17 --- /dev/null +++ b/src/FSFlush.c @@ -0,0 +1,60 @@ +/* $Xorg: FSFlush.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* @(#)FSFlush.c 4.1 91/05/02 + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 1994, 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. + +*/ +#include "FSlibint.h" + +int FSFlush(svr) + FSServer *svr; +{ + _FSFlush(svr); + return 1; +} diff --git a/src/FSFontInfo.c b/src/FSFontInfo.c new file mode 100644 index 0000000..8ed2c96 --- /dev/null +++ b/src/FSFontInfo.c @@ -0,0 +1,327 @@ +/* $Xorg: FSFontInfo.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ +/* + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 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. + +*/ +#include "FSlibint.h" + +char ** +FSListFontsWithXInfo(svr, pattern, maxNames, count, info, pprops, offsets, prop_data) + FSServer *svr; + char *pattern; + int maxNames; + int *count; + FSXFontInfoHeader ***info; + FSPropInfo ***pprops; + FSPropOffset ***offsets; + unsigned char ***prop_data; +{ + long nbytes; + int i, + j; + int size = 0; + FSXFontInfoHeader **fhdr = (FSXFontInfoHeader **) 0; + FSPropInfo **pi = (FSPropInfo **) 0; + FSPropOffset **po = (FSPropOffset **) 0; + unsigned char **pd = (unsigned char **) 0; + char **flist = NULL; + fsListFontsWithXInfoReply reply; + fsListFontsWithXInfoReq *req; + fsPropInfo local_pi; + fsPropOffset local_po; + Status status; + + GetReq(ListFontsWithXInfo, req); + req->maxNames = maxNames; + nbytes = req->nbytes = pattern ? strlen(pattern) : 0; + req->length += (nbytes + 3) >> 2; + _FSSend(svr, pattern, nbytes); + + for (i = 0;; i++) { + if (FSProtocolVersion(svr) > 1) + { + status = _FSReply(svr, (fsReply *) &reply, 0, fsFalse); + if (status != 0 && reply.nameLength == 0) /* got last reply */ + break; + if (status) + _FSRead(svr, ((char *) &reply) + SIZEOF(fsGenericReply), + SIZEOF(fsListFontsWithXInfoReply) - + SIZEOF(fsGenericReply)); + } else { + status = _FSReply(svr, (fsReply *) & reply, + ((SIZEOF(fsListFontsWithXInfoReply) - + SIZEOF(fsGenericReply)) >> 2), fsFalse); + } + if (!status) { + for (j = (i - 1); j >= 0; j--) { + FSfree((char *) fhdr[j]); + FSfree((char *) pi[j]); + FSfree((char *) po[j]); + FSfree((char *) pd[j]); + FSfree(flist[j]); + } + if (flist) + FSfree((char *) flist); + if (fhdr) + FSfree((char *) fhdr); + if (pi) + FSfree((char *) pi); + if (po) + FSfree((char *) po); + if (pd) + FSfree((char *) pd); + + SyncHandle(); + return (char **) NULL; + } + if (reply.nameLength == 0) /* got last reply in version 1 */ + break; + if ((i + reply.nReplies) >= size) { + size = i + reply.nReplies + 1; + + if (fhdr) { + FSXFontInfoHeader **tmp_fhdr = (FSXFontInfoHeader **) + FSrealloc((char *) fhdr, + (unsigned) (sizeof(FSXFontInfoHeader *) * size)); + char **tmp_flist = (char **) FSrealloc((char *) flist, + (unsigned) (sizeof(char *) * size)); + FSPropInfo **tmp_pi = (FSPropInfo **) + FSrealloc((char *) pi, + (unsigned) (sizeof(FSPropInfo *) * size)); + FSPropOffset **tmp_po = (FSPropOffset **) + FSrealloc((char *) po, + (unsigned) (sizeof(FSPropOffset *) * size)); + unsigned char **tmp_pd = (unsigned char **) + FSrealloc((char *) pd, + (unsigned) (sizeof(unsigned char *) * size)); + + if (!tmp_fhdr || !tmp_flist || !tmp_pi || !tmp_po || !tmp_pd) { + for (j = (i - 1); j >= 0; j--) { + FSfree((char *) flist[j]); + FSfree((char *) fhdr[j]); + FSfree((char *) pi[j]); + FSfree((char *) po[j]); + FSfree((char *) pd[j]); + } + if (tmp_flist) + FSfree((char *) tmp_flist); + else + FSfree((char *) flist); + if (tmp_fhdr) + FSfree((char *) tmp_fhdr); + else + FSfree((char *) fhdr); + if (tmp_pi) + FSfree((char *) tmp_pi); + else + FSfree((char *) pi); + if (tmp_po) + FSfree((char *) tmp_po); + else + FSfree((char *) po); + if (tmp_pd) + FSfree((char *) tmp_pd); + else + FSfree((char *) pd); + goto clearwire; + } + fhdr = tmp_fhdr; + flist = tmp_flist; + pi = tmp_pi; + po = tmp_po; + pd = tmp_pd; + } else { + if (!(fhdr = (FSXFontInfoHeader **) + FSmalloc((unsigned) (sizeof(FSXFontInfoHeader *) * size)))) + goto clearwire; + if (!(flist = (char **) + FSmalloc((unsigned) (sizeof(char *) * size)))) { + FSfree((char *) fhdr); + goto clearwire; + } + if (!(pi = (FSPropInfo **) + FSmalloc((unsigned) (sizeof(FSPropInfo *) * size)))) { + FSfree((char *) fhdr); + FSfree((char *) flist); + goto clearwire; + } + if (!(po = (FSPropOffset **) + FSmalloc((unsigned) (sizeof(FSPropOffset *) * size)))) { + FSfree((char *) fhdr); + FSfree((char *) flist); + FSfree((char *) pi); + goto clearwire; + } + if (!(pd = (unsigned char **) + FSmalloc((unsigned) (sizeof(unsigned char *) * size)))) { + FSfree((char *) fhdr); + FSfree((char *) flist); + FSfree((char *) pi); + FSfree((char *) po); + goto clearwire; + } + } + } + fhdr[i] = (FSXFontInfoHeader *) FSmalloc(sizeof(FSXFontInfoHeader)); + if (!fhdr[i]) { + goto badmem; + } + FSUnpack_XFontInfoHeader(&reply, fhdr[i], FSProtocolVersion(svr)); + + /* alloc space for the name */ + flist[i] = (char *) FSmalloc((unsigned int) (reply.nameLength + 1)); + if (FSProtocolVersion(svr) == 1) + { + /* get the name */ + if (!flist[i]) { + nbytes = (reply.nameLength + 3) & ~3; + _FSEatData(svr, (unsigned long) nbytes); + goto badmem; + } + _FSReadPad(svr, flist[i], (long) reply.nameLength); + flist[i][reply.nameLength] = '\0'; + } + + pi[i] = (FSPropInfo *) FSmalloc(sizeof(FSPropInfo)); + if (!pi[i]) { + FSfree((char *) fhdr[i]); + goto badmem; + } + _FSReadPad(svr, (char *) &local_pi, SIZEOF(fsPropInfo)); + pi[i]->num_offsets = local_pi.num_offsets; + pi[i]->data_len = local_pi.data_len; + + po[i] = (FSPropOffset *) + FSmalloc(pi[i]->num_offsets * sizeof(FSPropOffset)); + if (!po[i]) { + FSfree((char *) fhdr[i]); + FSfree((char *) pi[i]); + goto badmem; + } + pd[i] = (unsigned char *) FSmalloc(pi[i]->data_len); + if (!pd[i]) { + FSfree((char *) fhdr[i]); + FSfree((char *) pi[i]); + FSfree((char *) po[i]); + goto badmem; + } + /* get offsets */ + for (j=0; j<pi[i]->num_offsets; j++) + { + _FSReadPad(svr, (char *) &local_po, SIZEOF(fsPropOffset)); + po[i][j].name.position = local_po.name.position; + po[i][j].name.length = local_po.name.length; + po[i][j].value.position = local_po.value.position; + po[i][j].value.length = local_po.value.length; + po[i][j].type = local_po.type; + } + + /* get prop data */ + if (FSProtocolVersion(svr) == 1) + _FSReadPad(svr, (char *) pd[i], pi[i]->data_len); + else + _FSRead(svr, (char *) pd[i], pi[i]->data_len); + + if (FSProtocolVersion(svr) != 1) + { + /* get the name */ + if (!flist[i]) { + nbytes = (reply.nameLength + 3) & ~3; + _FSEatData(svr, (unsigned long) nbytes); + goto badmem; + } + _FSRead(svr, flist[i], (long) reply.nameLength); + flist[i][reply.nameLength] = '\0'; + + nbytes = pi[i]->data_len + reply.nameLength; + _FSEatData(svr, (unsigned long) (((nbytes+3)&~3) - nbytes)); + } + } + *info = fhdr; + *count = i; + *pprops = pi; + *offsets = po; + *prop_data = pd; + SyncHandle(); + return flist; + +badmem: + for (j = (i - 1); j >= 0; j--) { + FSfree((char *) pi[j]); + FSfree((char *) po[j]); + FSfree((char *) pd[j]); + FSfree(flist[j]); + FSfree((char *) fhdr[j]); + } + if (flist) + FSfree((char *) flist); + if (fhdr) + FSfree((char *) fhdr); + if (pi) + FSfree((char *) pi); + if (po) + FSfree((char *) po); + if (pd) + FSfree((char *) pd); + + +clearwire: + do { + fsPropInfo ti; + + _FSEatData(svr, (reply.nameLength + 3) & ~3); + _FSReadPad(svr, (char *) &ti, SIZEOF(fsPropInfo)); + _FSEatData(svr, (SIZEOF(fsPropOffset) * ti.num_offsets)); + _FSEatData(svr, ti.data_len); + } while (_FSReply(svr, (fsReply *) & reply, + ((SIZEOF(fsListFontsWithXInfoReply) + - SIZEOF(fsGenericReply)) >> 2), fsFalse) && (reply.nameLength != 0)); + SyncHandle(); + return (char **) NULL; +} diff --git a/src/FSFtNames.c b/src/FSFtNames.c new file mode 100644 index 0000000..9a9025a --- /dev/null +++ b/src/FSFtNames.c @@ -0,0 +1,123 @@ +/* $Xorg: FSFtNames.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 1994, 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. + +*/ + +#include "FSlibint.h" + +char ** +FSListFonts(svr, pattern, maxNames, actualCount) + FSServer *svr; + char *pattern; + int maxNames; + int *actualCount; +{ + long nbytes; + int i, + length; + char **flist; + char *c; + fsListFontsReply rep; + fsListFontsReq *req; + long rlen; + + GetReq(ListFonts, req); + req->maxNames = maxNames; + nbytes = req->nbytes = pattern ? strlen(pattern) : 0; + req->length += (nbytes + 3) >> 2; + _FSSend(svr, pattern, nbytes); + if (!_FSReply(svr, (fsReply *) & rep, + (SIZEOF(fsListFontsReply) - SIZEOF(fsGenericReply)) >> 2, fsFalse)) + return (char **) 0; + + if (rep.nFonts) { + flist = (char **) FSmalloc((unsigned) rep.nFonts * sizeof(char *)); + rlen = (rep.length << 2) - SIZEOF(fsListFontsReply); + c = (char *) FSmalloc((unsigned) (rlen + 1)); + + if ((!flist) || (!c)) { + if (flist) + FSfree((char *) flist); + if (c) + FSfree(c); + _FSEatData(svr, (unsigned long) rlen); + SyncHandle(); + return (char **) NULL; + } + _FSReadPad(svr, c, rlen); + /* unpack */ + length = *(unsigned char *)c; + for (i = 0; i < rep.nFonts; i++) { + flist[i] = c + 1; + c += length + 1; + length = *(unsigned char *)c; + *c = '\0'; + } + } else { + + flist = (char **) NULL; + } + + *actualCount = rep.nFonts; + SyncHandle(); + return flist; + +} + +int FSFreeFontNames(list) + char **list; +{ + if (list) { + FSfree(list[0] - 1); + FSfree((char *) list); + } + return 1; +} diff --git a/src/FSGetCats.c b/src/FSGetCats.c new file mode 100644 index 0000000..87f2fcf --- /dev/null +++ b/src/FSGetCats.c @@ -0,0 +1,106 @@ +/* $Xorg: FSGetCats.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 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. + +*/ + +#include "FSlibint.h" + +char ** +FSGetCatalogues(svr, num) + FSServer *svr; + int *num; +{ + fsGetCataloguesReply rep; + char **list; + char *c; + int i, + length; + fsReq *req; + long rlen; + + GetEmptyReq(GetCatalogues, req); + + if (!_FSReply(svr, (fsReply *) & rep, 0, fsFalse)) { + SyncHandle(); + return (char **) NULL; + } + if (rep.num_catalogues) { + list = (char **) + FSmalloc((unsigned) (rep.num_catalogues * sizeof(char *))); + rlen = (rep.length << 2) - SIZEOF(fsGetCataloguesReply); + c = (char *) FSmalloc((unsigned) rlen + 1); + if ((!list) || (!c)) { + if (list) + FSfree((char *) list); + if (c) + FSfree(c); + _FSEatData(svr, (unsigned long) rlen); + SyncHandle(); + return (char **) NULL; + } + _FSReadPad(svr, c, rlen); + /* + * unpack the strings + */ + length = *c; + for (i = 0; i < (int)rep.num_catalogues; i++) { + list[i] = c + 1; /* skip length */ + c += length + 1; /* find next length */ + length = *c; + *c = '\0'; /* change length to NULL */ + } + } else { + list = (char **) NULL; + } + SyncHandle(); + *num = rep.num_catalogues; + return list; +} diff --git a/src/FSListCats.c b/src/FSListCats.c new file mode 100644 index 0000000..eb4152a --- /dev/null +++ b/src/FSListCats.c @@ -0,0 +1,124 @@ +/* $Xorg: FSListCats.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 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. + +*/ + +#include "FSlibint.h" + +char ** +FSListCatalogues(svr, pattern, maxNames, actualCount) + FSServer *svr; + char *pattern; + int maxNames; + int *actualCount; +{ + long nbytes; + int i, + length; + char **clist; + char *c; + fsListCataloguesReply rep; + fsListCataloguesReq *req; + long rlen; + + GetReq(ListCatalogues, req); + req->maxNames = maxNames; + nbytes = req->nbytes = pattern ? strlen(pattern) : 0; + req->length += (nbytes + 3) >> 2; + _FSSend(svr, pattern, nbytes); + if (!_FSReply(svr, (fsReply *) & rep, + (SIZEOF(fsListCataloguesReply) - SIZEOF(fsGenericReply)) >> 2, fsFalse)) + return (char **) 0; + + if (rep.num_catalogues) { + clist = (char **) + FSmalloc((unsigned) rep.num_catalogues * sizeof(char *)); + rlen = (rep.length << 2) - SIZEOF(fsListCataloguesReply); + c = (char *) FSmalloc((unsigned) (rlen + 1)); + + if ((!clist) || (!c)) { + if (clist) + FSfree((char *) clist); + if (c) + FSfree(c); + _FSEatData(svr, (unsigned long) rlen); + SyncHandle(); + return (char **) NULL; + } + _FSReadPad(svr, c, rlen); + /* unpack */ + length = *c; + for (i = 0; i < rep.num_catalogues; i++) { + clist[i] = c + 1; + c += length + 1; + length = *c; + *c = '\0'; + } + } else { + + clist = (char **) NULL; + } + + *actualCount = rep.num_catalogues; + SyncHandle(); + return clist; + +} + +int FSFreeCatalogues(list) + char **list; +{ + if (list) { + FSfree(list[0] - 1); + FSfree((char *) list); + } + return 1; +} diff --git a/src/FSListExt.c b/src/FSListExt.c new file mode 100644 index 0000000..fb874a3 --- /dev/null +++ b/src/FSListExt.c @@ -0,0 +1,116 @@ +/* $Xorg: FSListExt.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* @(#)FSListExt.c 4.1 91/05/02 + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 1994, 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. + +*/ + +#include "FSlibint.h" + +char ** +FSListExtensions(svr, next) + FSServer *svr; + int *next; +{ + fsListExtensionsReply rep; + char **list; + char *c; + int i, + length; + fsReq *req; + long rlen; + + GetEmptyReq(ListExtensions, req); + + if (!_FSReply(svr, (fsReply *) & rep, 0, fsFalse)) { + SyncHandle(); + return (char **) NULL; + } + if (rep.nExtensions) { + list = (char **) FSmalloc((unsigned)(rep.nExtensions * sizeof(char *))); + rlen = (rep.length << 2) - SIZEOF(fsListExtensionsReply); + c = (char *) FSmalloc((unsigned) rlen + 1); + if ((!list) || (!c)) { + if (list) + FSfree((char *) list); + if (c) + FSfree(c); + _FSEatData(svr, (unsigned long) rlen); + SyncHandle(); + return (char **) NULL; + } + _FSReadPad(svr, c, rlen); + /* + * unpack the strings + */ + length = *c; + for (i = 0; i < rep.nExtensions; i++) { + list[i] = c + 1; /* skip length */ + c += length + 1; /* find next length */ + length = *c; + *c = '\0'; /* change length to NULL */ + } + } else { + list = (char **) NULL; + } + SyncHandle(); + *next = rep.nExtensions; + return list; + +} + +int FSFreeExtensionList(list) + char **list; +{ + if (list != NULL) { + FSfree(list[0] - 1); + FSfree((char *) list); + } + return 1; +} diff --git a/src/FSMisc.c b/src/FSMisc.c new file mode 100644 index 0000000..0757536 --- /dev/null +++ b/src/FSMisc.c @@ -0,0 +1,61 @@ +/* $Xorg: FSMisc.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* @(#)FSMisc.c 4.1 91/05/02 + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 1994, 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. + +*/ + +#include "FSlibint.h" + +long +FSMaxRequestSize(svr) + FSServer *svr; +{ + return svr->max_request_size; +} diff --git a/src/FSNextEv.c b/src/FSNextEv.c new file mode 100644 index 0000000..9694b8e --- /dev/null +++ b/src/FSNextEv.c @@ -0,0 +1,76 @@ +/* $Xorg: FSNextEv.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* @(#)FSNextEv.c 4.1 91/05/02 + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 1994, 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. + +*/ + +#include "FSlibint.h" + +extern _FSQEvent *_FSqfree; + +int FSNextEvent(svr, event) + FSServer *svr; + FSEvent *event; +{ + _FSQEvent *qelt; + + if (svr->head == NULL) + _FSReadEvents(svr); + qelt = svr->head; + *event = qelt->event; + + if ((svr->head = qelt->next) == NULL) + svr->tail = NULL; + qelt->next = _FSqfree; + _FSqfree = qelt; + svr->qlen--; + + return 1; +} diff --git a/src/FSOpenFont.c b/src/FSOpenFont.c new file mode 100644 index 0000000..0ed7bd5 --- /dev/null +++ b/src/FSOpenFont.c @@ -0,0 +1,89 @@ +/* $Xorg: FSOpenFont.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 1994, 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. + +*/ + +#include "FSlibint.h" + +Font +FSOpenBitmapFont(svr, hint, fmask, name, otherid) + FSServer *svr; + FSBitmapFormat hint; + FSBitmapFormatMask fmask; + char *name; + Font *otherid; +{ + unsigned char nbytes; + fsOpenBitmapFontReq *req; + fsOpenBitmapFontReply reply; + Font fid; + unsigned char buf[256]; + char* bufptr; + + nbytes = name ? strlen(name) : 0; + if (nbytes > 255) return 0; + GetReq(OpenBitmapFont, req); + buf[0] = (unsigned char) nbytes; + memcpy(&buf[1], name, nbytes); + nbytes++; + req->fid = fid = svr->resource_id++; + req->format_hint = hint; + req->format_mask = fmask; + req->length += (nbytes + 3) >> 2; + _FSSend(svr, buf, (long) nbytes); + if (!_FSReply(svr, (fsReply *) & reply, + (SIZEOF(fsOpenBitmapFontReply)-SIZEOF(fsGenericReply)) >> 2, + fsFalse)) + return 0; + *otherid = reply.otherid; + SyncHandle(); + return fid; +} diff --git a/src/FSOpenServ.c b/src/FSOpenServ.c new file mode 100644 index 0000000..7d006a9 --- /dev/null +++ b/src/FSOpenServ.c @@ -0,0 +1,280 @@ +/* $Xorg: FSOpenServ.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* @(#)FSOpenServ.c 4.1 91/05/02 + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 1994, 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. + +*/ + +/* + * does initial handshake w/ font server + */ + +#include <stdio.h> +#include "FSlibint.h" +#include <X11/Xtrans.h> + +int _FSdebug = 0; + +static fsReq _dummy_request = { + 0, 0, 0 +}; + +FSServer *_FSHeadOfServerList = NULL; + +extern Bool _FSWireToEvent(); +extern Status _FSUnknownNativeEvent(); +extern Bool _FSUnknownWireEvent(); + +void _FSFreeServerStructure(svr) + FSServer *svr; +{ + if (svr->server_name) + FSfree(svr->server_name); + if (svr->vendor) + FSfree(svr->vendor); + + if (svr->buffer) + FSfree(svr->buffer); + + FSfree((char *) svr); +} + +static +void OutOfMemory(svr, setup) + FSServer *svr; + char *setup; +{ + extern void _FSDisconnectServer(); + + _FSDisconnectServer(svr->trans_conn); + _FSFreeServerStructure(svr); + FSfree(setup); + errno = ENOMEM; +} + +/* + * connects to a server, makes a FSServer object and returns a pointer + * to it + */ + +FSServer * +FSOpenServer(server) + char *server; +{ + FSServer *svr; + int i; + int endian; + fsConnClientPrefix client; + fsConnSetup prefix; + char *setup; + fsConnSetupAccept conn; + char *auth_data; + char *alt_data, + *ad; + AlternateServer *alts; + int altlen; + char *vendor_string; + long setuplength; + extern void _FSSendClientPrefix(); + extern XtransConnInfo _FSConnectServer(); +#ifdef X_NOT_STDC_ENV + extern char *getenv(); +#endif + + if (server == NULL || *server == '\0') { + if ((server = getenv("FONTSERVER")) == NULL) { + return (FSServer *) NULL; + } + } + + if ((svr = (FSServer *) FScalloc(1, sizeof(FSServer))) == NULL) { + errno = ENOMEM; + return (FSServer *) NULL; + } + if ((svr->trans_conn = _FSConnectServer(server)) == NULL) { + FSfree((char *) svr); + return (FSServer *) NULL; + } + + svr->fd = _FSTransGetConnectionNumber (svr->trans_conn); + + endian = 1; + if (*(char *) &endian) + client.byteOrder = 'l'; + else + client.byteOrder = 'B'; + client.major_version = FS_PROTOCOL; + client.minor_version = FS_PROTOCOL_MINOR; +/* XXX -- fix this when we have some auths */ + client.num_auths = 0; + client.auth_len = 0; + _FSSendClientPrefix(svr, &client); + +/* see if connection was accepted */ + _FSRead(svr, (char *) &prefix, (long) SIZEOF(fsConnSetup)); + + setuplength = prefix.alternate_len << 2; + if ((alt_data = (char *) + (setup = FSmalloc((unsigned) setuplength))) == NULL) { + errno = ENOMEM; + FSfree((char *) svr); + return (FSServer *) NULL; + } + _FSRead(svr, (char *) alt_data, setuplength); + ad = alt_data; + + alts = (AlternateServer *) + FSmalloc(sizeof(AlternateServer) * prefix.num_alternates); + if (!alts) { + errno = ENOMEM; + FSfree((char *) svr); + return (FSServer *) 0; + } + for (i = 0; i < prefix.num_alternates; i++) { + alts[i].subset = (Bool) *ad++; + altlen = (int) *ad++; + alts[i].name = (char *) FSmalloc(altlen + 1); + if (!alts[i].name) { + while (--i) { + FSfree((char *) alts[i].name); + } + FSfree((char *) alts); + FSfree((char *) alt_data); + FSfree((char *) svr); + errno = ENOMEM; + return (FSServer *) 0; + } + bcopy(ad, alts[i].name, altlen); + alts[i].name[altlen] = '\0'; + ad += altlen + (4 - (altlen + 2) & 3); + } + FSfree((char *) alt_data); + + svr->alternate_servers = alts; + svr->num_alternates = prefix.num_alternates; + + setuplength = prefix.auth_len << 2; + if ((auth_data = (char *) + (setup = FSmalloc((unsigned) setuplength))) == NULL) { + errno = ENOMEM; + FSfree((char *) svr); + return (FSServer *) NULL; + } + _FSRead(svr, (char *) auth_data, setuplength); + + if (prefix.status != AuthSuccess) { + fprintf(stderr, "%s: connection to \"%s\" refused by server\r\n%s: ", + "FSlib", server, "FSlib"); + FSfree((char *) svr); + FSfree(setup); + return (FSServer *) NULL; + } + /* get rest */ + _FSRead(svr, (char *) &conn, (long) SIZEOF(fsConnSetupAccept)); + + if ((vendor_string = (char *) + FSmalloc((unsigned) conn.vendor_len + 1)) == NULL) { + errno = ENOMEM; + FSfree((char *) svr); + return (FSServer *) NULL; + } + _FSReadPad(svr, (char *) vendor_string, conn.vendor_len); + + /* move the data into the FSServer struct */ + svr->next = (FSServer *) NULL; + svr->proto_version = prefix.major_version; + svr->release = conn.release_number; + svr->max_request_size = conn.max_request_len; + + svr->event_vec[FS_Error] = _FSUnknownWireEvent; + svr->event_vec[FS_Reply] = _FSUnknownWireEvent; + svr->wire_vec[FS_Error] = _FSUnknownNativeEvent; + svr->wire_vec[FS_Reply] = _FSUnknownNativeEvent; + for (i = FSLASTEvent; i < 128; i++) { + svr->event_vec[i] = _FSUnknownWireEvent; + svr->wire_vec[i] = _FSUnknownNativeEvent; + } + svr->resource_id = 1; + + svr->vendor = vendor_string; + svr->vendor[conn.vendor_len] = '\0'; + + svr->vnumber = FS_PROTOCOL; + svr->request = 0; + svr->last_request_read = 0; + svr->last_req = (char *) &_dummy_request; + + if ((svr->server_name = FSmalloc((unsigned) (strlen(server) + 1))) + == NULL) { + OutOfMemory(svr, setup); + return (FSServer *) NULL; + } + (void) strcpy(svr->server_name, server); + + /* setup the output buffers */ + if ((svr->bufptr = svr->buffer = FSmalloc(BUFSIZE)) == NULL) { + OutOfMemory(svr, setup); + return (FSServer *) NULL; + } + svr->bufmax = svr->buffer + BUFSIZE; + + /* set up input event queue */ + svr->head = svr->tail = NULL; + svr->qlen = 0; + + FSfree(setup); + + (void) FSSynchronize(svr, _FSdebug); + + svr->next = _FSHeadOfServerList; + _FSHeadOfServerList = svr; + + return (svr); +} + diff --git a/src/FSQGlyphs.c b/src/FSQGlyphs.c new file mode 100644 index 0000000..550a042 --- /dev/null +++ b/src/FSQGlyphs.c @@ -0,0 +1,186 @@ +/* $Xorg: FSQGlyphs.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 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. + +*/ + +#include "FSlibint.h" + +int +FSQueryXBitmaps8(svr, fid, format, range_type, str, str_len, offsets, glyphdata) + FSServer *svr; + Font fid; + FSBitmapFormat format; + Bool range_type; + unsigned char *str; + unsigned long str_len; + FSOffset **offsets; + unsigned char **glyphdata; +{ + fsQueryXBitmaps8Req *req; + fsQueryXBitmaps8Reply reply; + FSOffset *offs; + fsOffset32 local_offs; + unsigned char *gd; + int left; + int i; + + GetReq(QueryXBitmaps8, req); + req->fid = fid; + req->range = range_type; + req->format = format; + req->num_ranges = str_len; + req->length += (str_len + 3) >> 2; + _FSSend(svr, (char *) str, str_len); + + /* get back the info */ + if (!_FSReply(svr, (fsReply *) & reply, + (SIZEOF(fsQueryXBitmaps8Reply) - SIZEOF(fsGenericReply)) >> 2, fsFalse)) + return FSBadAlloc; + + offs = (FSOffset *) FSmalloc(sizeof(FSOffset) * reply.num_chars); + *offsets = offs; + if (!offs) + return FSBadAlloc; + left = (reply.length << 2) - SIZEOF(fsQueryXBitmaps8Reply) + - (SIZEOF(fsOffset32) * reply.num_chars); + gd = (unsigned char *) FSmalloc(left); + *glyphdata = gd; + if (!gd) { + FSfree((char *) offs); + return FSBadAlloc; + } + for (i=0; i<reply.num_chars; i++) + { + _FSReadPad(svr, (char *) &local_offs, (SIZEOF(fsOffset32))); + offs->position = local_offs.position; + offs->length = local_offs.length; + offs++; + } + _FSReadPad(svr, (char *) gd, left); + + SyncHandle(); + return FSSuccess; +} + +int +FSQueryXBitmaps16(svr, fid, format, range_type, str, str_len, + offsets, glyphdata) + FSServer *svr; + Font fid; + FSBitmapFormat format; + Bool range_type; + FSChar2b *str; + unsigned long str_len; + FSOffset **offsets; + unsigned char **glyphdata; +{ + fsQueryXBitmaps16Req *req; + fsQueryXBitmaps16Reply reply; + FSOffset *offs; + fsOffset32 local_offs; + unsigned char *gd; + int left; + int i; + + GetReq(QueryXBitmaps16, req); + req->fid = fid; + req->range = range_type; + req->format = format; + req->num_ranges = str_len; + req->length += ((str_len * SIZEOF(fsChar2b)) + 3) >> 2; + if (FSProtocolVersion(svr) == 1) + { + int i; + fsChar2b_version1 *swapped_str; + + swapped_str = (fsChar2b_version1 *) + FSmalloc(SIZEOF(fsChar2b_version1) * str_len); + if (!swapped_str) + return FSBadAlloc; + for (i = 0; i < str_len; i++) { + swapped_str[i].low = str[i].low; + swapped_str[i].high = str[i].high; + } + _FSSend(svr, (char *)swapped_str, (str_len*SIZEOF(fsChar2b_version1))); + FSfree(swapped_str); + } else + _FSSend(svr, (char *) str, (str_len * SIZEOF(fsChar2b))); + + /* get back the info */ + if (!_FSReply(svr, (fsReply *) & reply, + (SIZEOF(fsQueryXBitmaps16Reply) - SIZEOF(fsGenericReply)) >> 2, + fsFalse)) + return FSBadAlloc; + + offs = (FSOffset *) FSmalloc(sizeof(FSOffset) * reply.num_chars); + *offsets = offs; + if (!offs) + return FSBadAlloc; + left = (reply.length << 2) - SIZEOF(fsQueryXBitmaps16Reply) + - (SIZEOF(fsOffset32) * reply.num_chars); + gd = (unsigned char *) FSmalloc(left); + *glyphdata = gd; + if (!gd) { + FSfree((char *) offs); + return FSBadAlloc; + } + for (i=0; i<reply.num_chars; i++) + { + _FSReadPad(svr, (char *) &local_offs, (SIZEOF(fsOffset32))); + offs->position = local_offs.position; + offs->length = local_offs.length; + offs++; + } + _FSReadPad(svr, (char *) gd, left); + + SyncHandle(); + return FSSuccess; +} diff --git a/src/FSQXExt.c b/src/FSQXExt.c new file mode 100644 index 0000000..81b6814 --- /dev/null +++ b/src/FSQXExt.c @@ -0,0 +1,164 @@ +/* $Xorg: FSQXExt.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 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. + +*/ + +#include "FSlibint.h" + +static void +_FS_convert_char_info(src, dst) + fsXCharInfo *src; + FSXCharInfo *dst; +{ + dst->ascent = src->ascent; + dst->descent = src->descent; + dst->left = src->left; + dst->right = src->right; + dst->width = src->width; + dst->attributes = src->attributes; +} + +int +FSQueryXExtents8(svr, fid, range_type, str, str_len, extents) + FSServer *svr; + Font fid; + Bool range_type; + unsigned char *str; + unsigned long str_len; + FSXCharInfo **extents; +{ + fsQueryXExtents8Req *req; + fsQueryXExtents8Reply reply; + FSXCharInfo *ext; + fsXCharInfo local_exts; + int i; + + GetReq(QueryXExtents8, req); + req->fid = fid; + req->range = range_type; + req->num_ranges = str_len; + req->length += (str_len + 3) >> 2; + _FSSend(svr, (char *) str, str_len); + + /* get back the info */ + if (!_FSReply(svr, (fsReply *) & reply, + (SIZEOF(fsQueryXExtents8Reply) - SIZEOF(fsGenericReply)) >> 2, + fsFalse)) + return FSBadAlloc; + + ext = (FSXCharInfo *) FSmalloc(sizeof(FSXCharInfo) * reply.num_extents); + *extents = ext; + if (!ext) + return FSBadAlloc; + for (i = 0; i < reply.num_extents; i++) { + _FSReadPad(svr, (char *) &local_exts, SIZEOF(fsXCharInfo)); + _FS_convert_char_info(&local_exts, &ext[i]); + } + + SyncHandle(); + return FSSuccess; +} + +int +FSQueryXExtents16(svr, fid, range_type, str, str_len, extents) + FSServer *svr; + Font fid; + Bool range_type; + FSChar2b *str; + unsigned long str_len; + FSXCharInfo **extents; +{ + fsQueryXExtents16Req *req; + fsQueryXExtents16Reply reply; + FSXCharInfo *ext; + fsXCharInfo local_exts; + int i; + + GetReq(QueryXExtents16, req); + req->fid = fid; + req->range = range_type; + req->num_ranges = str_len; + req->length += ((str_len * SIZEOF(fsChar2b)) + 3) >> 2; + if (FSProtocolVersion(svr) == 1) + { + fsChar2b_version1 *swapped_str; + + swapped_str = (fsChar2b_version1 *) + FSmalloc(SIZEOF(fsChar2b_version1) * str_len); + if (!swapped_str) + return FSBadAlloc; + for (i = 0; i < str_len; i++) { + swapped_str[i].low = str[i].low; + swapped_str[i].high = str[i].high; + } + _FSSend(svr, (char *)swapped_str, (str_len*SIZEOF(fsChar2b_version1))); + FSfree(swapped_str); + } else + _FSSend(svr, (char *) str, (str_len * SIZEOF(fsChar2b))); + + /* get back the info */ + if (!_FSReply(svr, (fsReply *) & reply, + (SIZEOF(fsQueryXExtents16Reply) - SIZEOF(fsGenericReply)) >> 2, + fsFalse)) + return FSBadAlloc; + + ext = (FSXCharInfo *) FSmalloc(sizeof(FSXCharInfo) * reply.num_extents); + *extents = ext; + if (!ext) + return FSBadAlloc; + for (i = 0; i < reply.num_extents; i++) { + _FSReadPad(svr, (char *) &local_exts, SIZEOF(fsXCharInfo)); + _FS_convert_char_info(&local_exts, &ext[i]); + } + + SyncHandle(); + return FSSuccess; +} diff --git a/src/FSQXInfo.c b/src/FSQXInfo.c new file mode 100644 index 0000000..f65b4e1 --- /dev/null +++ b/src/FSQXInfo.c @@ -0,0 +1,122 @@ +/* $Xorg: FSQXInfo.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 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. + +*/ + +#include "FSlibint.h" + +/* + * Note: only the range in the first FSQuery is sent to the server. + * the others exist as return values only. + */ + +int +FSQueryXInfo(svr, fid, info, props, offsets, prop_data) + FSServer *svr; + Font fid; + FSXFontInfoHeader *info; + FSPropInfo *props; + FSPropOffset **offsets; + unsigned char **prop_data; +{ + fsQueryXInfoReq *req; + fsQueryXInfoReply reply; + FSPropOffset *offset_data; + unsigned char *pdata; + fsPropInfo local_pi; + fsPropOffset local_po; + int j; + + GetReq(QueryXInfo, req); + req->id = fid; + + /* get back the info */ + if (!_FSReply(svr, (fsReply *) & reply, ((SIZEOF(fsQueryXInfoReply) - + SIZEOF(fsGenericReply)) >> 2), fsFalse)) { + return FSBadAlloc; + } + + FSUnpack_XFontInfoHeader(&reply, info, FSProtocolVersion(svr)); + + /* get the prop header */ + _FSReadPad(svr, (char *) &local_pi, SIZEOF(fsPropInfo)); + props->num_offsets = local_pi.num_offsets; + props->data_len = local_pi.data_len; + + /* prepare for prop data */ + offset_data = (FSPropOffset *) + FSmalloc(props->num_offsets * sizeof(FSPropOffset)); + if (!offset_data) + return FSBadAlloc; + pdata = (unsigned char *) FSmalloc(props->data_len); + if (!pdata) { + FSfree((char *) offset_data); + return FSBadAlloc; + } + /* get offsets */ + for (j=0; j<props->num_offsets; j++) + { + _FSReadPad(svr, (char *) &local_po, SIZEOF(fsPropOffset)); + offset_data[j].name.position = local_po.name.position; + offset_data[j].name.length = local_po.name.length; + offset_data[j].value.position = local_po.value.position; + offset_data[j].value.length = local_po.value.length; + offset_data[j].type = local_po.type; + } + + /* get data */ + _FSReadPad(svr, (char *) pdata, props->data_len); + *offsets = offset_data; + *prop_data = pdata; + + SyncHandle(); + return FSSuccess; +} diff --git a/src/FSQuExt.c b/src/FSQuExt.c new file mode 100644 index 0000000..adec9e5 --- /dev/null +++ b/src/FSQuExt.c @@ -0,0 +1,79 @@ +/* $Xorg: FSQuExt.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 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. + +*/ + +#include "FSlibint.h" + +Bool +FSQueryExtension(svr, name, major_opcode, first_event, first_error) + FSServer *svr; + char *name; + int *major_opcode; + int *first_event; + int *first_error; +{ + fsQueryExtensionReply rep; + fsQueryExtensionReq *req; + + GetReq(QueryExtension, req); + req->nbytes = name ? strlen(name) : 0; + req->length += (req->nbytes + 3) >> 2; + _FSSend(svr, name, (long) req->nbytes); + if (!_FSReply(svr, (fsReply *) & rep, + (SIZEOF(fsQueryExtensionReply) - SIZEOF(fsGenericReply)) >> 2, fsFalse)) + return FSBadAlloc; + *major_opcode = rep.major_opcode; + *first_event = rep.first_event; + *first_error = rep.first_error; + SyncHandle(); + return (rep.present); +} diff --git a/src/FSServName.c b/src/FSServName.c new file mode 100644 index 0000000..e7b63e3 --- /dev/null +++ b/src/FSServName.c @@ -0,0 +1,74 @@ +/* $Xorg: FSServName.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* @(#)FSServName.c 4.1 91/05/02 + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 1994, 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. + +*/ + +#include <stdio.h> + +#include <X11/Xosdefs.h> +#ifndef X_NOT_STDC_ENV +#include <stdlib.h> +#else +char *getenv(); +#endif + +char * +FSServerName(server) + char *server; +{ + char *s; + + if (server != NULL && *server != '\0') + return server; + if ((s = getenv("FONTSERVER")) != NULL) + return s; + return NULL; +} diff --git a/src/FSSetCats.c b/src/FSSetCats.c new file mode 100644 index 0000000..cd05a94 --- /dev/null +++ b/src/FSSetCats.c @@ -0,0 +1,90 @@ +/* $Xorg: FSSetCats.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* @(#)FSFlush.c 4.1 91/05/02 + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 1994, 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. + +*/ + +#include "FSlibint.h" + +int +FSSetCatalogues(svr, num, cats) + FSServer *svr; + int num; + char **cats; +{ + unsigned char nbytes; + fsSetCataloguesReq *req; + unsigned char buf[256]; + int i; + int len, tlen, tnum; + + for (i = 0, tnum = 0, len = 0; i < num; i++) { + if ((tlen = strlen(cats[i])) < 256) { + len += tlen; + tnum++; + } + } + + GetReq(SetCatalogues, req); + req->num_catalogues = tnum; + req->length += (len + 3) >> 2; + + for (i = 0; i < num; i++) { + nbytes = strlen(cats[i]); + if (nbytes < 256) { + buf[0] = (unsigned char) nbytes; + memcpy(&buf[1], cats[i], nbytes); + nbytes++; + _FSSend(svr, buf, (long) nbytes); + } + } + SyncHandle(); + return FSSuccess; +} diff --git a/src/FSSync.c b/src/FSSync.c new file mode 100644 index 0000000..6d339bf --- /dev/null +++ b/src/FSSync.c @@ -0,0 +1,78 @@ +/* $Xorg: FSSync.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 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. + +*/ + +#include "FSlibint.h" + +extern _FSQEvent *_FSqfree; + +/* synchronize with errors and events */ + +int FSSync(svr, discard) + FSServer *svr; + Bool discard; +{ + fsListExtensionsReply rep; + fsReq *req; + + GetEmptyReq(ListExtensions, req); + (void) _FSReply(svr, (fsReply *) & rep, 0, fsTrue); + + if (discard && svr->head) { + ((_FSQEvent *) svr->tail)->next = _FSqfree; + _FSqfree = (_FSQEvent *) svr->head; + svr->head = svr->tail = NULL; + svr->qlen = 0; + } + + return 1; +} diff --git a/src/FSSynchro.c b/src/FSSynchro.c new file mode 100644 index 0000000..3e6654c --- /dev/null +++ b/src/FSSynchro.c @@ -0,0 +1,90 @@ +/* $Xorg: FSSynchro.c,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* @(#)FSSynchro.c 4.1 91/05/02 + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 1994, 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. + +*/ + +#include "FSlibint.h" + +static int +_FSSyncFunction(svr) + FSServer *svr; +{ + extern int FSSync(); + + return FSSync(svr, 0); +} + +int +(* FSSynchronize(svr, onoff)) () + FSServer *svr; + int onoff; +{ + int (*temp) (); + + temp = svr->synchandler; + if (onoff) + svr->synchandler = _FSSyncFunction; + else + svr->synchandler = NULL; + return temp; +} + +int +(* FSSetAfterFunction(svr, func)) () + FSServer *svr; + int (*func) (); +{ + int (*temp) (); + + temp = svr->synchandler; + svr->synchandler = func; + return temp; +} diff --git a/src/FSlibInt.c b/src/FSlibInt.c new file mode 100644 index 0000000..b485b9d --- /dev/null +++ b/src/FSlibInt.c @@ -0,0 +1,1322 @@ +/* $Xorg: FSlibInt.c,v 1.5 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 1994, 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. + +*/ + +/* + * FSlibInt.c - Internal support routines for the C subroutine + * interface library (FSlib). + */ +#include <stdio.h> +#include "FSlibint.h" +#include <X11/Xos.h> + +static void _EatData32(); + +/* check for both EAGAIN and EWOULDBLOCK, because some supposedly POSIX + * systems are broken and return EWOULDBLOCK when they should return EAGAIN + */ +#ifdef WIN32 +#define ETEST() (WSAGetLastError() == WSAEWOULDBLOCK) +#else +#if defined(EAGAIN) && defined(EWOULDBLOCK) +#define ETEST() (errno == EAGAIN || errno == EWOULDBLOCK) +#else +#ifdef EAGAIN +#define ETEST() (errno == EAGAIN) +#else +#define ETEST() (errno == EWOULDBLOCK) +#endif +#endif +#endif +#ifdef WIN32 +#define ECHECK(err) (WSAGetLastError() == err) +#define ESET(val) WSASetLastError(val) +#else +#define ECHECK(err) (errno == err) +#define ESET(val) errno = val +#endif + +/* + * The following routines are internal routines used by FSlib for protocol + * packet transmission and reception. + * + * FSIOError(FSServer *) will be called if any sort of system call error occurs. + * This is assumed to be a fatal condition, i.e., FSIOError should not return. + * + * FSError(FSServer *, FSErrorEvent *) will be called whenever an FS_Error event is + * received. This is not assumed to be a fatal condition, i.e., it is + * acceptable for this procedure to return. However, FSError should NOT + * perform any operations (directly or indirectly) on the DISPLAY. + * + * Routines declared with a return type of 'Status' return 0 on failure, + * and non 0 on success. Routines with no declared return type don't + * return anything. Whenever possible routines that create objects return + * the object they have created. + */ + +_FSQEvent *_FSqfree = NULL; /* NULL _FSQEvent. */ + +static int padlength[4] = {0, 3, 2, 1}; + + /* + * lookup table for adding padding bytes to data that is read from or written + * to the FS socket. + */ + +static fsReq _dummy_request = { + 0, 0, 0 +}; + +/* + * _FSFlush - Flush the FS request buffer. If the buffer is empty, no + * action is taken. This routine correctly handles incremental writes. + * This routine may have to be reworked if int < long. + */ +void +_FSFlush(svr) + register FSServer *svr; +{ + register long size, + todo; + register int write_stat; + register char *bufindex; + + size = todo = svr->bufptr - svr->buffer; + bufindex = svr->bufptr = svr->buffer; + /* + * While write has not written the entire buffer, keep looping until the + * entire buffer is written. bufindex will be incremented and size + * decremented as buffer is written out. + */ + while (size) { + ESET(0); + write_stat = _FSTransWrite(svr->trans_conn, bufindex, (int) todo); + if (write_stat >= 0) { + size -= write_stat; + todo = size; + bufindex += write_stat; + } else if (ETEST()) { + _FSWaitForWritable(svr); +#ifdef SUNSYSV + } else if (ECHECK(0)) { + _FSWaitForWritable(svr); +#endif + +#ifdef EMSGSIZE + } else if (ECHECK(EMSGSIZE)) { + if (todo > 1) + todo >>= 1; + else + _FSWaitForWritable(svr); +#endif + } else { + /* Write failed! */ + /* errno set by write system call. */ + (*_FSIOErrorFunction) (svr); + } + } + svr->last_req = (char *) &_dummy_request; +} + +int +_FSEventsQueued(svr, mode) + register FSServer *svr; + int mode; +{ + register BytesReadable_t len; + BytesReadable_t pend; + char buf[BUFSIZE]; + register fsReply *rep; + + if (mode == QueuedAfterFlush) { + _FSFlush(svr); + if (svr->qlen) + return (svr->qlen); + } + if (_FSTransBytesReadable(svr->trans_conn, &pend) < 0) + (*_FSIOErrorFunction) (svr); + if ((len = pend) < SIZEOF(fsReply)) + return (svr->qlen); /* _FSFlush can enqueue events */ + else if (len > BUFSIZE) + len = BUFSIZE; + len /= SIZEOF(fsReply); + pend = len * SIZEOF(fsReply); + _FSRead(svr, buf, (long) pend); + + /* no space between comma and type or else macro will die */ + STARTITERATE(rep, fsReply, buf, (len > 0), len--) { + if (rep->generic.type == FS_Error) + _FSError(svr, (fsError *) rep); + else /* must be an event packet */ + _FSEnq(svr, (fsEvent *) rep); + } + ENDITERATE + return (svr->qlen); +} + +/* _FSReadEvents - Flush the output queue, + * then read as many events as possible (but at least 1) and enqueue them + */ +void +_FSReadEvents(svr) + register FSServer *svr; +{ + char buf[BUFSIZE]; + BytesReadable_t pend_not_register; /* because can't "&" a register + * variable */ + register BytesReadable_t pend; + register fsEvent *ev; + Bool not_yet_flushed = True; + + do { + /* find out how much data can be read */ + if (_FSTransBytesReadable(svr->trans_conn, &pend_not_register) < 0) + (*_FSIOErrorFunction) (svr); + pend = pend_not_register; + + /* + * must read at least one fsEvent; if none is pending, then we'll just + * flush and block waiting for it + */ + if (pend < SIZEOF(fsEvent)) { + pend = SIZEOF(fsEvent); + /* don't flush until we block the first time */ + if (not_yet_flushed) { + int qlen = svr->qlen; + + _FSFlush(svr); + if (qlen != svr->qlen) + return; + not_yet_flushed = False; + } + } + /* but we won't read more than the max buffer size */ + if (pend > BUFSIZE) + pend = BUFSIZE; + + /* round down to an integral number of XReps */ + pend = (pend / SIZEOF(fsEvent)) * SIZEOF(fsEvent); + + _FSRead(svr, buf, (long)pend); + + /* no space between comma and type or else macro will die */ + STARTITERATE(ev, fsEvent, buf, (pend > 0), + pend -= SIZEOF(fsEvent)) { + if (ev->type == FS_Error) + _FSError(svr, (fsError *) ev); + else /* it's an event packet; enqueue it */ + _FSEnq(svr, ev); + } + ENDITERATE + } while (svr->head == NULL); +} + +/* + * _FSRead - Read bytes from the socket taking into account incomplete + * reads. This routine may have to be reworked if int < long. + */ +void +_FSRead(svr, data, size) + register FSServer *svr; + register char *data; + register long size; +{ + register long bytes_read; + + if (size == 0) + return; + ESET(0); + while ((bytes_read = _FSTransRead(svr->trans_conn, data, (int) size)) + != size) { + + if (bytes_read > 0) { + size -= bytes_read; + data += bytes_read; + } + else if (ETEST()) { + _FSWaitForReadable(svr); + ESET(0); + } +#ifdef SUNSYSV + else if (ECHECK(0)) { + _FSWaitForReadable(svr); + } +#endif + + else if (bytes_read == 0) { + /* Read failed because of end of file! */ + ESET(EPIPE); + (*_FSIOErrorFunction) (svr); + } else { /* bytes_read is less than 0; presumably -1 */ + /* If it's a system call interrupt, it's not an error. */ + if (!ECHECK(EINTR)) + (*_FSIOErrorFunction) (svr); + } + } +} + +#ifdef WORD64 +/* + * XXX This is a *really* stupid way of doing this.... + */ + +#define PACKBUFFERSIZE 4096 + + +/* + * _FSRead32 - Read bytes from the socket unpacking each 32 bits + * into a long (64 bits on a CRAY computer). + * + */ +static void +_doFSRead32(svr, data, size, packbuffer) + register FSServer *svr; + register long *data; + register long size; + register char *packbuffer; +{ + long *lpack, + *lp; + long mask32 = 0x00000000ffffffff; + long maskw, + nwords, + i, + bits; + + _FSReadPad(svr, packbuffer, size); + + lp = data; + lpack = (long *) packbuffer; + nwords = size >> 2; + bits = 32; + + for (i = 0; i < nwords; i++) { + maskw = mask32 << bits; + *lp++ = (*lpack & maskw) >> bits; + bits = bits ^ 32; + if (bits) { + lpack++; + } + } +} + +void +_FSRead32(svr, data, len) + FSServer *svr; + long *data; + long len; +{ + char packbuffer[PACKBUFFERSIZE]; + unsigned nwords = (PACKBUFFERSIZE >> 2); /* bytes to CARD32 */ + + for (; len > nwords; len -= nwords, data += nwords) { + _doFSRead32(svr, data, nwords, packbuffer); + } + _doFSRead32(svr, data, len, packbuffer); +} + + + +/* + * _FSRead16 - Read bytes from the socket unpacking each 16 bits + * into a long (64 bits on a CRAY computer). + * + */ +static void +_doFSRead16(svr, data, size, packbuffer) + register FSServer *svr; + register short *data; + register long size; + char *packbuffer; +{ + long *lpack, + *lp; + long mask16 = 0x000000000000ffff; + long maskw, + nwords, + i, + bits; + + _FSRead(svr, packbuffer, size); /* don't do a padded read... */ + + lp = (long *) data; + lpack = (long *) packbuffer; + nwords = size >> 1; /* number of 16 bit words to be unpacked */ + bits = 48; + for (i = 0; i < nwords; i++) { + maskw = mask16 << bits; + *lp++ = (*lpack & maskw) >> bits; + bits -= 16; + if (bits < 0) { + lpack++; + bits = 48; + } + } +} + +void +_FSRead16(svr, data, len) + FSServer *svr; + short *data; + long len; +{ + char packbuffer[PACKBUFFERSIZE]; + unsigned nwords = (PACKBUFFERSIZE >> 1); /* bytes to CARD16 */ + + for (; len > nwords; len -= nwords, data += nwords) { + _doFSRead16(svr, data, nwords, packbuffer); + } + _doFSRead16(svr, data, len, packbuffer); +} + +void +_FSRead16Pad(svr, data, size) + FSServer *svr; + short *data; + long size; +{ + int slop = (size & 3); + short slopbuf[3]; + + _FSRead16(svr, data, size); + if (slop > 0) { + _FSRead16(svr, slopbuf, 4 - slop); + } +} + +#endif /* WORD64 */ + + +/* + * _FSReadPad - Read bytes from the socket taking into account incomplete + * reads. If the number of bytes is not 0 mod 32, read additional pad + * bytes. This routine may have to be reworked if int < long. + */ +void +_FSReadPad(svr, data, size) + register FSServer *svr; + register char *data; + register long size; +{ + register long bytes_read; + struct iovec iov[2]; + char pad[3]; + + if (size == 0) + return; + iov[0].iov_len = (int) size; + iov[0].iov_base = data; + /* + * The following hack is used to provide 32 bit long-word aligned padding. + * The [1] vector is of length 0, 1, 2, or 3, whatever is needed. + */ + + iov[1].iov_len = padlength[size & 3]; + iov[1].iov_base = pad; + size += iov[1].iov_len; + + ESET(0); + while ((bytes_read = _FSTransReadv(svr->trans_conn, iov, 2)) != size) { + + if (bytes_read > 0) { + size -= bytes_read; + if ((iov[0].iov_len -= bytes_read) < 0) { + iov[1].iov_len += iov[0].iov_len; + iov[1].iov_base = (char *)iov[1].iov_base - iov[0].iov_len; + iov[0].iov_len = 0; + } else + iov[0].iov_base = (char *)iov[0].iov_base + bytes_read; + } + else if (ETEST()) { + _FSWaitForReadable(svr); + ESET(0); + } +#ifdef SUNSYSV + else if (ECHECK(0)) { + _FSWaitForReadable(svr); + } +#endif + + else if (bytes_read == 0) { + /* Read failed because of end of file! */ + ESET(EPIPE); + (*_FSIOErrorFunction) (svr); + } else { /* bytes_read is less than 0; presumably -1 */ + /* If it's a system call interrupt, it's not an error. */ + if (!ECHECK(EINTR)) + (*_FSIOErrorFunction) (svr); + } + } +} + +/* + * _FSSend - Flush the buffer and send the client data. 32 bit word aligned + * transmission is used, if size is not 0 mod 4, extra bytes are transmitted. + * This routine may have to be reworked if int < long; + */ +void +_FSSend(svr, data, size) + register FSServer *svr; + char *data; + register long size; +{ + struct iovec iov[3]; + static char pad[3] = {0, 0, 0}; + + long skip = 0; + long svrbufsize = (svr->bufptr - svr->buffer); + long padsize = padlength[size & 3]; + long total = svrbufsize + size + padsize; + long todo = total; + + /* + * There are 3 pieces that may need to be written out: + * + * o whatever is in the display buffer o the data passed in by the user o + * any padding needed to 32bit align the whole mess + * + * This loop looks at all 3 pieces each time through. It uses skip to figure + * out whether or not a given piece is needed. + */ + while (total) { + long before = skip; /* amount of whole thing written */ + long remain = todo; /* amount to try this time, <= total */ + int i = 0; + long len; + + /* + * You could be very general here and have "in" and "out" iovecs and + * write a loop without using a macro, but what the heck. This + * translates to: + * + * how much of this piece is new? if more new then we are trying this + * time, clamp if nothing new then bump down amount already written, + * for next piece else put new stuff in iovec, will need all of next + * piece + * + * Note that todo had better be at least 1 or else we'll end up writing 0 + * iovecs. + */ +#define InsertIOV(pointer, length) \ + len = (length) - before; \ + if (len > remain) \ + len = remain; \ + if (len <= 0) { \ + before = (-len); \ + } else { \ + iov[i].iov_len = len; \ + iov[i].iov_base = (pointer) + before; \ + i++; \ + remain -= len; \ + before = 0; \ + } + + InsertIOV(svr->buffer, svrbufsize) + InsertIOV(data, size) + InsertIOV(pad, padsize) + + ESET(0); + if ((len = _FSTransWritev(svr->trans_conn, iov, i)) >= 0) { + skip += len; + total -= len; + todo = total; + } else if (ETEST()) { + _FSWaitForWritable(svr); +#ifdef SUNSYSV + } else if (ECHECK(0)) { + _FSWaitForWritable(svr); +#endif + +#ifdef EMSGSIZE + } else if (ECHECK(EMSGSIZE)) { + if (todo > 1) + todo >>= 1; + else + _FSWaitForWritable(svr); +#endif + } else { + (*_FSIOErrorFunction) (svr); + } + } + + svr->bufptr = svr->buffer; + svr->last_req = (char *) &_dummy_request; +} + +#ifdef undef +/* + * _FSAllocID - normal resource ID allocation routine. A client + * can roll his own and instatantiate it if he wants, but must + * follow the rules. + */ +FSID +_FSAllocID(svr) + register FSServer *svr; +{ + return (svr->resource_base + (svr->resource_id++ << svr->resource_shift)); +} + +#endif + +/* + * The hard part about this is that we only get 16 bits from a reply. Well, + * then, we have three values that will march along, with the following + * invariant: + * svr->last_request_read <= rep->sequenceNumber <= svr->request + * The right choice for rep->sequenceNumber is the largest that + * still meets these constraints. + */ + +unsigned long +_FSSetLastRequestRead(svr, rep) + register FSServer *svr; + register fsGenericReply *rep; +{ + register unsigned long newseq, + lastseq; + + newseq = (svr->last_request_read & ~((unsigned long) 0xffff)) | + rep->sequenceNumber; + lastseq = svr->last_request_read; + while (newseq < lastseq) { + newseq += 0x10000; + if (newseq > svr->request) { + (void) fprintf(stderr, + "FSlib: sequence lost (0x%lx > 0x%lx) in reply type 0x%x!\n", + newseq, svr->request, + (unsigned int) rep->type); + newseq -= 0x10000; + break; + } + } + + svr->last_request_read = newseq; + return (newseq); +} + +/* + * _FSReply - Wait for a reply packet and copy its contents into the + * specified rep. Mean while we must handle error and event packets that + * we may encounter. + */ +Status +_FSReply(svr, rep, extra, discard) + register FSServer *svr; + register fsReply *rep; + int extra; /* number of 32-bit words expected after the + * reply */ + Bool discard; /* should I discard data followind "extra" + * words? */ +{ + /* + * Pull out the serial number now, so that (currently illegal) requests + * generated by an error handler don't confuse us. + */ + unsigned long cur_request = svr->request; + long rem_length; + + _FSFlush(svr); + while (1) { + _FSRead(svr, (char *) rep, (long) SIZEOF(fsReply)); + switch ((int) rep->generic.type) { + + case FS_Reply: + /* + * Reply received. Fast update for synchronous replies, but deal + * with multiple outstanding replies. + */ + if (rep->generic.sequenceNumber == (cur_request & 0xffff)) + svr->last_request_read = cur_request; + else + (void) _FSSetLastRequestRead(svr, &rep->generic); + rem_length = rep->generic.length - (SIZEOF(fsReply) >> 2); + if (rem_length < 0) rem_length = 0; + if (extra == 0) { + if (discard && rem_length) + /* unexpectedly long reply! */ + _EatData32(svr, rem_length); + return (1); + } + if (extra == rem_length) { + /* + * Read the extra data into storage immediately following the + * GenericReply structure. + */ + _FSRead(svr, (char *) NEXTPTR(rep, fsReply), ((long) extra) << 2); + return (1); + } + if (extra < rem_length) { + /* Actual reply is longer than "extra" */ + _FSRead(svr, (char *) NEXTPTR(rep, fsReply), ((long) extra) << 2); + if (discard) + _EatData32(svr, rem_length - extra); + return (1); + } + /* + * if we get here, then extra > rem_length -- meaning we + * read a reply that's shorter than we expected. This is an + * error, but we still need to figure out how to handle it... + */ + _FSRead(svr, (char *) NEXTPTR(rep, fsReply), rem_length << 2); + (*_FSIOErrorFunction) (svr); + return (0); + + case FS_Error: + { + register _FSExtension *ext; + register Bool ret = False; + int ret_code; + fsError err; + unsigned long serial; + long err_data; + + err = *(fsError *) rep; + /* read the rest of the error */ + _FSRead(svr, (char *) &err + SIZEOF(fsReply), + (long) (SIZEOF(fsError) - SIZEOF(fsReply))); + serial = _FSSetLastRequestRead(svr, (fsGenericReply *) rep); + if (serial == cur_request) + /* do not die on certain failures */ + switch ((int) err.request) { + /* suck in any extra error info */ + case FSBadResolution: + case FSBadLength: + case FSBadIDChoice: + case FSBadRange: + case FSBadFont: + case FSBadFormat: + _FSRead(svr, (char *) &err_data, 4); + break; + case FSBadAccessContext: + _FSRead(svr, (char *) &err_data, 4); + return 0; + case FSBadAlloc: + return (0); + /* + * we better see if there is an extension who may want + * to suppress the error. + */ + default: + ext = svr->ext_procs; + while (ext) { + if (ext->error != NULL) + ret = (*ext->error) + (svr, &err, &ext->codes, &ret_code); + ext = ext->next; + } + if (ret) + return (ret_code); + break; + } + _FSError(svr, &err); + if (serial == cur_request) + return (0); + } + break; + default: + _FSEnq(svr, (fsEvent *) rep); + break; + } + } +} + + +/* Read and discard "n" 8-bit bytes of data */ + +void +_FSEatData(svr, n) + FSServer *svr; + register unsigned long n; +{ +#define SCRATCHSIZE 2048 + char buf[SCRATCHSIZE]; + + while (n > 0) { + register long bytes_read = (n > SCRATCHSIZE) ? SCRATCHSIZE : n; + + _FSRead(svr, buf, bytes_read); + n -= bytes_read; + } +#undef SCRATCHSIZE +} + + +/* Read and discard "n" 32-bit words. */ + +static void +_EatData32(svr, n) + FSServer *svr; + unsigned long n; +{ + _FSEatData(svr, n << 2); +} + + +/* + * _FSEnq - Place event packets on the display's queue. + * note that no squishing of move events in V11, since there + * is pointer motion hints.... + */ +void +_FSEnq(svr, event) + register FSServer *svr; + register fsEvent *event; +{ + register _FSQEvent *qelt; + +/*NOSTRICT*/ + if ((qelt = _FSqfree) != NULL) { + /* If _FSqfree is non-NULL do this, else malloc a new one. */ + _FSqfree = qelt->next; + } else if ((qelt = + (_FSQEvent *) FSmalloc((unsigned) sizeof(_FSQEvent))) == NULL) { + /* Malloc call failed! */ + ESET(ENOMEM); + (*_FSIOErrorFunction) (svr); + } + qelt->next = NULL; + /* go call through display to find proper event reformatter */ + if ((*svr->event_vec[event->type & 0177]) (svr, &qelt->event, event)) { + if (svr->tail) + svr->tail->next = qelt; + else + svr->head = qelt; + + svr->tail = qelt; + svr->qlen++; + } else { + /* ignored, or stashed away for many-to-one compression */ + qelt->next = _FSqfree; + _FSqfree = qelt; + } +} + +/* + * EventToWire in seperate file in that often not needed. + */ + +/*ARGSUSED*/ +Bool +_FSUnknownWireEvent(svr, re, event) + register FSServer *svr; /* pointer to display structure */ + register FSEvent *re; /* pointer to where event should be + * reformatted */ + register fsEvent *event; /* wire protocol event */ +{ + +#ifdef notdef + (void) fprintf(stderr, + "FSlib: unhandled wire event! event number = %d, display = %x\n.", + event->type, svr); +#endif + + return (False); +} + +/*ARGSUSED*/ +Status +_FSUnknownNativeEvent(svr, re, event) + register FSServer *svr; /* pointer to display structure */ + register FSEvent *re; /* pointer to where event should be + * reformatted */ + register fsEvent *event; /* wire protocol event */ +{ + +#ifdef notdef + (void) fprintf(stderr, + "FSlib: unhandled native event! event number = %d, display = %x\n.", + re->type, svr); +#endif + + return (0); +} + +/* + * reformat a wire event into an FSEvent structure of the right type. + */ +Bool +_FSWireToEvent(svr, re, event) + register FSServer *svr; /* pointer to display structure */ + register FSEvent *re; /* pointer to where event should be + * reformatted */ + register fsEvent *event; /* wire protocol event */ +{ + + re->type = event->type & 0x7f; + ((FSAnyEvent *) re)->serial = _FSSetLastRequestRead(svr, + (fsGenericReply *) event); + ((FSAnyEvent *) re)->send_event = ((event->type & 0x80) != 0); + ((FSAnyEvent *) re)->server = svr; + + /* + * Ignore the leading bit of the event type since it is set when a client + * sends an event rather than the server. + */ + + switch (event->type & 0177) { + default: + return (_FSUnknownWireEvent(svr, re, event)); + } +} + + +static char * +_SysErrorMsg(n) + int n; +{ + char *s = strerror(n); + + return (s ? s : "no such error"); +} + +/* + * _FSDefaultIOError - Default fatal system error reporting routine. Called + * when an X internal system error is encountered. + */ +_FSDefaultIOError(svr) + FSServer *svr; +{ + (void) fprintf(stderr, + "FSIO: fatal IO error %d (%s) on font server \"%s\"\r\n", +#ifdef WIN32 + WSAGetLastError(), strerror(WSAGetLastError()), +#else + + errno, _SysErrorMsg(errno), +#endif + FSServerString(svr)); + (void) fprintf(stderr, + " after %lu requests (%lu known processed) with %d events remaining.\r\n", + FSNextRequest(svr) - 1, FSLastKnownRequestProcessed(svr), + FSQLength(svr)); + + if (ECHECK(EPIPE)) { + (void) fprintf(stderr, + " The connection was probably broken by a server shutdown.\r\n"); + } + exit(1); +} + +/* + * _FSError - Default non-fatal error reporting routine. Called when an + * FS_Error packet is encountered in the input stream. + */ +int +_FSError(svr, rep) + FSServer *svr; + fsError *rep; +{ + FSErrorEvent event; + + /* + * FS_Error packet encountered! We need to unpack the error before giving + * it to the user. + */ + + event.server = svr; + event.type = FS_Error; + event.serial = _FSSetLastRequestRead(svr, (fsGenericReply *) rep); + event.error_code = rep->request; + event.request_code = rep->major_opcode; + event.minor_code = rep->minor_opcode; + if (_FSErrorFunction != NULL) { + return ((*_FSErrorFunction) (svr, &event)); + } + exit(1); + /* NOTREACHED */ +} + +int +_FSPrintDefaultError(svr, event, fp) + FSServer *svr; + FSErrorEvent *event; + FILE *fp; +{ + char buffer[BUFSIZ]; + char mesg[BUFSIZ]; + char number[32]; + char *mtype = "FSlibMessage"; + register _FSExtension *ext = (_FSExtension *) NULL; + extern int FSGetErrorText(); + extern int FSGetErrorDatabaseText(); + + (void) FSGetErrorText(svr, event->error_code, buffer, BUFSIZ); + (void) FSGetErrorDatabaseText(svr, mtype, "FSError", "FS Error", mesg, + BUFSIZ); + (void) fprintf(fp, "%s: %s\n ", mesg, buffer); + (void) FSGetErrorDatabaseText(svr, mtype, "MajorCode", + "Request Major code %d", mesg, BUFSIZ); + (void) fprintf(fp, mesg, event->request_code); + if (event->request_code < 128) { + sprintf(number, "%d", event->request_code); + (void) FSGetErrorDatabaseText(svr, "FSRequest", number, "", buffer, + BUFSIZ); + } else { + for (ext = svr->ext_procs; + ext && (ext->codes.major_opcode != event->request_code); + ext = ext->next); + if (ext) + strcpy(buffer, ext->name); + else + buffer[0] = '\0'; + } + (void) fprintf(fp, " (%s)\n ", buffer); + (void) FSGetErrorDatabaseText(svr, mtype, "MinorCode", + "Request Minor code %d", mesg, BUFSIZ); + (void) fprintf(fp, mesg, event->minor_code); + if (ext) { + sprintf(mesg, "%s.%d", ext->name, event->minor_code); + (void) FSGetErrorDatabaseText(svr, "FSRequest", mesg, "", buffer, + BUFSIZ); + (void) fprintf(fp, " (%s)", buffer); + } + fputs("\n ", fp); + (void) FSGetErrorDatabaseText(svr, mtype, "ResourceID", "ResourceID 0x%x", + mesg, BUFSIZ); + (void) fprintf(fp, mesg, event->resourceid); + fputs("\n ", fp); + (void) FSGetErrorDatabaseText(svr, mtype, "ErrorSerial", "Error Serial #%d", + mesg, BUFSIZ); + (void) fprintf(fp, mesg, event->serial); + fputs("\n ", fp); + (void) FSGetErrorDatabaseText(svr, mtype, "CurrentSerial", + "Current Serial #%d", mesg, BUFSIZ); + (void) fprintf(fp, mesg, svr->request); + fputs("\n", fp); + return 1; +} + +int +_FSDefaultError(svr, event) + FSServer *svr; + FSErrorEvent *event; +{ + if (_FSPrintDefaultError(svr, event, stderr) == 0) + return 0; + exit(1); + /* NOTREACHED */ +} + +int (*_FSIOErrorFunction) () = _FSDefaultIOError; +int (*_FSErrorFunction) () = _FSDefaultError; + +/* + * This routine can be used to (cheaply) get some memory within a single + * Xlib routine for scratch space. It is reallocated from the same place + * each time, unless the library needs a large scratch space. + */ +char * +_FSAllocScratch(svr, nbytes) + register FSServer *svr; + unsigned long nbytes; +{ + if (nbytes > svr->scratch_length) { + if (svr->scratch_buffer != NULL) + FSfree(svr->scratch_buffer); + return (svr->scratch_length = nbytes, + svr->scratch_buffer = FSmalloc((unsigned) nbytes)); + } + return (svr->scratch_buffer); +} + +int +FSFree(data) + char *data; +{ + FSfree(data); + return 1; +} + +unsigned char * +FSMalloc(size) + unsigned size; +{ + return (unsigned char *) FSmalloc(size); +} + +#ifdef DataRoutineIsProcedure +void +Data(svr, data, len) + FSServer *svr; + char *data; + long len; +{ + if (svr->bufptr + (len) <= svr->bufmax) { + bcopy(data, svr->bufptr, (int) len); + svr->bufptr += ((len) + 3) & ~3; + } else { + _FSSend(svr, data, len); + } +} + +#endif /* DataRoutineIsProcedure */ + + +#ifdef WORD64 +/* + * XXX This is a *really* stupid way of doing this. It should just use + * svr->bufptr directly, taking into account where in the word it is. + */ + +/* + * Data16 - Place 16 bit data in the buffer. + * + * "svr" is a pointer to a FSServer. + * "data" is a pointer to the data. + * "len" is the length in bytes of the data. + */ + +static void +doData16(svr, data, len, packbuffer) + register FSServer *svr; + short *data; + unsigned len; + char *packbuffer; +{ + long *lp, + *lpack; + long i, + nwords, + bits; + long mask16 = 0x000000000000ffff; + + lp = (long *) data; + lpack = (long *) packbuffer; + *lpack = 0; + +/* nwords is the number of 16 bit values to be packed, + * the low order 16 bits of each word will be packed + * into 64 bit words + */ + nwords = len >> 1; + bits = 48; + + for (i = 0; i < nwords; i++) { + *lpack ^= (*lp & mask16) << bits; + bits -= 16; + lp++; + if (bits < 0) { + lpack++; + *lpack = 0; + bits = 48; + } + } + Data(svr, packbuffer, len); +} + +void +Data16(svr, data, len) + FSServer *svr; + short *data; + unsigned len; +{ + char packbuffer[PACKBUFFERSIZE]; + unsigned nwords = (PACKBUFFERSIZE >> 1); /* bytes to CARD16 */ + + for (; len > nwords; len -= nwords, data += nwords) { + doData16(svr, data, nwords, packbuffer); + } + doData16(svr, data, len, packbuffer); +} + +/* + * Data32 - Place 32 bit data in the buffer. + * + * "svr" is a pointer to a FSServer. + * "data" is a pointer to the data. + * "len" is the length in bytes of the data. + */ + +static +doData32(svr, data, len, packbuffer) + register FSServer *svr; + long *data; + unsigned len; + char *packbuffer; +{ + long *lp, + *lpack; + long i, + bits, + nwords; + long mask32 = 0x00000000ffffffff; + + lpack = (long *) packbuffer; + lp = data; + + *lpack = 0; + +/* nwords is the number of 32 bit values to be packed + * the low order 32 bits of each word will be packed + * into 64 bit words + */ + nwords = len >> 2; + bits = 32; + + for (i = 0; i < nwords; i++) { + *lpack ^= (*lp & mask32) << bits; + bits = bits ^ 32; + lp++; + if (bits) { + lpack++; + *lpack = 0; + } + } + Data(svr, packbuffer, len); +} + +void +Data32(svr, data, len) + FSServer *svr; + short *data; + unsigned len; +{ + char packbuffer[PACKBUFFERSIZE]; + unsigned nwords = (PACKBUFFERSIZE >> 2); /* bytes to CARD32 */ + + for (; len > nwords; len -= nwords, data += nwords) { + doData32(svr, data, nwords, packbuffer); + } + doData32(svr, data, len, packbuffer); +} + +#endif /* WORD64 */ + + + +/* + * _FSFreeQ - free the queue of events, called by XCloseServer when there are + * no more displays left on the display list + */ + +void +_FSFreeQ() +{ + register _FSQEvent *qelt = _FSqfree; + + while (qelt) { + register _FSQEvent *qnext = qelt->next; + + FSfree(qelt); + qelt = qnext; + } + _FSqfree = NULL; + return; +} + +#ifdef _POSIX_SOURCE /* stupid makedepend [need if] */ +#define NEED_UTSNAME +#endif +#ifdef hpux +#define NEED_UTSNAME +#endif +#ifdef USG +#define NEED_UTSNAME +#endif +#ifdef SVR4 +#ifndef _SEQUENT_ +#define NEED_UTSNAME +#endif +#endif + +#ifdef NEED_UTSNAME +#include <sys/utsname.h> +#endif + + +/* + * _FSGetHostname - similar to gethostname but allows special processing. + */ +int +_FSGetHostname(buf, maxlen) + char *buf; + int maxlen; +{ + int len; + +#ifdef NEED_UTSNAME + /* + * same host name crock as in server and xinit. + */ + struct utsname name; + + uname(&name); + len = strlen(name.nodename); + if (len >= maxlen) + len = maxlen - 1; + strncpy(buf, name.nodename, len); + buf[len] = '\0'; +#else + buf[0] = '\0'; + (void) gethostname(buf, maxlen); + buf[maxlen - 1] = '\0'; + len = strlen(buf); +#endif /* NEED_UTSNAME */ + + return len; +} + +#ifndef _FSANYSET +/* + * This is not always a macro. + */ +_FSANYSET(src) + long *src; +{ + int i; + + for (i=0; i<MSKCNT; i++) + if (src[ i ]) + return (1); + return (0); +} +#endif diff --git a/src/FSlibint.h b/src/FSlibint.h new file mode 100644 index 0000000..7b7af15 --- /dev/null +++ b/src/FSlibint.h @@ -0,0 +1,382 @@ +/* $Xorg: FSlibint.h,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 1994, 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. + +*/ + +/* + * FSlib internal decls + */ + +#ifdef USG +#ifndef __TYPES__ +#include <sys/types.h> /* forgot to protect it... */ +#define __TYPES__ +#endif /* __TYPES__ */ +#else +#if defined(_POSIX_SOURCE) && defined(MOTOROLA) +#undef _POSIX_SOURCE +#include <sys/types.h> +#define _POSIX_SOURCE +#else +#include <sys/types.h> +#endif +#endif /* USG */ + +#include "FSlib.h" +#include "FSproto.h" +#include "FSlibos.h" +#include <errno.h> + +#ifndef NULL +#define NULL 0 +#endif + +#ifdef X_NOT_STDC_ENV +extern int errno; /* Internal system error number. */ +#endif + +extern int (*_FSIOErrorFunction) (); +extern int (*_FSErrorFunction) (); + +extern void _FSEatData(); +extern void _FSWaitForWritable(); +extern void _FSWaitForReadable(); +extern void _FSFlush(); +extern void _FSRead(); +extern void _FSReadEvents(); +extern void _FSReadPad(); +extern void _FSSend(); +extern void _FSEnq(); +extern void _FSFreeServerStructure(); +extern int _FSError(); +extern int _FSTransGetConnectionNumber(); +extern Status _FSReply(); + +#ifndef BUFSIZE +#define BUFSIZE 2048 /* FS output buffer size. */ +#endif + +/* + * server flags + */ +#define FSlibServerIOError (1L << 0) +#define FSlibServerClosing (1L << 1) + +/* Need to start requests on 64 bit word boundries + * on a CRAY computer so add a NoOp (127) if needed. + * A character pointer on a CRAY computer will be non-zero + * after shifting right 61 bits of it is not pointing to + * a word boundary. + */ + +#ifdef WORD64 +#define WORD64ALIGN if ((long)svr->bufptr >> 61) {\ + svr->last_req = svr->bufptr;\ + *(svr->bufptr) = FS_Noop;\ + *(svr->bufptr+1) = 0;\ + *(svr->bufptr+2) = 0;\ + *(svr->bufptr+3) = 1;\ + svr->request += 1;\ + svr->bufptr += 4;\ + } +#else /* else does not require alignment on 64-bit + * boundaries */ +#define WORD64ALIGN +#endif /* WORD64 */ + +/* + * GetReq - Get the next avilable FS request packet in the buffer and + * return it. + * + * "name" is the name of the request, e.g. InternAtom, OpenFont, etc. + * "req" is the name of the request pointer. + * + */ + +#if (defined(__STDC__) && !defined(UNIXCPP)) || defined(ANSICPP) +#define GetReq(name, req) \ + WORD64ALIGN\ + if ((svr->bufptr + SIZEOF(fs##name##Req)) > svr->bufmax)\ + _FSFlush(svr);\ + req = (fs##name##Req *)(svr->last_req = svr->bufptr);\ + req->reqType = FS_##name;\ + req->length = (SIZEOF(fs##name##Req))>>2;\ + svr->bufptr += SIZEOF(fs##name##Req);\ + svr->request++ + +#else /* non-ANSI C uses empty comment instead of + * "##" for token concatenation */ +#define GetReq(name, req) \ + WORD64ALIGN\ + if ((svr->bufptr + SIZEOF(fs/**/name/**/Req)) > svr->bufmax)\ + _FSFlush(svr);\ + req = (fs/**/name/**/Req *)(svr->last_req = svr->bufptr);\ + req->reqType = FS_/**/name;\ + req->length = (SIZEOF(fs/**/name/**/Req))>>2;\ + svr->bufptr += SIZEOF(fs/**/name/**/Req);\ + svr->request++ +#endif + +/* GetReqExtra is the same as GetReq, but allocates "n" additional + bytes after the request. "n" must be a multiple of 4! */ + +#if (defined(__STDC__) && !defined(UNIXCPP)) || defined(ANSICPP) +#define GetReqExtra(name, n, req) \ + WORD64ALIGN\ + if ((svr->bufptr + SIZEOF(fs##name##Req) + n) > svr->bufmax)\ + _FSFlush(svr);\ + req = (fs##name##Req *)(svr->last_req = svr->bufptr);\ + req->reqType = FS_##name;\ + req->length = (SIZEOF(fs##name##Req) + n)>>2;\ + svr->bufptr += SIZEOF(fs##name##Req) + n;\ + svr->request++ +#else +#define GetReqExtra(name, n, req) \ + WORD64ALIGN\ + if ((svr->bufptr + SIZEOF(fs/**/name/**/Req) + n) > svr->bufmax)\ + _FSFlush(svr);\ + req = (fs/**/name/**/Req *)(svr->last_req = svr->bufptr);\ + req->reqType = FS_/**/name;\ + req->length = (SIZEOF(fs/**/name/**/Req) + n)>>2;\ + svr->bufptr += SIZEOF(fs/**/name/**/Req) + n;\ + svr->request++ +#endif + + +/* + * GetResReq is for those requests that have a resource ID + * (Window, Pixmap, GContext, etc.) as their single argument. + * "rid" is the name of the resource. + */ + +#if (defined(__STDC__) && !defined(UNIXCPP)) || defined(ANSICPP) +#define GetResReq(name, rid, req) \ + WORD64ALIGN\ + if ((svr->bufptr + SIZEOF(fsResourceReq)) > svr->bufmax)\ + _FSFlush(svr);\ + req = (fsResourceReq *) (svr->last_req = svr->bufptr);\ + req->reqType = FS_##name;\ + req->length = 2;\ + req->id = (rid);\ + svr->bufptr += SIZEOF(fsResourceReq);\ + svr->request++ +#else +#define GetResReq(name, rid, req) \ + WORD64ALIGN\ + if ((svr->bufptr + SIZEOF(fsResourceReq)) > svr->bufmax)\ + _FSFlush(svr);\ + req = (fsResourceReq *) (svr->last_req = svr->bufptr);\ + req->reqType = FS_/**/name;\ + req->length = 2;\ + req->id = (rid);\ + svr->bufptr += SIZEOF(fsResourceReq);\ + svr->request++ +#endif + +/* + * GetEmptyReq is for those requests that have no arguments + * at all. + */ + +#if (defined(__STDC__) && !defined(UNIXCPP)) || defined(ANSICPP) +#define GetEmptyReq(name, req) \ + WORD64ALIGN\ + if ((svr->bufptr + SIZEOF(fsReq)) > svr->bufmax)\ + _FSFlush(svr);\ + req = (fsReq *) (svr->last_req = svr->bufptr);\ + req->reqType = FS_##name;\ + req->length = 1;\ + svr->bufptr += SIZEOF(fsReq);\ + svr->request++ +#else +#define GetEmptyReq(name, req) \ + WORD64ALIGN\ + if ((svr->bufptr + SIZEOF(fsReq)) > svr->bufmax)\ + _FSFlush(svr);\ + req = (fsReq *) (svr->last_req = svr->bufptr);\ + req->reqType = FS_/**/name;\ + req->length = 1;\ + svr->bufptr += SIZEOF(fsReq);\ + svr->request++ +#endif + +#define SyncHandle() \ + if (svr->synchandler) (*svr->synchandler)(svr) + +/* + * Data - Place data in the buffer and pad the end to provide + * 32 bit word alignment. Transmit if the buffer fills. + * + * "svr" is a pointer to a Display. + * "data" is a pinter to a data buffer. + * "len" is the length of the data buffer. + * we can presume buffer less than 2^16 bytes, so bcopy can be used safely. + */ + +#ifdef DataRoutineIsProcedure +extern void Data(); + +#else +#define Data(svr, data, len) \ + if (svr->bufptr + (len) <= svr->bufmax) {\ + bcopy(data, svr->bufptr, (int)len);\ + svr->bufptr += ((len) + 3) & ~3;\ + } else\ + _FSSend(svr, data, len) +#endif /* DataRoutineIsProcedure */ + + +/* Allocate bytes from the buffer. No padding is done, so if + * the length is not a multiple of 4, the caller must be + * careful to leave the buffer aligned after sending the + * current request. + * + * "type" is the type of the pointer being assigned to. + * "ptr" is the pointer being assigned to. + * "n" is the number of bytes to allocate. + * + * Example: + * xTextElt *elt; + * BufAlloc (xTextElt *, elt, nbytes) + */ + +#define BufAlloc(type, ptr, n) \ + if (svr->bufptr + (n) > svr->bufmax) \ + _FSFlush (svr); \ + ptr = (type) svr->bufptr; \ + svr->bufptr += (n); + +/* + * provide emulation routines for smaller architectures + */ +#ifndef WORD64 +#define Data16(dpy, data, len) Data((dpy), (char *)(data), (len)) +#define Data32(dpy, data, len) Data((dpy), (char *)(data), (len)) +#define _FSRead16Pad(dpy, data, len) _FSReadPad((dpy), (char *)(data), (len)) +#define _FSRead16(dpy, data, len) _FSRead((dpy), (char *)(data), (len)) +#define _FSRead32(dpy, data, len) _FSRead((dpy), (char *)(data), (len)) +#endif /* not WORD64 */ + +#define PackData16(dpy,data,len) Data16 (dpy, data, len) +#define PackData32(dpy,data,len) Data32 (dpy, data, len) + +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#define max(a,b) (((a) > (b)) ? (a) : (b)) + +#ifdef MUSTCOPY +/* a little bit of magic */ +#define OneDataCard32(svr,dstaddr,srcvar) \ + { svr->bufptr -= 4; Data32 (svr, (char *) &(srcvar), 4); } + +#define STARTITERATE(tpvar,type,start,endcond,decr) \ + { register char *cpvar; \ + for (cpvar = (char *) start; endcond; cpvar = NEXTPTR(cpvar,type), decr) { \ + type dummy; bcopy (cpvar, (char *) &dummy, SIZEOF(type)); \ + tpvar = (type *) cpvar; +#define ENDITERATE }} + +#else + +/* srcvar must be a variable for large architecture version */ +#define OneDataCard32(svr,dstaddr,srcvar) \ + { *(unsigned long *)(dstaddr) = (srcvar); } + +#define STARTITERATE(tpvar,type,start,endcond,decr) \ + for (tpvar = (type *) start; endcond; tpvar++, decr) { +#define ENDITERATE } +#endif /* MUSTCOPY - used machines whose C structs + * don't line up with proto */ + + +#if (defined(__STDC__) && !defined(UNIXCPP)) || defined(ANSICPP) +#define FSCat(x,y) x##_##y +#else +#define FSCat(x,y) x/**/_/**/y +#endif + +/* copy XCharInfo parts of a protocol reply into a FSXCharInfo */ + +#define FSUnpack_XCharInfo(packet, structure) \ + (structure)->left = FSCat(packet,left); \ + (structure)->right = FSCat(packet,right); \ + (structure)->width = FSCat(packet,width); \ + (structure)->ascent = FSCat(packet,ascent); \ + (structure)->descent = FSCat(packet,descent); \ + (structure)->attributes = FSCat(packet,attributes) + + +/* copy XFontInfoHeader parts of a protocol reply into a FSXFontInfoHeader */ + +#define FSUnpack_XFontInfoHeader(packet, structure, serverversion) \ + (structure)->flags = (packet)->font_header_flags; \ + (structure)->draw_direction = (packet)->font_header_draw_direction; \ + \ + if (serverversion > 1) { \ + (structure)->char_range.min_char.high = (packet)->font_hdr_char_range_min_char_high; \ + (structure)->char_range.min_char.low = (packet)->font_hdr_char_range_min_char_low; \ + (structure)->char_range.max_char.high = (packet)->font_hdr_char_range_max_char_high; \ + (structure)->char_range.max_char.low = (packet)->font_hdr_char_range_max_char_low; \ + (structure)->default_char.high = (packet)->font_header_default_char_high; \ + (structure)->default_char.low = (packet)->font_header_default_char_low; \ + } else { \ + (structure)->char_range.min_char.high = (packet)->font_hdr_char_range_min_char_low; \ + (structure)->char_range.min_char.low = (packet)->font_hdr_char_range_min_char_high; \ + (structure)->char_range.max_char.high = (packet)->font_hdr_char_range_max_char_low; \ + (structure)->char_range.max_char.low = (packet)->font_hdr_char_range_max_char_high; \ + (structure)->default_char.high = (packet)->font_header_default_char_low; \ + (structure)->default_char.low = (packet)->font_header_default_char_high; \ + } \ + \ + (structure)->font_ascent = (packet)->font_header_font_ascent; \ + (structure)->font_descent = (packet)->font_header_font_descent; \ + \ + FSUnpack_XCharInfo((packet)->font_header_min_bounds, &(structure)->min_bounds); \ + FSUnpack_XCharInfo((packet)->font_header_max_bounds, &(structure)->max_bounds) diff --git a/src/FSlibos.h b/src/FSlibos.h new file mode 100644 index 0000000..1d03b06 --- /dev/null +++ b/src/FSlibos.h @@ -0,0 +1,317 @@ +/* $Xorg: FSlibos.h,v 1.4 2001/02/09 02:03:25 xorgcvs Exp $ */ + +/* @(#)FSlibos.h 4.1 91/05/02 + * Copyright 1990 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 or Digital make no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * 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. + */ + +/* + +Copyright 1987, 1994, 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. + +*/ + +/* + * FSlib networking & os include file + */ + +#include <X11/Xfuncs.h> +#include <X11/Xosdefs.h> + +#ifndef WIN32 + +/* + * makedepend screws up on #undef OPEN_MAX, so we define a new symbol + */ + +#ifndef FS_OPEN_MAX + +#ifndef X_NOT_POSIX +#ifdef _POSIX_SOURCE +#include <limits.h> +#else +#define _POSIX_SOURCE +#include <limits.h> +#undef _POSIX_SOURCE +#endif +#endif +#ifndef OPEN_MAX +#ifdef SVR4 +#define OPEN_MAX 256 +#else +#include <sys/param.h> +#ifndef OPEN_MAX +#ifdef __OSF1__ +#define OPEN_MAX 256 +#else +#ifdef NOFILE +#define OPEN_MAX NOFILE +#else +#define OPEN_MAX NOFILES_MAX +#endif +#endif +#endif +#endif +#endif + +#if OPEN_MAX > 256 +#define FS_OPEN_MAX 256 +#else +#define FS_OPEN_MAX OPEN_MAX +#endif + +#endif /* FS_OPEN_MAX */ + +/* Utek leaves kernel macros around in include files (bleah) */ + +#ifdef dirty +#undef dirty +#endif + +#ifdef WORD64 +#define NMSKBITS 64 +#else +#define NMSKBITS 32 +#endif + +#define MSKCNT ((FS_OPEN_MAX + NMSKBITS - 1) / NMSKBITS) + +#ifdef LONG64 +typedef unsigned int FdSet[MSKCNT]; +#else +typedef unsigned long FdSet[MSKCNT]; +#endif + +#if (MSKCNT==1) +#define BITMASK(i) (1 << (i)) +#define MASKIDX(i) 0 +#endif + +#if (MSKCNT>1) +#define BITMASK(i) (1 << ((i) & (NMSKBITS - 1))) +#define MASKIDX(i) ((i) / NMSKBITS) +#endif + +#define MASKWORD(buf, i) buf[MASKIDX(i)] +#define BITSET(buf, i) MASKWORD(buf, i) |= BITMASK(i) +#define BITCLEAR(buf, i) MASKWORD(buf, i) &= ~BITMASK(i) +#define GETBIT(buf, i) (MASKWORD(buf, i) & BITMASK(i)) + +#if (MSKCNT==1) +#define COPYBITS(src, dst) dst[0] = src[0] +#define CLEARBITS(buf) buf[0] = 0 +#define MASKANDSETBITS(dst, b1, b2) dst[0] = (b1[0] & b2[0]) +#define ORBITS(dst, b1, b2) dst[0] = (b1[0] | b2[0]) +#define UNSETBITS(dst, b1) (dst[0] &= ~b1[0]) +#define _FSANYSET(src) (src[0]) +#endif + +#if (MSKCNT==2) +#define COPYBITS(src, dst) { dst[0] = src[0]; dst[1] = src[1]; } +#define CLEARBITS(buf) { buf[0] = 0; buf[1] = 0; } +#define MASKANDSETBITS(dst, b1, b2) {\ + dst[0] = (b1[0] & b2[0]);\ + dst[1] = (b1[1] & b2[1]); } +#define ORBITS(dst, b1, b2) {\ + dst[0] = (b1[0] | b2[0]);\ + dst[1] = (b1[1] | b2[1]); } +#define UNSETBITS(dst, b1) {\ + dst[0] &= ~b1[0]; \ + dst[1] &= ~b1[1]; } +#define _FSANYSET(src) (src[0] || src[1]) +#endif + +#if (MSKCNT==3) +#define COPYBITS(src, dst) { dst[0] = src[0]; dst[1] = src[1]; \ + dst[2] = src[2]; } +#define CLEARBITS(buf) { buf[0] = 0; buf[1] = 0; buf[2] = 0; } +#define MASKANDSETBITS(dst, b1, b2) {\ + dst[0] = (b1[0] & b2[0]);\ + dst[1] = (b1[1] & b2[1]);\ + dst[2] = (b1[2] & b2[2]); } +#define ORBITS(dst, b1, b2) {\ + dst[0] = (b1[0] | b2[0]);\ + dst[1] = (b1[1] | b2[1]);\ + dst[2] = (b1[2] | b2[2]); } +#define UNSETBITS(dst, b1) {\ + dst[0] &= ~b1[0]; \ + dst[1] &= ~b1[1]; \ + dst[2] &= ~b1[2]; } +#define _FSANYSET(src) (src[0] || src[1] || src[2]) +#endif + +#if (MSKCNT==4) +#define COPYBITS(src, dst) dst[0] = src[0]; dst[1] = src[1]; \ + dst[2] = src[2]; dst[3] = src[3] +#define CLEARBITS(buf) buf[0] = 0; buf[1] = 0; buf[2] = 0; buf[3] = 0 +#define MASKANDSETBITS(dst, b1, b2) \ + dst[0] = (b1[0] & b2[0]);\ + dst[1] = (b1[1] & b2[1]);\ + dst[2] = (b1[2] & b2[2]);\ + dst[3] = (b1[3] & b2[3]) +#define ORBITS(dst, b1, b2) \ + dst[0] = (b1[0] | b2[0]);\ + dst[1] = (b1[1] | b2[1]);\ + dst[2] = (b1[2] | b2[2]);\ + dst[3] = (b1[3] | b2[3]) +#define UNSETBITS(dst, b1) \ + dst[0] &= ~b1[0]; \ + dst[1] &= ~b1[1]; \ + dst[2] &= ~b1[2]; \ + dst[3] &= ~b1[3] +#define _FSANYSET(src) (src[0] || src[1] || src[2] || src[3]) +#endif + +#if (MSKCNT>4) +#define COPYBITS(src, dst) bcopy((caddr_t) src, (caddr_t) dst, sizeof(FdSet)) +#define CLEARBITS(buf) bzero((caddr_t) buf, sizeof(FdSet)) +#define MASKANDSETBITS(dst, b1, b2) \ + { int cri; \ + for (cri=0; cri<MSKCNT; cri++) \ + dst[cri] = (b1[cri] & b2[cri]) } +#define ORBITS(dst, b1, b2) \ + { int cri; \ + for (cri=0; cri<MSKCNT; cri++) \ + dst[cri] = (b1[cri] | b2[cri]) } +#define UNSETBITS(dst, b1) \ + { int cri; \ + for (cri=0; cri<MSKCNT; cri++) \ + dst[cri] &= ~b1[cri]; } +#if (MSKCNT==8) +#define _FSANYSET(src) (src[0] || src[1] || src[2] || src[3] || \ + src[4] || src[5] || src[6] || src[7]) +#endif +/* + * If MSKCNT>4 and not 8, then _FSANYSET is a routine defined in FSlibInt.c. + * + * #define _FSANYSET(src) (src[0] || src[1] || src[2] || src[3] || src[4] ...) + */ +#endif + + +#else + +#include <X11/Xwinsock.h> +#include <X11/Xw32defs.h> + +typedef fd_set FdSet; + +#define CLEARBITS(set) FD_ZERO(&set) +#define BITSET(set,s) FD_SET(s,&set) +#define _FSANYSET(set) set.fd_count + +#endif + +#include <X11/Xtrans.h> +#ifndef X_NOT_STDC_ENV +#include <stdlib.h> +#include <string.h> +#else +char *malloc(), *realloc(), *calloc(); +void exit(); +#ifdef SYSV +#include <string.h> +#else +#include <strings.h> +#endif +#endif + +/* + * The following definitions can be used for locking requests in multi-threaded + * address spaces. + */ +#define LockDisplay(dis) +#define LockMutex(mutex) +#define UnlockMutex(mutex) +#define UnlockDisplay(dis) +#define FSfree(ptr) free((ptr)) + + +/* + * Note that some machines do not return a valid pointer for malloc(0), in + * which case we provide an alternate under the control of the + * define MALLOC_0_RETURNS_NULL. This is necessary because some + * FSlib code expects malloc(0) to return a valid pointer to storage. + */ + +#ifdef MALLOC_0_RETURNS_NULL +#define FSmalloc(size) malloc(((size) > 0 ? (size) : 1)) +#define FSrealloc(ptr, size) realloc((ptr), ((size) > 0 ? (size) : 1)) +#define FScalloc(nelem, elsize) calloc(((nelem) > 0 ? (nelem) : 1), (elsize)) + +#else + +#define FSmalloc(size) malloc((size)) +#define FSrealloc(ptr, size) realloc((ptr), (size)) +#define FScalloc(nelem, elsize) calloc((nelem), (elsize)) +#endif + +/* + * ReadvFromServer and WritevToSever use struct iovec, normally found + * in Berkeley systems in <sys/uio.h>. See the readv(2) and writev(2) + * manual pages for details. + * + * struct iovec { + * caddr_t iov_base; + * int iov_len; + * }; + */ + +#ifdef USG + +#if defined(USG) && !defined(CRAY) && !defined(umips) && !defined(MOTOROLA) +#ifndef __TIMEVAL__ +#define __TIMEVAL__ +struct timeval { /* BSD has in <sys/time.h> */ + long tv_sec; + long tv_usec; +}; + +#endif /* __TIMEVAL__ */ + +#endif /* not CRAY or umips */ + +#endif /* USG */ + + +#define SearchString(string, char) index((string), (char)) |