aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/lib/FS/FSOpenServ.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/lib/FS/FSOpenServ.c')
-rw-r--r--nx-X11/lib/FS/FSOpenServ.c291
1 files changed, 291 insertions, 0 deletions
diff --git a/nx-X11/lib/FS/FSOpenServ.c b/nx-X11/lib/FS/FSOpenServ.c
new file mode 100644
index 000000000..662577945
--- /dev/null
+++ b/nx-X11/lib/FS/FSOpenServ.c
@@ -0,0 +1,291 @@
+/* $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.
+ */
+/* $XFree86: xc/lib/FS/FSOpenServ.c,v 1.8tsi Exp $ */
+
+/*
+
+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
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include "FSlibint.h"
+#include <X11/Xtrans/Xtrans.h>
+
+int _FSdebug = 0;
+
+static fsReq _dummy_request = {
+ 0, 0, 0
+};
+
+static void OutOfMemory ( FSServer *svr, char *setup );
+
+FSServer *_FSHeadOfServerList = NULL;
+
+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;
+{
+
+ _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;
+ unsigned long setuplength;
+
+ 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 (setuplength > (SIZE_MAX>>2)
+ || (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;
+
+#if SIZE_MAX <= UINT_MAX
+ if (prefix.num_alternates > SIZE_MAX / sizeof(AlternateServer)) {
+ errno = ENOMEM;
+ FSfree((char *) alt_data);
+ FSfree((char *) svr);
+ return (FSServer *) 0;
+ }
+#endif
+
+ alts = (AlternateServer *)
+ FSmalloc(sizeof(AlternateServer) * prefix.num_alternates);
+ if (!alts) {
+ errno = ENOMEM;
+ FSfree((char *) alt_data);
+ 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 (setuplength > (SIZE_MAX>>2)
+ || (auth_data = (char *)
+ (setup = FSmalloc((unsigned) setuplength))) == NULL) {
+ errno = ENOMEM;
+ FSfree((char *) alts);
+ 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 *) alts);
+ 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 *) auth_data);
+ FSfree((char *) alts);
+ 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);
+}