/** * Unloads plugin * @param plugin Plugin that should be unloaded. */ void plugins_unloadplugin(Plugin plugin) { if (plugin->beforeDepsUnload != NULL) { plugin->beforeDepsUnload(plugin->info); } // Unload all plugin's dependencies. if (plugin->deps != NULL) { TOKENS tok = tokenizer_tokenize(plugin->deps, ','); for (size_t i = 0; i < tok->count; i++) { if (plugins_isloaded(tokenizer_gettok(tok, i))) { plugins_unload(tokenizer_gettok(tok, i)); } } tokenizer_free(tok); } if (plugin->done != NULL) { plugin->done(plugin->info); } // Free plugin handle. if (dlclose(plugin->handle) != 0) { printError("plugins", "Unable to unload library: %s", dlerror()); } free(plugin->info); free(plugin->name); free(plugin->path); // Remove plugin from chain if (plugin->prev != NULL) { plugin->prev->next = plugin->next; } else { loadedPlugins->first = plugin->next; } if (plugin->next != NULL) { plugin->next->prev = plugin->prev; } else { loadedPlugins->last = plugin->prev; } free(plugin); } // plugins_unloadplugin
void sighandler (int sig) { switch (sig) { case SIGABRT: logstr ("\tSIGABRT\n"); break; case SIGBUS: logstr ("\tSIGBUS\n"); break; case SIGHUP: logstr ("\tSIGHUP\n"); break; case SIGINT: logstr ("\tSIGINT\n"); break; case SIGKILL: logstr ("\tSIGKILL\n"); break; case SIGQUIT: logstr ("\tSIGQUIT\n"); break; case SIGTERM: logstr ("\tSIGTERM\n"); break; case 0: logstr ("exiting, goodbye\n"); break; default: break; } if (settings->socket) { fclose (settings->socket); settings->socket = NULL; } plugins_unload (); }
int main(int argc, char **argv) { int ret, opt, conn, plugins_loaded = 0, banner_displayed = 0; unsigned long now, lastconn = time(NULL); FILE *urandom; runlevel = RL_OFFLINE; while ((opt = getopt(argc, argv, "c:dj:u:vh")) != -1) { switch(opt) { case 'c': settings.config = optarg; break; case 'd': settings.daemonize = 1; break; case 'j': settings.chroot = optarg; break; case 'u': settings.chuser = optarg; break; case 'v': print_version(); break; case 'h': default: print_usage(argv[0]); break; } } srand(time(NULL)); urandom = fopen("/dev/urandom", "r"); srrand(time(NULL) ^ getpid(), urandom); if (config_parse(settings.config)) { fprintf(stderr, "Unable to load configuration file '%s'.\n", settings.config); return -1; } if (checkconfig()) return -1; if (settings.daemonize) { ret = fork(); switch(ret) { case -1: fprintf(stderr, "Unable to fork to background\n"); return -1; default: return 0; } } if (secure_it(settings.chroot, settings.chuser)) { fprintf(stderr, "Failed to chroot/setuid\n"); return -1; } #ifdef TLS if (gnutls_global_init() == GNUTLS_E_SUCCESS) atexit(gnutls_global_deinit); else fprintf(stderr, "Unable to initialize TLS library\n"); #endif if (dns_init() == -1) warn("Unable to initialize dns resolver\n"); for(runlevel = RL_RUNNING; runlevel;) { if (irc_init() == -1) { warn("Unable to init irc data structure"); return -1; } if(!plugins_loaded) { plugins_load(); plugins_loaded = 1; } if(!banner_displayed) { banner_displayed = banner("Welcome to " PACKAGE_STRING #ifdef SVN_REV "." SVN_REV #endif ); } while ((runlevel == RL_RUNNING) && (irc_conn() == -1)) { warn("Unable to establish irc connection\n"); sleep(RECONNECT_DELAY); } lastconn = time(NULL); while(runlevel == RL_RUNNING) io_loop(100); irc_free(); if((runlevel != RL_RUNNING) && plugins_loaded) { plugins_unload(); plugins_loaded = 0; } if(runlevel == RL_RELOAD) { printc("Reloading config file '%s'...\n", settings.config); if(config_parse(settings.config)) { warn("Error reloading config file.\n"); runlevel = RL_OFFLINE; } else if(checkconfig()) { runlevel = RL_OFFLINE; } runlevel = RL_RUNNING; } conn = 0; now = time(NULL); if(runlevel != RL_OFFLINE) { runlevel = RL_RUNNING; if (now < lastconn + RECONNECT_DELAY) sleep(lastconn + RECONNECT_DELAY - now); } } if(urandom) fclose(urandom); return 0; }