#ifndef TOOLS_H
#define TOOLS_H

extern char *LOGFILE;

#define DB_USER "ftp"
#define DB_PWD  "cherokee"
#define DB_SERVER "212.126.65.175"

#define ZLIB_CHUNK 64000
#define ZLIB_LEVEL 1

char *display_zerr(int ret);



struct conn {
	int ipv6;
	int ftpuser_id;
        const SSL_METHOD *meth;
        SSL_CTX *ctx;
        SSL *ssl;
        BIO *sbio;
        X509 *peer;
        const SSL_CIPHER *ciph;
        char peer_CN[256];
	struct sockaddr_in from;
	struct sockaddr_in to;
	struct sockaddr_in6 from6;
	struct sockaddr_in6 to6;
	int state;
	int debug;
	int socket;
	int use_ssl;
	int use_data_ssl;
	char data_mode;     // S...Normal stream mode, Z...Mode 'Z' (ZLIB compression)
	char transfer_mode; // 0...Binary, 1...ASCII
	char passive;       // 0...normal, 1...passive mode
	char username[1024];
	char password[1024];
	char current_path[1024];
	char chroot_path[1024];
	char home_path[1024];
	int locking;
	int uid;
	int gid;
	int quota; // In MBytes...if -1...no quota
	char quotaexclude[1024]; // Directory NOT under quota
	int umask;
	struct sockaddr_in passive_socky;
	struct sockaddr_in6 passive_socky6;
	int passive_socket;
	struct sockaddr_in active_socky;
	int active_socket;
        const SSL_METHOD *passive_meth;
        SSL_CTX *passive_ctx;
        SSL *passive_ssl;
        BIO *passive_sbio;
        X509 *passive_peer;
        const SSL_CIPHER *passive_ciph;
        char passive_peer_CN[256];
        const SSL_METHOD *active_meth;
        SSL_CTX *active_ctx;
        SSL *active_ssl;
        BIO *active_sbio;
        X509 *active_peer;
        const SSL_CIPHER *active_ciph;
        char active_peer_CN[256];
	char rnfr[1024];
	int passive_nsock;
	off64_t bytes_in;
	off64_t bytes_out;
	off64_t cbytes_in;
	off64_t cbytes_out;
	char readonly;
	off64_t rest_pos;
	int idle_timeout;
	char *target;
	unsigned short target_family;
	int target_sock;
	int target_psock; // Client to target server in passive mode
	int target_ssock; // Server socket for passive mode
	int target_passive_ssl; // Use SSL also for passive conncetions (PROT P)

};

void logger(struct conn *fx, const char *fmt, ...);

PGconn *db_connect(char *dbname, char *host, char *port, char *user, char *pwd);

int sock_write_bytes(struct conn *co, char *buf, int len);
int sock_read_line(struct conn *co, char *buf, int len);
int write_data_socket(struct conn *co, char *buf, int len);
int read_data_socket(struct conn *co, char *buf, int len);

#define STATE_CONNECTED 0
#define STATE_USERSENT  1
#define STATE_LOGGEDIN  2


#define TRANSFER_MODE_BINARY 0
#define TRANSFER_MODE_ASCII  1

#endif
