/* --------------------------------------------------------------------------
 *    Name: tube.h
 * Purpose: TCP Tunnel
 *  Author: by David Thomas,  1997-9
 * ----------------------------------------------------------------------- */

#define NNTPMAXLINELENGTH 512			/* Given by the NNTP RFC. */

typedef enum {
  STATE_CHECKLINE,
  STATE_READDATA,
  STATE_READLINE,
  STATE_WRITE,
  STATE_CLOSED
} connection_state;

typedef struct string_substitution {
  char				*from,
  				*to;
  struct string_substitution	*next;
} string_substitution;

typedef struct proxy_side {
  char				*buffer,
				*line;
  int				socket;
  unsigned int			index,
  				spare;
  connection_state		state;
  string_substitution		*substitutions;
} proxy_side;

typedef struct proxy_connection {
  proxy_side			clt,
				srv;
  struct proxy_connection	*last,
				*next;
} proxy_connection;

typedef struct {
  char				remote_host[128];
  fd_set			fds,
  				read_ready_fds,
  				write_ready_fds;
  unsigned int			port,
				remote_host_port,
				max_connections,
				connections,
				buffer_size;
  int				socket;
  proxy_connection		*first_connection;
  string_substitution		*first_clt_substitution,
				*first_srv_substitution;
} proxy_server;


/* Auto */

extern int main(int argc, char *argv[])
;
extern void atexit_handler(void)
;
extern int server_initialise(proxy_server *server)
;
extern void server_process(proxy_server *server)
;
extern void server_closedown(proxy_server *server)
;
extern void connection_accept(proxy_server *server)
;
extern void connection_process(proxy_server *server)
;
extern void connection_readline(proxy_server *server, proxy_connection *cn, proxy_side *cs)
;
extern void connection_checkline(proxy_server *server, proxy_connection *cn, proxy_side *cs)
;
extern void connection_readdata(proxy_server *server, proxy_connection *cn, proxy_side *cs)
;
extern void connection_write(proxy_server *server, proxy_connection *cn, proxy_side *from, proxy_side *to)
;
extern void connection_release(proxy_server *server)
;
extern void connection_halfclose(proxy_server *server, proxy_connection *cn)
;
extern void connection_close(proxy_server *server, proxy_connection *cn)
;
extern void replace(char *replace, char *with, char *string)
;
