X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/de9510bcaba3fc0377e09259f8b49921c421d269..ef5e03051fd86d66844d61f3fcc1c7a82957826a:/src/main.c diff --git a/src/main.c b/src/main.c index bc378c1..920ef58 100644 --- a/src/main.c +++ b/src/main.c @@ -1,11 +1,11 @@ -/* main.c - srvx +/* main.c - X3 * Copyright 2000-2004 srvx Development Team * * This file is part of x3. * - * srvx is free software; you can redistribute it and/or modify + * x3 is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -26,6 +26,8 @@ #include "modcmd.h" #include "saxdb.h" #include "sendmail.h" +#include "spamserv.h" +#include "shun.h" #include "timeq.h" #include "chanserv.h" @@ -95,6 +97,7 @@ static const struct message_entry msgtab[] = { { "MSG_MODULE_UNKNOWN", "No module has been registered with name $b%s$b." }, { "MSG_INVALID_MODES", "$b%s$b is an invalid set of channel modes." }, { "MSG_INVALID_GLINE", "Invalid G-line '%s'." }, + { "MSG_INVALID_SHUN", "Invalid Shun '%s'." }, { "MSG_INVALID_DURATION", "Invalid time span '%s'." }, { "MSG_NOT_TARGET_NAME", "You must provide the name of a channel or user." }, { "MSG_NOT_CHANNEL_NAME", "The channel name you specified is not a valid channel name." }, @@ -142,10 +145,9 @@ uplink_insert(const char *key, void *data, UNUSED_ARG(void *extra)) { struct uplinkNode *uplink = malloc(sizeof(struct uplinkNode)); struct record_data *rd = data; + struct addrinfo hints, *ai; int enabled = 1; char *str; - struct sockaddr_in *sin; - unsigned long addr; if(!uplink) { @@ -175,15 +177,17 @@ uplink_insert(const char *key, void *data, UNUSED_ARG(void *extra)) uplink->tries = 0; str = database_get_data(rd->d.object, "bind_address", RECDB_QSTRING); - uplink->bind_addr_len = sizeof(*sin); - if (str && getipbyname(str, &addr)) + memset(&hints, 0, sizeof(hints)); + hints.ai_flags = AI_PASSIVE; + hints.ai_socktype = SOCK_STREAM; + if (!getaddrinfo(str, NULL, &hints, &ai)) { - sin = calloc(1, uplink->bind_addr_len); - sin->sin_family = AF_INET; - sin->sin_addr.s_addr = addr; - uplink->bind_addr = sin; - } - else + uplink->bind_addr_len = ai->ai_addrlen; + uplink->bind_addr = calloc(1, ai->ai_addrlen); + memcpy(uplink->bind_addr, ai->ai_addr, ai->ai_addrlen); + freeaddrinfo(ai); + } + else { uplink->bind_addr = NULL; uplink->bind_addr_len = 0; @@ -518,21 +522,6 @@ conf_globals(void) const char *info; dict_t dict; - info = conf_get_data("services/global/nick", RECDB_QSTRING); - if (info && (info[0] == '.')) - info = NULL; - init_global(info); - - info = conf_get_data("services/nickserv/nick", RECDB_QSTRING); - if (info && (info[0] == '.')) - info = NULL; - init_nickserv(info); - - info = conf_get_data("services/chanserv/nick", RECDB_QSTRING); - if (info && (info[0] == '.')) - info = NULL; - init_chanserv(info); - god_policer_params = policer_params_new(); if ((dict = conf_get_data("policers/commands-god", RECDB_OBJECT))) { dict_foreach(dict, set_policer_param, god_policer_params); @@ -559,6 +548,26 @@ conf_globals(void) if (info && (info[0] == '.')) info = NULL; init_opserv(info); + + info = conf_get_data("services/global/nick", RECDB_QSTRING); + if (info && (info[0] == '.')) + info = NULL; + init_global(info); + + info = conf_get_data("services/nickserv/nick", RECDB_QSTRING); + if (info && (info[0] == '.')) + info = NULL; + init_nickserv(info); + + info = conf_get_data("services/chanserv/nick", RECDB_QSTRING); + if (info && (info[0] == '.')) + info = NULL; + init_chanserv(info); + + info = conf_get_data("services/spamserv/nick", RECDB_QSTRING); + if (info && (info[0] == '.')) + info = NULL; + init_spamserv(info); } #ifdef HAVE_SYS_RESOURCE_H @@ -566,12 +575,13 @@ conf_globals(void) static int set_item_rlimit(const char *name, void *data, void *extra) { - int rsrc, found; + long rsrc; + int found; struct record_data *rd = data; struct rlimit rlim; const char *str; - rsrc = (int)dict_find(extra, name, &found); + rsrc = (long)dict_find(extra, name, &found); if (!found) { log_module(MAIN_LOG, LOG_ERROR, "Invalid rlimit \"%s\" in rlimits section.", name); return 0; @@ -665,7 +675,7 @@ void license() { printf("\n" "This program is free software; you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" - "the Free Software Foundation; either version 2 of the License, or\n" + "the Free Software Foundation; either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" @@ -830,6 +840,7 @@ int main(int argc, char *argv[]) modcmd_init(); saxdb_init(); gline_init(); + shun_init(); sendmail_init(); helpfile_init(); conf_globals(); /* initializes the core services */