Lot of cleanups wrt init and killing links
Cleanup sample config (make cert). Implement some free functions (log_free and link_kill). Move utility macros in src/util.h Reorganiize initialisation functions.
This commit is contained in:
parent
995b3f071a
commit
d7e870fe67
@ -13,7 +13,7 @@ port = 7778;
|
||||
|
||||
# If you set this to true, you'll only be able to connect to bip
|
||||
# with a SSL capable IRC client. Be sure to generate a certificate
|
||||
# for bip with 'make cert'
|
||||
# for bip using scripts/bipgenconfig.
|
||||
client_side_ssl = false;
|
||||
|
||||
log_level = 3;
|
||||
|
173
src/bip.c
173
src/bip.c
@ -25,22 +25,6 @@
|
||||
#include "bip.h"
|
||||
#include "line.h"
|
||||
|
||||
#define MOVE_STRING(dest, src) do {\
|
||||
if (dest)\
|
||||
free(dest);\
|
||||
(dest) = (src);\
|
||||
(src) = NULL;\
|
||||
} while(0)
|
||||
|
||||
#define FREE(a) free(a); (a) = NULL;
|
||||
|
||||
#define MAYFREE(a) do { \
|
||||
if (a) { \
|
||||
free(a); \
|
||||
(a) = NULL; \
|
||||
} \
|
||||
} while(0);
|
||||
|
||||
int sighup = 0;
|
||||
|
||||
char *conf_log_root;
|
||||
@ -154,7 +138,6 @@ FILE *conf_global_log_file;
|
||||
|
||||
static pid_t daemonize(void)
|
||||
{
|
||||
char buf[4096];
|
||||
switch (fork()) {
|
||||
case -1:
|
||||
fatal("Fork failed");
|
||||
@ -550,6 +533,47 @@ static int add_user(bip_t *bip, list_t *data)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int validate_config(bip_t *bip)
|
||||
{
|
||||
/* nick username realname or default_{nick,username,realname} in user */
|
||||
hash_iterator_t it, sit;
|
||||
struct user *user;
|
||||
struct link *link;
|
||||
int r = 1;
|
||||
|
||||
for (hash_it_init(&bip->users, &it); (user = hash_it_item(&it));
|
||||
hash_it_next(&it)) {
|
||||
if (!user->default_nick || !user->default_username ||
|
||||
!user->default_realname) {
|
||||
for (hash_it_init(&user->connections, &sit);
|
||||
(link = hash_it_item(&sit));
|
||||
hash_it_next(&sit)) {
|
||||
if ((!link->username &&
|
||||
!user->default_username) ||
|
||||
(!link->connect_nick &&
|
||||
!user->default_nick) ||
|
||||
(!link->realname &&
|
||||
!user->default_realname))
|
||||
link_kill(bip, link);
|
||||
//conf_die("user: ... net: ... can i has nick/user/rael");
|
||||
r = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#warning CODE ME
|
||||
#if 0
|
||||
if (conf_backlog && !conf_log) {
|
||||
if (conf_backlog_lines == 0) {
|
||||
conf_die("You must set conf_backlog_lines if "
|
||||
"conf_log = false and "
|
||||
"conf_backlog = true");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return r;
|
||||
}
|
||||
|
||||
int fireup(bip_t *bip, FILE *conf)
|
||||
{
|
||||
struct tuple *t;
|
||||
@ -631,71 +655,7 @@ int fireup(bip_t *bip, FILE *conf)
|
||||
free(root_list);
|
||||
root_list = NULL;
|
||||
|
||||
#warning move me
|
||||
#if 0
|
||||
if (conf_backlog && !conf_log) {
|
||||
if (conf_backlog_lines == 0) {
|
||||
conf_die("You must set conf_backlog_lines if "
|
||||
"conf_log = false and "
|
||||
"conf_backlog = true");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!conf_log)
|
||||
conf_memlog = 1;
|
||||
else
|
||||
conf_memlog = 0;
|
||||
|
||||
/*
|
||||
check_networks(networkl);
|
||||
check_clients(userl);
|
||||
*/
|
||||
|
||||
if (!conf_biphome) {
|
||||
char *home = getenv("HOME");
|
||||
if (!home) {
|
||||
conf_die("no $HOME !, do you live in a trailer ?");
|
||||
return 0;
|
||||
}
|
||||
conf_biphome = malloc(strlen(home) + strlen("/.bip") + 1);
|
||||
strcpy(conf_biphome, home);
|
||||
strcat(conf_biphome, "/.bip");
|
||||
}
|
||||
if (!conf_log_root) {
|
||||
char *ap = "/logs";
|
||||
conf_log_root = malloc(strlen(conf_biphome) + strlen(ap) + 1);
|
||||
strcpy(conf_log_root, conf_biphome);
|
||||
strcat(conf_log_root, ap);
|
||||
mylog(LOG_INFO, "Default log root: %s", conf_log_root);
|
||||
}
|
||||
if (!conf_pid_file) {
|
||||
char *pid = "/bip.pid";
|
||||
conf_pid_file = malloc(strlen(conf_biphome) + strlen(pid) + 1);
|
||||
strcpy(conf_pid_file, conf_biphome);
|
||||
strcat(conf_pid_file, pid);
|
||||
mylog(LOG_INFO, "Default pid file: %s", conf_pid_file);
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBSSL
|
||||
conf_ssl_certfile = NULL; /* Make into a config option */
|
||||
if (!conf_ssl_certfile) {
|
||||
char *ap = "/bip.pem";
|
||||
if (conf_ssl_certfile) {
|
||||
free(conf_ssl_certfile);
|
||||
conf_ssl_certfile = NULL;
|
||||
}
|
||||
conf_ssl_certfile = malloc(strlen(conf_biphome) +
|
||||
strlen(ap) + 1);
|
||||
strcpy(conf_ssl_certfile, conf_biphome);
|
||||
strcat(conf_ssl_certfile, ap);
|
||||
mylog(LOG_INFO, "Default SSL certificate file: %s",
|
||||
conf_ssl_certfile);
|
||||
}
|
||||
#endif
|
||||
if (!conf_log_format)
|
||||
conf_log_format = "%u/%n/%Y-%m/%c.%d.log";
|
||||
|
||||
validate_config(bip);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -853,9 +813,11 @@ void ircize(bip_t *bip)
|
||||
|
||||
static void log_file_setup(void)
|
||||
{
|
||||
char buf[4096];
|
||||
|
||||
if (conf_log_system) {
|
||||
if (conf_global_log_file && conf_global_log_file != stderr)
|
||||
fclose(conf_log_system);
|
||||
fclose(conf_global_log_file);
|
||||
snprintf(buf, 4095, "%s/bip.log", conf_log_root);
|
||||
FILE *f = fopen(buf, "a");
|
||||
if (!f)
|
||||
@ -937,6 +899,7 @@ int main(int argc, char **argv)
|
||||
fatal("%s config file not found", confpath);
|
||||
}
|
||||
|
||||
|
||||
r = fireup(&bip, conf);
|
||||
fclose(conf);
|
||||
if (!r) {
|
||||
@ -944,6 +907,50 @@ int main(int argc, char **argv)
|
||||
exit(28);
|
||||
}
|
||||
|
||||
if (!conf_biphome) {
|
||||
char *home = getenv("HOME");
|
||||
if (!home) {
|
||||
conf_die("no $HOME !, do you live in a trailer ?");
|
||||
return 0;
|
||||
}
|
||||
conf_biphome = malloc(strlen(home) + strlen("/.bip") + 1);
|
||||
strcpy(conf_biphome, home);
|
||||
strcat(conf_biphome, "/.bip");
|
||||
}
|
||||
if (!conf_log_root) {
|
||||
char *ap = "/logs";
|
||||
conf_log_root = malloc(strlen(conf_biphome) + strlen(ap) + 1);
|
||||
strcpy(conf_log_root, conf_biphome);
|
||||
strcat(conf_log_root, ap);
|
||||
mylog(LOG_INFO, "Default log root: %s", conf_log_root);
|
||||
}
|
||||
if (!conf_pid_file) {
|
||||
char *pid = "/bip.pid";
|
||||
conf_pid_file = malloc(strlen(conf_biphome) + strlen(pid) + 1);
|
||||
strcpy(conf_pid_file, conf_biphome);
|
||||
strcat(conf_pid_file, pid);
|
||||
mylog(LOG_INFO, "Default pid file: %s", conf_pid_file);
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBSSL
|
||||
conf_ssl_certfile = NULL; /* Make into a config option */
|
||||
if (!conf_ssl_certfile) {
|
||||
char *ap = "/bip.pem";
|
||||
if (conf_ssl_certfile) {
|
||||
free(conf_ssl_certfile);
|
||||
conf_ssl_certfile = NULL;
|
||||
}
|
||||
conf_ssl_certfile = malloc(strlen(conf_biphome) +
|
||||
strlen(ap) + 1);
|
||||
strcpy(conf_ssl_certfile, conf_biphome);
|
||||
strcat(conf_ssl_certfile, ap);
|
||||
mylog(LOG_INFO, "Default SSL certificate file: %s",
|
||||
conf_ssl_certfile);
|
||||
}
|
||||
#endif
|
||||
if (!conf_log_format)
|
||||
conf_log_format = "%u/%n/%Y-%m/%c.%d.log";
|
||||
|
||||
check_dir(conf_log_root, 1);
|
||||
fd = do_pid_stuff();
|
||||
pid_t pid = 0;
|
||||
|
@ -882,7 +882,7 @@ static void create_socket(char *dsthostname, char *dstport, char *srchostname,
|
||||
connecting_data_free(cdata);
|
||||
cdata = NULL;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (srchostname || srcport) {
|
||||
if ((err = getaddrinfo(srchostname, srcport, &hint,
|
||||
@ -925,7 +925,7 @@ static void create_listening_socket(char *hostname, char *port,
|
||||
if (err) {
|
||||
mylog(LOG_DEBUG, "getaddrinfo(): %s", gai_strerror(err));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
for (cur = res ; cur ; cur = cur->ai_next) {
|
||||
if ((cn->handle = socket(cur->ai_family, cur->ai_socktype,
|
||||
|
39
src/irc.c
39
src/irc.c
@ -530,7 +530,6 @@ static void irc_send_join(struct link_client *ic, struct channel *chan)
|
||||
|
||||
WRITE_LINE3(CONN(ic), P_SERV, "366", LINK(ic)->l_server->nick,
|
||||
chan->name, "End of /NAMES list.");
|
||||
|
||||
}
|
||||
|
||||
static void write_init_string(connection_t *c, struct line *line, char *nick)
|
||||
@ -1921,7 +1920,6 @@ static void irc_close(struct link_any *l)
|
||||
irc_notify_disconnection(is);
|
||||
else
|
||||
LINK(is)->s_conn_attempt++;
|
||||
printf("%d\n", LINK(is)->s_conn_attempt);
|
||||
irc_server_shutdown(is);
|
||||
log_disconnected(LINK(is)->log);
|
||||
|
||||
@ -2418,3 +2416,40 @@ struct link *irc_link_new()
|
||||
return link;
|
||||
}
|
||||
|
||||
void link_kill(bip_t *bip, struct link *link)
|
||||
{
|
||||
int i;
|
||||
|
||||
hash_remove(&link->user->connections, link->name);
|
||||
free(link->name);
|
||||
irc_close((struct link_any *)link->l_server);
|
||||
while (link->l_clientc)
|
||||
irc_close((struct link_any *)link->l_clientv[0]);
|
||||
log_free(link->log);
|
||||
MAYFREE(link->prev_nick);
|
||||
MAYFREE(link->cli_nick);
|
||||
|
||||
void *p;
|
||||
while ((p = list_remove_first(&link->init_strings)))
|
||||
free(p);
|
||||
while ((p = list_remove_first(&link->on_connect_send)))
|
||||
free(p);
|
||||
MAYFREE(link->no_client_away_msg);
|
||||
MAYFREE(link->away_nick);
|
||||
hash_clean(&link->chan_infos);
|
||||
|
||||
struct chan_infos *ci;
|
||||
while ((ci = list_remove_first(&link->chan_infos_order)))
|
||||
free(ci);
|
||||
|
||||
MAYFREE(link->username);
|
||||
MAYFREE(link->realname);
|
||||
MAYFREE(link->s_password);
|
||||
MAYFREE(link->connect_nick);
|
||||
MAYFREE(link->vhost);
|
||||
#ifdef HAVE_LIBSSL
|
||||
MAYFREE(link->ssl_check_store);
|
||||
sk_X509_free(link->untrusted_certs);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -248,6 +248,7 @@ int ischannel(char p);
|
||||
void irc_client_close(struct link_client *);
|
||||
void irc_client_free(struct link_client *);
|
||||
struct link *irc_link_new();
|
||||
void link_kill(bip_t *bip, struct link *);
|
||||
void unbind_from_link(struct link_client *ic);
|
||||
#endif
|
||||
|
||||
|
18
src/log.c
18
src/log.c
@ -1148,3 +1148,21 @@ log_t *log_new(struct user *user, char *network)
|
||||
list_add_last(log_all_logs, logdata);
|
||||
return logdata;
|
||||
}
|
||||
|
||||
void log_free(log_t *log)
|
||||
{
|
||||
hash_iterator_t it;
|
||||
logfilegroup_t *lfg;
|
||||
logfile_t *lf;
|
||||
|
||||
for (hash_it_init(&log->logfgs, &it); (lfg = hash_it_item(&it));
|
||||
hash_it_next(&it)) {
|
||||
log_reset(lfg);
|
||||
if ((lf = list_remove_first(&lfg->file_group)))
|
||||
logfile_free(lf);
|
||||
free(lf);
|
||||
}
|
||||
hash_clean(&log->logfgs);
|
||||
free(log);
|
||||
}
|
||||
|
||||
|
17
src/util.h
17
src/util.h
@ -56,6 +56,22 @@ typedef struct hash_iterator {
|
||||
hash_t *hash;
|
||||
} hash_iterator_t;
|
||||
|
||||
#define MOVE_STRING(dest, src) do {\
|
||||
if (dest)\
|
||||
free(dest);\
|
||||
(dest) = (src);\
|
||||
(src) = NULL;\
|
||||
} while(0)
|
||||
|
||||
#define FREE(a) free(a); (a) = NULL;
|
||||
|
||||
#define MAYFREE(a) do { \
|
||||
if (a) { \
|
||||
free(a); \
|
||||
(a) = NULL; \
|
||||
} \
|
||||
} while(0);
|
||||
|
||||
void list_init(list_t *list, int (*cmp)(void*,void*));
|
||||
int list_ptr_cmp(void *a, void *b);
|
||||
list_t *list_new(int (*cmp)(void *, void *));
|
||||
@ -97,4 +113,5 @@ char *strmaydup(char *s);
|
||||
|
||||
void strucase(char *s);
|
||||
int ischannel(char p);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user