#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include "mio/mio.h"
#include "sx/sx.h"
#include "sx/ssl.h"
#include "sx/sasl.h"
#ifdef HAVE_SIGNAL_H
# include <signal.h>
#endif
#ifdef HAVE_SYS_STAT_H
# include <sys/stat.h>
#endif
#include <pwd.h>
typedef struct s2s_st *s2s_t;
typedef struct pkt_st *pkt_t;
typedef struct conn_st *conn_t;
typedef struct dnscache_st *dnscache_t;
struct s2s_st {
char *id;
char *router_ip;
int router_port;
char *router_user;
char *router_pass;
char *router_pemfile;
int router_default;
mio_t mio;
sx_env_t sx_env;
sx_plugin_t sx_ssl;
sx_plugin_t sx_sasl;
sx_plugin_t sx_db;
sx_t router;
int fd;
int server_fd;
config_t config;
log_t log;
log_type_t log_type;
char *log_facility;
char *log_ident;
int retry_init;
int retry_lost;
int retry_sleep;
int retry_left;
char *local_ip;
int local_port;
char *local_resolver;
char *local_secret;
char *local_pemfile;
int check_interval;
int check_queue;
int check_invalid;
int check_keepalive;
int check_idle;
int require_tls;
int enable_whitelist;
char **whitelist_domains;
int n_whitelist_domains;
time_t last_queue_check;
time_t last_invalid_check;
time_t next_check;
prep_cache_t pc;
jqueue_t dead;
int started;
int online;
xht outq;
xht out;
xht in;
xht in_accept;
xht dnscache;
};
struct pkt_st {
nad_t nad;
jid_t from;
jid_t to;
int db;
char ip[INET6_ADDRSTRLEN];
int port;
};
typedef enum {
conn_NONE,
conn_INPROGRESS,
conn_VALID,
conn_INVALID
} conn_state_t;
struct conn_st {
s2s_t s2s;
char *key;
sx_t s;
int fd;
char ip[INET6_ADDRSTRLEN];
int port;
xht states;
xht states_time;
xht routes;
time_t init_time;
int online;
int verify;
time_t last_verify;
time_t last_activity;
time_t last_packet;
};
struct dnscache_st {
char name[1024];
char ip[INET6_ADDRSTRLEN];
int port;
time_t expiry;
time_t init_time;
int pending;
};
extern sig_atomic_t s2s_lost_router;
int s2s_router_mio_callback(mio_t m, mio_action_t a, int fd, void *data, void *arg);
int s2s_router_sx_callback(sx_t s, sx_event_t e, void *data, void *arg);
char *s2s_route_key(pool p, char *local, char *remote);
char *s2s_db_key(pool p, char *secret, char *remote, char *id);
void out_packet(s2s_t s2s, pkt_t pkt);
void out_resolve(s2s_t s2s, nad_t nad);
void out_dialback(s2s_t s2s, pkt_t pkt);
int out_bounce_queue(s2s_t s2s, const char *domain, int err);
int out_bounce_conn_queues(conn_t out, int err);
int in_mio_callback(mio_t m, mio_action_t a, int fd, void *data, void *arg);
#define S2S_DB_HEADER (1<<10)
#define MAX_DOMAIN_LEN 1023
int s2s_db_init(sx_env_t env, sx_plugin_t p, va_list args);
union xhashv
{
void **val;
char **char_val;
conn_t *conn_val;
conn_state_t *state_val;
jqueue_t *jq_val;
dnscache_t *dns_val;
};