#ifndef CONNSTRC_H
#define CONNSTRC_H

typedef enum {
  SOCKET_READY, SOCKET_CREATED, SOCKET_BOUND,
  SOCKET_LISTENING, SOCKET_ACCEPTED, SOCKET_CONNECTING, SOCKET_OPEN, SOCKET_CLOSED
} SocketStatus;

typedef enum {
  PROXY_DORMANT, PROXY_HOSTPROMPT, PROXY_INITSSHCONNECTION
} ProxyStatus;

typedef enum {
  TELSTATEMACHINE_CHARS, TELSTATEMACHINE_SWALLOWUP, TELSTATEMACHINE_READTERMINALTYPE,TELSTATEMACHINE_GOTTERMINALTYPE
} TelnetState;

typedef struct {
    int send;			       /* what we initially send */
    int nsend;			       /* -ve send if requested to stop it */
    int ack, nak;		       /* +ve and -ve acknowledgements */
    int option;			       /* the option code */
    enum {
	TELSTATE_REQUESTED,
	TELSTATE_ACTIVE,
	TELSTATE_INACTIVE,
	TELSTATE_REALLY_INACTIVE
    } state;
} TelnetOption;

typedef struct {
  int terminalWidth;
  int cursorX;
  char terminalType[32];
} TelnetSession;

typedef struct {
  SOCKET telnetSocket;
  SOCKET sshSocket;
  SocketStatus telnetStatus;
  SocketStatus sshStatus;
  struct sockaddr_in telnetAddress;
  struct sockaddr_in sshAddress;
  ProxyStatus proxyStatus;
  unsigned char lineBuffer[STRING_BUFFER_SIZE];
  TelnetOption telnetOptions[TELNET_OPTION_COUNT];
  TelnetSession telnetSession;
  int swallowUp;
  TelnetState telnetState;
  /*SysLogSessionHandle logHandle;*/
} ProxiedConnection;

typedef struct {
  SOCKET masterSocket;
  SocketStatus masterStatus;
  struct sockaddr_in masterAddress;
} MasterConnection;

#endif
