#ifndef _FSIO_H_
#define _FSIO_H_
#undef DEBUG
#define REQUEST_LOG_SIZE 100
typedef struct _fs_fpe_alternate {
char *name;
Bool subset;
} FSFpeAltRec, *FSFpeAltPtr;
typedef struct _fs_client_data {
pointer client;
struct _fs_client_data *next;
XID acid;
int auth_generation;
} FSClientRec, *FSClientPtr;
#define FS_RECONNECT_POLL 1000
#define FS_RECONNECT_WAIT 5000
#define FS_GIVEUP_WAIT 20000
#define FS_REQUEST_TIMEOUT 20000
#define FS_OPEN_TIMEOUT 30000
#define FS_REOPEN_TIMEOUT 10000
#define FS_FLUSH_POLL 1000
typedef struct _fs_buf {
char *buf;
long size;
long insert;
long remove;
} FSBufRec, *FSBufPtr;
#define FS_BUF_INC 1024
#define FS_BUF_MAX 32768
#define FS_PENDING_WRITE 0x01
#define FS_BROKEN_WRITE 0x02
#define FS_BROKEN_CONNECTION 0x04
#define FS_PENDING_REPLY 0x08
#define FS_GIVE_UP 0x10
#define FS_COMPLETE_REPLY 0x20
#define FS_RECONNECTING 0x40
#define FS_CONN_UNCONNECTED 0
#define FS_CONN_CONNECTING 1
#define FS_CONN_CONNECTED 2
#define FS_CONN_SENT_PREFIX 3
#define FS_CONN_RECV_INIT 4
#define FS_CONN_SENT_CAT 5
#define FS_CONN_RUNNING 6
typedef struct _fs_fpe_data {
FSFpePtr next;
int fs_fd;
int fs_conn_state;
int current_seq;
char *servername;
Bool has_catalogues;
int generation;
int numAlts;
int alternate;
int fsMajorVersion;
FSFpeAltPtr alts;
FSClientPtr clients;
XID curacid;
#ifdef DEBUG
int reqindex;
struct {
int opcode;
int sequence;
} reqbuffer[REQUEST_LOG_SIZE];
#endif
FSBufRec outBuf;
FSBufRec inBuf;
long inNeed;
CARD32 blockState;
CARD32 blockedReplyTime;
CARD32 brokenWriteTime;
CARD32 blockedConnectTime;
CARD32 brokenConnectionTime;
FSBlockDataPtr blockedRequests;
struct _XtransConnInfo *trans_conn;
} FSFpeRec;
#define fs_outspace(conn) ((conn)->outBuf.size - (conn)->outBuf.insert)
#define fs_outqueued(conn) ((conn)->outBuf.insert - (conn)->outBuf.remove)
#define fs_inqueued(conn) ((conn)->inBuf.insert - (conn)->inBuf.remove)
#define fs_needsflush(conn) (fs_outqueued(conn) != 0)
#define fs_needsfill(conn) (fs_inqueued(conn) < (conn)->inNeed)
#define fs_needsconnect(conn) ((conn)->fs_fd < 0)
#define fs_data_read(conn) ((conn)->inBuf.insert - (conn)->inBuf.remove)
#define FSIO_READY 1
#define FSIO_BLOCK 0
#define FSIO_ERROR -1
extern Bool _fs_reopen_server ( FSFpePtr conn );
extern int _fs_write ( FSFpePtr conn, char *data, long size );
extern int _fs_write_pad ( FSFpePtr conn, char *data, long len );
extern int _fs_wait_for_readable ( FSFpePtr conn, int ms );
extern long _fs_pad_length (long len);
extern void _fs_connection_died ( FSFpePtr conn );
extern int _fs_flush (FSFpePtr conn);
extern void _fs_mark_block (FSFpePtr conn, CARD32 mask);
extern void _fs_unmark_block (FSFpePtr conn, CARD32 mask);
extern void _fs_done_read (FSFpePtr conn, long size);
extern void _fs_io_reinit (FSFpePtr conn);
extern int _fs_start_read (FSFpePtr conn, long size, char **buf);
extern Bool _fs_io_init (FSFpePtr conn);
extern void _fs_io_fini (FSFpePtr conn);
extern int _fs_poll_connect (XtransConnInfo trans_conn, int timeout);
extern XtransConnInfo _fs_connect(char *servername, int *ret);
#ifdef WIN32
#define ETEST() (WSAGetLastError() == WSAEWOULDBLOCK)
#else
#if defined(EAGAIN) && defined(EWOULDBLOCK)
#define ETEST() (errno == EAGAIN || errno == EWOULDBLOCK)
#else
#ifdef EAGAIN
#define ETEST() (errno == EAGAIN)
#else
#define ETEST() (errno == EWOULDBLOCK)
#endif
#endif
#endif
#ifdef WIN32
#define ECHECK(err) (WSAGetLastError() == err)
#define ESET(val) WSASetLastError(val)
#else
#ifdef ISC
#define ECHECK(err) ((errno == err) || ETEST())
#else
#define ECHECK(err) (errno == err)
#endif
#define ESET(val) errno = val
#endif
#endif