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