1a96d7823Smrg/* 2a96d7823Smrg * Copyright 1990 Network Computing Devices 3a96d7823Smrg * 4a96d7823Smrg * Permission to use, copy, modify, distribute, and sell this software and its 5a96d7823Smrg * documentation for any purpose is hereby granted without fee, provided that 6a96d7823Smrg * the above copyright notice appear in all copies and that both that 7a96d7823Smrg * copyright notice and this permission notice appear in supporting 8a96d7823Smrg * documentation, and that the name of Network Computing Devices not be 9a96d7823Smrg * used in advertising or publicity pertaining to distribution of the 10a96d7823Smrg * software without specific, written prior permission. Network Computing 11a96d7823Smrg * Devices makes no representations about the suitability of this software 12a96d7823Smrg * for any purpose. It is provided "as is" without express or implied 13a96d7823Smrg * warranty. 14a96d7823Smrg * 15a96d7823Smrg * NETWORK COMPUTING DEVICES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 16a96d7823Smrg * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, 17a96d7823Smrg * IN NO EVENT SHALL NETWORK COMPUTING DEVICES BE LIABLE FOR ANY SPECIAL, 18a96d7823Smrg * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 19a96d7823Smrg * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 20a96d7823Smrg * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE 21a96d7823Smrg * OR PERFORMANCE OF THIS SOFTWARE. 22a96d7823Smrg * 23a96d7823Smrg * Author: Dave Lemke, Network Computing Devices, Inc 24a96d7823Smrg */ 25a96d7823Smrg 26a96d7823Smrg#ifndef _FSIO_H_ 27a96d7823Smrg#define _FSIO_H_ 28a96d7823Smrg 29a96d7823Smrg#ifdef DEBUG 30a96d7823Smrg#define REQUEST_LOG_SIZE 100 31a96d7823Smrg#endif 32a96d7823Smrg 33a96d7823Smrgtypedef struct _fs_fpe_alternate { 34a96d7823Smrg char *name; 35a96d7823Smrg Bool subset; 36a96d7823Smrg} FSFpeAltRec, *FSFpeAltPtr; 37a96d7823Smrg 38a96d7823Smrg 39a96d7823Smrg/* Per client access contexts */ 40a96d7823Smrgtypedef struct _fs_client_data { 41a96d7823Smrg pointer client; 42a96d7823Smrg struct _fs_client_data *next; 43a96d7823Smrg XID acid; 44a96d7823Smrg int auth_generation; 45a96d7823Smrg} FSClientRec, *FSClientPtr; 46a96d7823Smrg 47a96d7823Smrg#define FS_RECONNECT_POLL 1000 48a96d7823Smrg#define FS_RECONNECT_WAIT 5000 49a96d7823Smrg#define FS_GIVEUP_WAIT 20000 50a96d7823Smrg#define FS_REQUEST_TIMEOUT 20000 51a96d7823Smrg#define FS_OPEN_TIMEOUT 30000 52a96d7823Smrg#define FS_REOPEN_TIMEOUT 10000 53a96d7823Smrg#define FS_FLUSH_POLL 1000 54a96d7823Smrg 55a96d7823Smrgtypedef struct _fs_buf { 56a96d7823Smrg char *buf; /* data */ 57a96d7823Smrg long size; /* sizeof data */ 58a96d7823Smrg long insert; /* where to insert new data */ 59a96d7823Smrg long remove; /* where to remove old data */ 60a96d7823Smrg} FSBufRec, *FSBufPtr; 61a96d7823Smrg 62a96d7823Smrg#define FS_BUF_INC 1024 63a96d7823Smrg#define FS_BUF_MAX 32768 64a96d7823Smrg 65a96d7823Smrg#define FS_PENDING_WRITE 0x01 /* some write data is queued */ 66a96d7823Smrg#define FS_BROKEN_WRITE 0x02 /* writes are broken */ 67a96d7823Smrg#define FS_BROKEN_CONNECTION 0x04 /* connection is broken */ 68a96d7823Smrg#define FS_PENDING_REPLY 0x08 /* waiting for a reply */ 69a96d7823Smrg#define FS_GIVE_UP 0x10 /* font server declared useless */ 70a96d7823Smrg#define FS_COMPLETE_REPLY 0x20 /* complete reply ready */ 71a96d7823Smrg#define FS_RECONNECTING 0x40 72a96d7823Smrg 73a96d7823Smrg#define FS_CONN_UNCONNECTED 0 74a96d7823Smrg#define FS_CONN_CONNECTING 1 75a96d7823Smrg#define FS_CONN_CONNECTED 2 76a96d7823Smrg#define FS_CONN_SENT_PREFIX 3 77a96d7823Smrg#define FS_CONN_RECV_INIT 4 78a96d7823Smrg#define FS_CONN_SENT_CAT 5 79a96d7823Smrg#define FS_CONN_RUNNING 6 80a96d7823Smrg 81a96d7823Smrg/* FS specific font FontPathElement data */ 82a96d7823Smrgtypedef struct _fs_fpe_data { 83a96d7823Smrg FSFpePtr next; /* list of all active fs fpes */ 84a96d7823Smrg FontPathElementPtr fpe; /* Back pointer to FPE */ 85a96d7823Smrg int fs_fd; /* < 0 when not running */ 86a96d7823Smrg Bool fs_listening; /* Listening for input */ 87a96d7823Smrg int fs_conn_state; /* connection state */ 88a96d7823Smrg int current_seq; 89a96d7823Smrg char *servername; 90a96d7823Smrg Bool has_catalogues; 91a96d7823Smrg 92a96d7823Smrg int generation; 93a96d7823Smrg int numAlts; 94a96d7823Smrg int alternate; /* which alternate is in use +1 */ 95a96d7823Smrg int fsMajorVersion; /* font server major version number */ 96a96d7823Smrg FSFpeAltPtr alts; 97a96d7823Smrg 98a96d7823Smrg FSClientPtr clients; 99a96d7823Smrg XID curacid; 100a96d7823Smrg#ifdef DEBUG 101a96d7823Smrg int reqindex; 102a96d7823Smrg struct { 103a96d7823Smrg int opcode; 104a96d7823Smrg int sequence; 105a96d7823Smrg } reqbuffer[REQUEST_LOG_SIZE]; 106a96d7823Smrg#endif 107a96d7823Smrg FSBufRec outBuf; /* request queue */ 108a96d7823Smrg FSBufRec inBuf; /* reply queue */ 109a96d7823Smrg long inNeed; /* amount needed for reply */ 110a96d7823Smrg 111a96d7823Smrg CARD32 blockState; 112a96d7823Smrg CARD32 blockedReplyTime; /* time to abort blocked read */ 113a96d7823Smrg CARD32 brokenWriteTime; /* time to retry broken write */ 114a96d7823Smrg CARD32 blockedConnectTime; /* time to abort blocked connect */ 115a96d7823Smrg CARD32 brokenConnectionTime; /* time to retry broken connection */ 116a96d7823Smrg 117a96d7823Smrg FSBlockDataPtr blockedRequests; 118a96d7823Smrg 119a96d7823Smrg struct _XtransConnInfo *trans_conn; /* transport connection object */ 120a96d7823Smrg} FSFpeRec; 121a96d7823Smrg 122a96d7823Smrg#define fs_outspace(conn) ((conn)->outBuf.size - (conn)->outBuf.insert) 123a96d7823Smrg#define fs_outqueued(conn) ((conn)->outBuf.insert - (conn)->outBuf.remove) 124a96d7823Smrg#define fs_inqueued(conn) ((conn)->inBuf.insert - (conn)->inBuf.remove) 125a96d7823Smrg#define fs_needsflush(conn) (fs_outqueued(conn) != 0) 126a96d7823Smrg#define fs_needsfill(conn) (fs_inqueued(conn) < (conn)->inNeed) 127a96d7823Smrg#define fs_needsconnect(conn) ((conn)->fs_fd < 0) 128a96d7823Smrg#define fs_data_read(conn) ((conn)->inBuf.insert - (conn)->inBuf.remove) 129a96d7823Smrg 130a96d7823Smrg#define FSIO_READY 1 131a96d7823Smrg#define FSIO_BLOCK 0 132a96d7823Smrg#define FSIO_ERROR -1 133a96d7823Smrg 134a96d7823Smrgextern Bool _fs_reopen_server ( FSFpePtr conn ); 135a96d7823Smrgextern int _fs_write ( FSFpePtr conn, const char *data, long size ); 136a96d7823Smrgextern int _fs_write_pad ( FSFpePtr conn, const char *data, long len ); 137a96d7823Smrgextern int _fs_wait_for_readable ( FSFpePtr conn, int ms ); 138a96d7823Smrgextern long _fs_pad_length (long len); 139a96d7823Smrg 140a96d7823Smrgextern void _fs_connection_died ( FSFpePtr conn ); 141a96d7823Smrg 142a96d7823Smrgextern int _fs_flush (FSFpePtr conn); 143a96d7823Smrgextern void _fs_mark_block (FSFpePtr conn, CARD32 mask); 144a96d7823Smrgextern void _fs_unmark_block (FSFpePtr conn, CARD32 mask); 145a96d7823Smrgextern void _fs_done_read (FSFpePtr conn, long size); 146a96d7823Smrgextern void _fs_io_reinit (FSFpePtr conn); 147a96d7823Smrgextern int _fs_start_read (FSFpePtr conn, long size, char **buf); 148a96d7823Smrgextern Bool _fs_io_init (FSFpePtr conn); 149a96d7823Smrgextern void _fs_io_fini (FSFpePtr conn); 150a96d7823Smrgextern int _fs_poll_connect (XtransConnInfo trans_conn, int timeout); 151a96d7823Smrgextern XtransConnInfo _fs_connect(char *servername, int *ret); 152a96d7823Smrg 153a96d7823Smrg/* check for both EAGAIN and EWOULDBLOCK, because some supposedly POSIX 154a96d7823Smrg * systems are broken and return EWOULDBLOCK when they should return EAGAIN 155a96d7823Smrg */ 156a96d7823Smrg#ifdef WIN32 157a96d7823Smrg#define ETEST() (WSAGetLastError() == WSAEWOULDBLOCK) 158a96d7823Smrg#else 159a96d7823Smrg#if defined(EAGAIN) && defined(EWOULDBLOCK) 160a96d7823Smrg#define ETEST() (errno == EAGAIN || errno == EWOULDBLOCK) 161a96d7823Smrg#else 162a96d7823Smrg#ifdef EAGAIN 163a96d7823Smrg#define ETEST() (errno == EAGAIN) 164a96d7823Smrg#else 165a96d7823Smrg#define ETEST() (errno == EWOULDBLOCK) 166a96d7823Smrg#endif 167a96d7823Smrg#endif 168a96d7823Smrg#endif 169a96d7823Smrg#ifdef WIN32 170a96d7823Smrg#define ECHECK(err) (WSAGetLastError() == err) 171a96d7823Smrg#define ESET(val) WSASetLastError(val) 172a96d7823Smrg#else 173a96d7823Smrg#define ECHECK(err) (errno == err) 174a96d7823Smrg#define ESET(val) errno = val 175a96d7823Smrg#endif 176a96d7823Smrg 177a96d7823Smrg#endif /* _FSIO_H_ */ 178