home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / X / mit / fonts / lib / fs / FSOpenServ.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-07-16  |  6.8 KB  |  253 lines

  1. /* $XConsortium: FSOpenServ.c,v 1.3 91/07/16 20:32:16 keith Exp $ */
  2.  
  3. /* @(#)FSOpenServ.c    4.1    91/05/02
  4.  * Copyright 1990 Network Computing Devices;
  5.  * Portions Copyright 1987 by Digital Equipment Corporation and the
  6.  * Massachusetts Institute of Technology
  7.  *
  8.  * Permission to use, copy, modify, and distribute this protoype software
  9.  * and its documentation to Members and Affiliates of the MIT X Consortium
  10.  * any purpose and without fee is hereby granted, provided
  11.  * that the above copyright notice appear in all copies and that both that
  12.  * copyright notice and this permission notice appear in supporting
  13.  * documentation, and that the names of Network Computing Devices, Digital or
  14.  * MIT not be used in advertising or publicity pertaining to distribution of
  15.  * the software without specific, written prior permission.
  16.  *
  17.  * NETWORK COMPUTING DEVICES, DIGITAL AND MIT DISCLAIM ALL WARRANTIES WITH
  18.  * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  19.  * AND FITNESS, IN NO EVENT SHALL NETWORK COMPUTING DEVICES, DIGITAL OR MIT BE
  20.  * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  21.  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
  22.  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  23.  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  24.  */
  25.  
  26. /*
  27.  * does initial handshake w/ font server
  28.  */
  29.  
  30. #include    <stdio.h>
  31. #include    "FSlibint.h"
  32. #include    <X11/Xos.h>
  33.  
  34. int         _FSdebug = 0;
  35.  
  36. static fsReq _dummy_request = {
  37.     0, 0, 0
  38. };
  39.  
  40. FSServer   *_FSHeadOfServerList = NULL;
  41.  
  42. extern Bool _FSWireToEvent();
  43. extern Status _FSUnknownNativeEvent();
  44. extern Bool _FSUnknownWireEvent();
  45.  
  46. static      OutOfMemory();
  47.  
  48. /*
  49.  * connects to a server, makes a FSServer object and returns a pointer
  50.  * to it
  51.  */
  52.  
  53. FSServer   *
  54. FSOpenServer(server)
  55.     char       *server;
  56. {
  57.     FSServer   *svr;
  58.     int         i;
  59.     char       *server_name;
  60.     int         endian;
  61.     fsConnClientPrefix client;
  62.     fsConnSetup prefix;
  63.     char       *setup;
  64.     fsConnSetupAccept conn;
  65.     char       *auth_data;
  66.     char       *alt_data,
  67.                *ad;
  68.     AlternateServer *alts;
  69.     int         altlen;
  70.     char       *vendor_string;
  71.     char        serverbuf[256];
  72.     long        setuplength;
  73.     extern int  _FSSendClientPrefix();
  74.     extern int  _FSConnectServer();
  75. #ifdef X_NOT_STDC_ENV
  76.     extern char *getenv();
  77. #endif
  78.  
  79.     if (server == NULL || *server == '\0') {
  80.     if ((server_name = getenv("FONTSERVER")) == NULL) {
  81.         return (FSServer *) NULL;
  82.     }
  83.     } else {
  84.     server_name = server;
  85.     }
  86.     if ((svr = (FSServer *) FScalloc(1, sizeof(FSServer))) == NULL) {
  87.     errno = ENOMEM;
  88.     return (FSServer *) NULL;
  89.     }
  90.     serverbuf[0] = '\0';
  91.     if ((svr->fd = _FSConnectServer(server_name, serverbuf)) < 0) {
  92.     FSfree((char *) svr);
  93.     return (FSServer *) NULL;
  94.     }
  95.     endian = 1;
  96.     if (*(char *) &endian)
  97.     client.byteOrder = 'l';
  98.     else
  99.     client.byteOrder = 'B';
  100.     client.major_version = FS_PROTOCOL;
  101.     client.minor_version = FS_PROTOCOL_MINOR;
  102. /* XXX -- fix this when we have some auths */
  103.     client.num_auths = 0;
  104.     client.auth_len = 0;
  105.     _FSSendClientPrefix(svr, &client);
  106.  
  107. /* see if connection was accepted */
  108.     _FSRead(svr, (char *) &prefix, (long) SIZEOF(fsConnSetup));
  109.  
  110.     setuplength = prefix.alternate_len << 2;
  111.     if ((alt_data = (char *)
  112.      (setup = FSmalloc((unsigned) setuplength))) == NULL) {
  113.     errno = ENOMEM;
  114.     FSfree((char *) svr);
  115.     return (FSServer *) NULL;
  116.     }
  117.     _FSRead(svr, (char *) alt_data, setuplength);
  118.     ad = alt_data;
  119.  
  120.     alts = (AlternateServer *)
  121.     FSmalloc(sizeof(AlternateServer) * prefix.num_alternates);
  122.     if (!alts) {
  123.     errno = ENOMEM;
  124.     FSfree((char *) svr);
  125.     return (FSServer *) 0;
  126.     }
  127.     for (i = 0; i < prefix.num_alternates; i++) {
  128.     alts[i].subset = (Bool) *ad++;
  129.     altlen = (int) *ad++;
  130.     alts[i].name = (char *) FSmalloc(altlen + 1);
  131.     if (!alts[i].name) {
  132.         while (--i) {
  133.         FSfree((char *) alts[i].name);
  134.         }
  135.         FSfree((char *) alts);
  136.         FSFree((char *) alt_data);
  137.         FSfree((char *) svr);
  138.         errno = ENOMEM;
  139.         return (FSServer *) 0;
  140.     }
  141.     bcopy(ad, alts[i].name, altlen);
  142.     alts[i].name[altlen] = '\0';
  143.     ad += altlen + (4 - (altlen + 2) & 3);
  144.     }
  145.     FSfree((char *) alt_data);
  146.  
  147.     svr->alternate_servers = alts;
  148.     svr->num_alternates = prefix.num_alternates;
  149.  
  150.     setuplength = prefix.auth_len << 2;
  151.     if ((auth_data = (char *)
  152.      (setup = FSmalloc((unsigned) setuplength))) == NULL) {
  153.     errno = ENOMEM;
  154.     FSfree((char *) svr);
  155.     return (FSServer *) NULL;
  156.     }
  157.     _FSRead(svr, (char *) auth_data, setuplength);
  158.  
  159.     if (prefix.status != AuthSuccess) {
  160.     fprintf(stderr, "%s: connection to \"%s\" refused by server\r\n%s: ",
  161.         "FSlib", serverbuf, "FSlib");
  162.     FSfree((char *) svr);
  163.     FSfree(setup);
  164.     return (FSServer *) NULL;
  165.     }
  166.     /* get rest */
  167.     _FSRead(svr, (char *) &conn, (long) SIZEOF(fsConnSetupAccept));
  168.  
  169.     if ((vendor_string = (char *)
  170.      FSmalloc((unsigned) conn.vendor_len + 1)) == NULL) {
  171.     errno = ENOMEM;
  172.     FSfree((char *) svr);
  173.     return (FSServer *) NULL;
  174.     }
  175.     _FSReadPad(svr, (char *) vendor_string, conn.vendor_len);
  176.  
  177.     /* move the data into the FSServer struct */
  178.     svr->next = (FSServer *) NULL;
  179.     svr->proto_version = prefix.major_version;
  180.     svr->release = conn.release_number;
  181.     svr->max_request_size = conn.max_request_len;
  182.  
  183.     svr->event_vec[FS_Error] = _FSUnknownWireEvent;
  184.     svr->event_vec[FS_Reply] = _FSUnknownWireEvent;
  185.     svr->wire_vec[FS_Error] = _FSUnknownNativeEvent;
  186.     svr->wire_vec[FS_Reply] = _FSUnknownNativeEvent;
  187.     for (i = FSLASTEvent; i < 128; i++) {
  188.     svr->event_vec[i] = _FSUnknownWireEvent;
  189.     svr->wire_vec[i] = _FSUnknownNativeEvent;
  190.     }
  191.     svr->resource_id = 1;
  192.  
  193.     svr->vendor = vendor_string;
  194.     svr->vendor[conn.vendor_len] = '\0';
  195.  
  196.     svr->vnumber = FS_PROTOCOL;
  197.     svr->request = 0;
  198.     svr->last_request_read = 0;
  199.     svr->last_req = (char *) &_dummy_request;
  200.  
  201.     if ((svr->server_name = FSmalloc((unsigned) (strlen(serverbuf) + 1)))
  202.         == NULL) {
  203.     OutOfMemory(svr, setup);
  204.     return (FSServer *) NULL;
  205.     }
  206.     (void) strcpy(svr->server_name, serverbuf);
  207.  
  208.     /* setup the output buffers */
  209.     if ((svr->bufptr = svr->buffer = FSmalloc(BUFSIZE)) == NULL) {
  210.     OutOfMemory(svr, setup);
  211.     return (FSServer *) NULL;
  212.     }
  213.     svr->bufmax = svr->buffer + BUFSIZE;
  214.  
  215.     /* set up input event queue */
  216.     svr->head = svr->tail = NULL;
  217.     svr->qlen = 0;
  218.  
  219.     FSfree(setup);
  220.  
  221.     (void) FSSynchronize(svr, _FSdebug);
  222.  
  223.     svr->next = _FSHeadOfServerList;
  224.     _FSHeadOfServerList = svr;
  225.  
  226.     return (svr);
  227. }
  228.  
  229. static
  230. OutOfMemory(svr, setup)
  231.     FSServer   *svr;
  232.     char       *setup;
  233. {
  234.     _FSDisconnectServer(svr->fd);
  235.     _FSFreeServerStructure(svr);
  236.     FSfree(setup);
  237.     errno = ENOMEM;
  238. }
  239.  
  240. _FSFreeServerStructure(svr)
  241.     FSServer   *svr;
  242. {
  243.     if (svr->server_name)
  244.     FSfree(svr->server_name);
  245.     if (svr->vendor)
  246.     FSfree(svr->vendor);
  247.  
  248.     if (svr->buffer)
  249.     FSfree(svr->buffer);
  250.  
  251.     FSfree((char *) svr);
  252. }
  253.