#ifndef QIO_I
#define QIO_I

/* Define a few constants for socket use with qio's */

#ifndef IO$_ACCESS
#define IO$_WRITEVBLK 48
#define IO$_READVBLK  49
#define IO$_ACCESS    50
#endif

#ifndef __GNUC__
#define IO$S_FCODE 6
#endif
#define IO$_SOCKET      IO$_ACCESS | (0  << IO$S_FCODE)
#define IO$_BIND        IO$_ACCESS | (1  << IO$S_FCODE)
#define IO$_LISTEN      IO$_ACCESS | (2  << IO$S_FCODE)
#define IO$_ACCEPT      IO$_ACCESS | (3  << IO$S_FCODE)
#define IO$_CONNECT     IO$_ACCESS | (4  << IO$S_FCODE)
#define IO$_ACCEPTWAIT  IO$_ACCESS | (10 << IO$S_FCODE)
#define IO$_SHUTDOWN    IO$_ACCESS | (12 << IO$S_FCODE)
#define IO$_GETSOCKNAME IO$_ACCESS | (13 << IO$S_FCODE)
#define IO$_GETPEERNAME IO$_ACCESS | (15 << IO$S_FCODE)
#define IO$_RECEIVE     IO$_READVBLK               /* Read from the socket */
#define IO$_SEND        IO$_WRITEVBLK              /* Write to the socket */

#ifdef USE_RELOC_QIO
#ifndef IN_QIOVAR
extern int (*var_qio_gethostname)(char *);
extern void (*var_get_socket_error)(char *);
extern short (*var_qio_shutdown)(short chan);
extern short (*var_qio_accept)(short chan, SIN *sin, int len);
extern short (*var_qio_send)(short chan, char *sbuf, unsigned size);
extern short (*var_qio_socket)(int domain, int type, int protocol);
extern short (*var_qio_connect)(short chan, SIN *sin, unsigned len);
extern short (*var_qio_receive)(short chan, char *buffer, unsigned maxlen,
                   struct iosb_type *iosb, unsigned efn, ROUTINE rout);
extern unsigned short (*var_qio_htons)(unsigned short num);
extern unsigned (*var_qio_htonl)(unsigned num);
extern SIN *(*var_qio_bind_and_listen)(short *, ROUTINE rout);
extern short (*var_qio_accept_after_wait)(short, short, SIN *, int);
extern short (*var_qio_socket_and_connect)(SIN *, int);
extern void set_sin_tcp(SIN *, char *, unsigned short);
#endif

#define tcp_gethostname(_a) var_qio_gethostname(_a);
#define get_socket_error(bbb) var_get_socket_error(bbb)
#define tcp_shutdown(a) var_qio_shutdown(a)
#define tcp_accept(a, b, c) var_qio_accept(a, b, c)
#define tcp_send(a, b, c) var_qio_send(a, b, c)
#define tcp_socket(a, b, c) var_qio_socket(a, b, c)
#define tcp_connect(a, b, c) var_qio_connect(a, b, c)
#define tcp_receive(a, b, c, d, e, f) var_qio_receive(a, b, c, d, e, f)
#define tcp_htons(x) var_qio_htons(x)
#define tcp_htonl(x) var_qio_htonl(x)
#define tcp_qio_bind_and_listen(a, b) var_qio_bind_and_listen(a, b);

#else
extern int i_qio_gethostname(char *);
extern void i_get_socket_error(char *);
extern short i_qio_shutdown(short chan);
extern short i_qio_accept(short chan, SIN *sin, int len);
extern short i_qio_send(short chan, char *sbuf, unsigned size);
extern short i_qio_socket(int domain, int type, int protocol);
extern short i_qio_connect(short chan, SIN *sin, unsigned len);
extern short i_qio_receive(short chan, char *buffer, unsigned maxlen,
                   struct iosb_type *iosb, unsigned efn, ROUTINE rout);
extern unsigned short i_qio_htons(unsigned short num);
extern unsigned i_qio_htonl(unsigned num);
extern SIN *i_qio_bind_and_listen(short *, ROUTINE rout);
extern short i_qio_accept_after_wait(short, short, SIN *, int);
extern short i_qio_socket_and_connect(SIN *, int);
extern void set_sin_tcp(SIN *, char *, unsigned short);
extern void i_qio_connect_cancel(void);

#define tcp_gethostname(_a) i_qio_gethostname(_a)
#define get_socket_error(bbb) i_get_socket_error(bbb)
#define tcp_shutdown(a) i_qio_shutdown(a)
#define tcp_accept(a, b, c) i_qio_accept(a, b, c)
#define tcp_send(a, b, c) i_qio_send(a, b, c)
#define tcp_socket(a, b, c) i_qio_socket(a, b, c)
#define tcp_connect(a, b, c) i_qio_connect(a, b, c)
#define tcp_receive(a, b, c, d, e, f) i_qio_receive(a, b, c, d, e, f)
#define tcp_htons(x) i_qio_htons(x)
#define tcp_htonl(x) i_qio_htonl(x)
#define tcp_bind_and_listen(a, b) i_qio_bind_and_listen(a, b)
#define tcp_socket_and_connect(a, b) i_qio_socket_and_connect(a, b)
#define tcp_accept_after_wait(a, b, c, d) i_qio_accept_after_wait(a, b, c, d)
#define tcp_connect_cancel() i_qio_connect_cancel()
#endif

#endif
