X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Fmain.c;h=fbf9ed5806f4b93d9cb0c292c1a07feb4ff32794;hb=0def65a9df6d9a295c064cba58af229b326f39fe;hp=dc76d7a661043e0fe36f98114a7a8744268f92f2;hpb=a0f5e337ee57df78939e9ddaccf9a18bcf811435;p=NeonServV5.git diff --git a/src/main.c b/src/main.c index dc76d7a..fbf9ed5 100644 --- a/src/main.c +++ b/src/main.c @@ -34,11 +34,12 @@ #include "ModeNode.h" #include "IRCQueue.h" #include "DBHelper.h" -#include "commands.h" #include "ConfigParser.h" #include "ssl.h" #include "QServer.h" #include "version.h" +#include "modules.h" +#include "module_commands.h" time_t start_time; static int running, hard_restart; @@ -61,6 +62,7 @@ static pthread_mutex_t log_sync; static void check_firstrun(); void cleanup() { + stop_modules(); free_sockets(); qserver_free(); free_parser(); @@ -69,7 +71,6 @@ void cleanup() { free_bind(); free_modcmd(); free_whoqueue(); - free_bots(); free_mysql(); free_handleinfohandler(); free_lang(); @@ -149,38 +150,57 @@ void exit_daemon() { if(daemonized) { remove(PID_FILE); } + if(log_fptr) { + fclose(log_fptr); + log_fptr = NULL; + } } int main(int argc, char *argv[]) { int run_as_daemon = 1; - int argi; + int c; process_argv = argv; process_argc = argc; printf("NeonServ v%s\n\n", NEONSERV_VERSION); - for(argi = 1; argi < argc; argi++) { - if(!strcmp(argv[argi], "-f") || !strcmp(argv[argi], "--foreground")) { + struct option options[] = { + {"show", 1, 0, 's'}, + {"foreground", 0, 0, 'f'}, + {"help", 0, 0, 'h'}, + {"version", 0, 0, 'v'}, + {0, 0, 0, 0} + }; + while ((c = getopt_long(argc, argv, "s:fvh", options, NULL)) != -1) { + switch (c) { + case 's': + print_loglevel = atoi(optarg); + break; + case 'f': run_as_daemon = 0; - } else if(!strcmp(argv[argi], "-s") || !strcmp(argv[argi], "--show")) { - if(argi+1 == argc) break; - argi++; - print_loglevel = atoi(argv[argi]); - } else if(!strcmp(argv[argi], "-v") || !strcmp(argv[argi], "--version")) { + break; + case 'v': printf("Version: %s.%d (%s)\n", NEONSERV_VERSION, patchlevel, (strcmp(revision, "") ? revision : "-")); printf("Build: #%s %s (%s lines, " COMPILER ")\n", compilation, creation, codelines); exit(0); - } else if(!strcmp(argv[argi], "-h") || !strcmp(argv[argi], "--help")) { + break; + case 'h': printf("Usage: ./neonserv [-s loglevel] [-f] [-h|-v]\n"); printf(" -s, --show show log lines matching loglevel in stdout.\n"); printf(" -f, --foreground run NeonServ in the foreground.\n"); printf(" -h, --help prints this usage message.\n"); printf(" -v, --version prints this program's version.\n"); exit(0); + break; } } + #ifndef WIN32 if(geteuid() == 0 || getuid() == 0) { fprintf(stderr, "NeonServ may not be run with super user privileges.\n"); exit(0); } + #endif + #ifdef ENABLE_MEMORY_DEBUG + initMemoryDebug(); + #endif if(!loadConfig(CONF_FILE)) { fprintf(stderr, "Unable to load " CONF_FILE "\n"); exit(0); @@ -194,6 +214,7 @@ int main(int argc, char *argv[]) { } check_firstrun(); if (run_as_daemon) { + #ifndef WIN32 /* Attempt to fork into the background if daemon mode is on. */ pid_t pid = fork(); if (pid < 0) { @@ -214,9 +235,10 @@ int main(int argc, char *argv[]) { fprintf(pidfile, "%i\n", (int)getpid()); fclose(pidfile); } - fclose(stdin); - fclose(stdout); - fclose(stderr); + fclose(stdin); fopen("/dev/null", "r"); + fclose(stdout); fopen("/dev/null", "w"); + fclose(stderr); fopen("/dev/null", "w"); + #endif } main: @@ -227,10 +249,6 @@ main: signal(SIGSEGV, sighandler); signal(SIGTERM, sighandler); - #ifdef ENABLE_MEMORY_DEBUG - initMemoryDebug(); - #endif - start_time = time(0); #ifdef WIN32 @@ -264,9 +282,10 @@ main: init_ModeNode(); init_bind(); init_modcmd(); + register_module_commands(); init_handleinfohandler(); init_tools(); - register_commands(); + loadModules(); init_bots(); init_DBHelper(); qserver_init(); @@ -274,9 +293,9 @@ main: load_languages(); int update_minutes = get_int_field("statistics.frequency"); if(!update_minutes) update_minutes = 2; - timeq_add(update_minutes * 60 + 10, main_statistics, NULL); + timeq_add(update_minutes * 60 + 10, 0, main_statistics, NULL); - timeq_add(90, main_checkauths, NULL); + timeq_add(90, 0, main_checkauths, NULL); int worker_threads = get_int_field("General.worker_threads"); if(!worker_threads) worker_threads = 1; @@ -291,7 +310,7 @@ main: int usleep_delay = 1000000 / TICKS_PER_SECOND; while(running) { timeq_tick(); - loop_bots(); + loop_modules(); qserver_loop(); queue_loop(); mysql_free(); @@ -313,7 +332,7 @@ main: } } while(time(0) < socket_wait); timeq_tick(); - loop_bots(); + loop_modules(); clearTempUsers(); destroyEvents(); qserver_loop(); @@ -441,7 +460,7 @@ TIMEQ_CALLBACK(main_checkauths) { if ((row = mysql_fetch_row(res)) != NULL) { lastcheck = atoi(row[1]); if(!lastcheck || unixtime - lastcheck >= min_unckecked) { - lookup_authname(row[0], main_checkauths_callback, NULL); + lookup_authname(row[0], 0, main_checkauths_callback, NULL); } else next_call = 300; } @@ -456,13 +475,13 @@ TIMEQ_CALLBACK(main_checkauths) { } } - timeq_add(next_call, main_checkauths, NULL); + timeq_add(next_call, 0, main_checkauths, NULL); } TIMEQ_CALLBACK(main_statistics) { int update_minutes = get_int_field("statistics.frequency"); if(!update_minutes) update_minutes = 2; - timeq_add(update_minutes * 60, main_statistics, NULL); + timeq_add(update_minutes * 60, 0, main_statistics, NULL); if(get_int_field("statistics.enable")) { statistics_enabled = 1; statistics_requested_lusers = 1; @@ -502,6 +521,14 @@ void statistics_update() { } } +time_t getStartTime() { + return start_time; +} + +int getRunningThreads() { + return running_threads; +} + void write_log(int loglevel, const char *line, int len) { SYNCHRONIZE(log_sync); if(!daemonized && (print_loglevel & loglevel)) {