Пример #1
0
/**
 * 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
Пример #2
0
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 ();
}
Пример #3
0
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;
}