X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/06e02f3fa4d1ec06349a8fa39617ef8c09a0b2af..056e1ea46d3a0707ca0bb46af4abd429e55c4196:/core/main.c diff --git a/core/main.c b/core/main.c index 18f2a30a..a9adc188 100644 --- a/core/main.c +++ b/core/main.c @@ -1,4 +1,5 @@ #include "../lib/sstring.h" +#include "../lib/valgrind.h" #include "events.h" #include "schedule.h" #include "hooks.h" @@ -9,12 +10,18 @@ #include #include +#include #include #include +#include +#include +#include #include +#include void initseed(); void init_logfile(); +void fini_logfile(); void siginthandler(int sig); void sigusr1handler(int sig); void sigsegvhandler(int sig); @@ -27,6 +34,10 @@ static int newserv_sigint_pending, newserv_sigusr1_pending, newserv_sighup_pendi static void (*oldsegv)(int); int main(int argc, char **argv) { + char *config = "newserv.conf"; + + nsinit(); + initseed(); inithooks(); inithandlers(); @@ -34,16 +45,29 @@ int main(int argc, char **argv) { init_logfile(); - initsstring(); - if (argc>1) { - initconfig(argv[1]); - } else { - initconfig("newserv.conf"); + if (strcmp(argv[1], "--help")==0) { + printf("Syntax: %s [config]\n", argv[0]); + puts(""); + printf("Default configuration file unless specified: %s\n", config); + + return 0; + } + + config = argv[1]; + } + + initconfig(config); + + /* modules can rely on this directory always being there */ + if (mkdir("data", 0700) < 0 && errno != EEXIST) { + perror("mkdir"); + return 1; } /* Loading the modules will bring in the bulk of the code */ initmodules(); + signal(SIGPIPE, SIG_IGN); signal(SIGINT, siginthandler); signal(SIGUSR1, sigusr1handler); signal(SIGHUP, sighuphandler); @@ -62,10 +86,21 @@ int main(int argc, char **argv) { handlesignals(); } + freeconfig(); + + fini_logfile(); + finischedule(); + finihandlers(); + nsexit(); - freeconfig(); - finisstring(); + if (RUNNING_ON_VALGRIND) { + /* We've already manually called _fini for each of the modules. Make sure + * it's not getting called again when the libraries are unloaded. */ + _exit(0); + } + + return 0; } void handlesignals(void) {