/**************************************************************************/
/*                                                                        */
/* Copyright (c) 2001, 2011 NoMachine, http://www.nomachine.com/.         */
/*                                                                        */
/* NXSSH, NX protocol compression and NX extensions to this software      */
/* are copyright of NoMachine. Redistribution and use of the present      */
/* software is allowed according to terms specified in the file LICENSE   */
/* which comes in the source distribution.                                */
/*                                                                        */
/* Check http://www.nomachine.com/licensing.html for applicability.       */
/*                                                                        */
/* NX and NoMachine are trademarks of Medialogic S.p.A.                   */
/*                                                                        */
/* All rights reserved.                                                   */
/*                                                                        */
/**************************************************************************/

/*
 * Do we share the debug log with the proxy?
 */

extern int nx_proxy_log;

/*
 * Do we check for the incoming command? This flag
 * should be bound to a command line parameter.
 */

extern int nx_check_switch;

/*
 * Did we receive the command? Switch is executed at
 * the time the first channel receives the command,
 * thus it is important to note that port forwarding
 * should always be disabled when enabling the check.
 */

extern int nx_switch_received;

/*
 * Parameters read from the switch command.
 */

extern char nx_switch_cookie[256];
extern char nx_switch_host[256];
extern int  nx_switch_proxy;
extern int  nx_switch_port;
extern int  nx_switch_in;
extern int  nx_switch_out;
extern char nx_switch_mode[256];
extern char nx_switch_options[1024];
extern int  nx_switch_internal;
extern int  nx_switch_forward;

/*
 * Buffer the input while looking for the command.
 * The buffering happens by flushing the input when
 * a newline is received. This means that all input
 * should be terminated with a newline or it will
 * remain in the buffer and will never be sent to
 * the packet interface.
 */

int nx_check_channel_input(Channel *channel, char *data, int *length, int limit);

/*
 * Init buffer
 */
void nx_proxy_init();

/*
 * Replace the select() with the version managing
 * the NX descriptors.
 */

int nx_proxy_select(int maxfds, fd_set *readfds, fd_set *writefds,
                        fd_set *exceptfds, struct timeval *timeout);

/*
 * Connect to the NX transport.
 */

int nx_open_proxy_connection();

/*
 * Wait for the NX transport to terminate.
 */

int nx_close_proxy_connection();

/*
 * If cookie was passed, manage authentication.
 */

int nx_check_proxy_authentication(int proxy_fd);

/*
 * Reassign the descriptors.
 */

int nx_switch_client_side_descriptors(Channel *channel, int proxy_fd);

/*
 * Reassign the descriptors.
 */

int nx_switch_forward_descriptors(Channel *channel);

/*
 * Forward port to remote sshd.
 */

int nx_switch_forward_port(Channel *channel);

/*
 * Used in ssh.c to monitor the standard input
 * until the switch command is received.
 */

int nx_check_standard_input();

/*
 * Used in ssh.c. Connect to the proxy and run the
 * restricted loop forwarding the traffic to the
 * local proxy.
 */

void nx_switch_server_side_descriptors();

/*
 * Set the preferred options for using the socket
 * with NX.
 */

void nx_set_socket_options(int fd, int blocking);

/*
 * Wrappers used to get and set the environment.
 */

const char *nx_get_environment(const char *name);
int nx_set_environment(const char *name, const char *value);
