if ((alt_data = (char *)
if (setuplength > (SIZE_T_MAX>>2) || (alt_data = (char *)
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 int  _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);}