diff --git a/samples/bip.conf b/samples/bip.conf index 99b8f22..f8ffa33 100644 --- a/samples/bip.conf +++ b/samples/bip.conf @@ -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; diff --git a/src/bip.c b/src/bip.c index dfef0f2..1c4bb73 100644 --- a/src/bip.c +++ b/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; diff --git a/src/connection.c b/src/connection.c index 94f6ee2..862c1ae 100644 --- a/src/connection.c +++ b/src/connection.c @@ -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, diff --git a/src/irc.c b/src/irc.c index 6bd3581..1a01c9f 100644 --- a/src/irc.c +++ b/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 +} + diff --git a/src/irc.h b/src/irc.h index 16f9fbf..f510e38 100644 --- a/src/irc.h +++ b/src/irc.h @@ -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 diff --git a/src/log.c b/src/log.c index 742f148..236d3ae 100644 --- a/src/log.c +++ b/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); +} + diff --git a/src/util.h b/src/util.h index 9770a09..1126541 100644 --- a/src/util.h +++ b/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