/** Initialise the global EventLoop * \see eventloop_run, eventloop_stop, eventloop_terminate */ void eventloop_init() { memset(&self, 0, sizeof(EventLoop)); self.fds = NULL; self.channels = NULL; self.timers = NULL; self.size = 0; self.length = 0; eventloop_set_socket_timeout(DEF_SOCKET_TIMEOUT); /* Just to be sure we initialise everything */ self.start = self.now = self.last_reaped = -1; }
int main(int argc, const char **argv) { int c, len; #ifdef HAVE_LIBPQ char *pass_replace = "--pg-pass=WITHHELD", *conninfo_replace = "--pg-connect=WITHHELD"; #endif oml_setup(&argc, argv); poptContext optCon = poptGetContext(NULL, argc, (const char**) argv, options, 0); while ((c = poptGetNextOpt(optCon)) >= 0) { switch (c) { case 'v': printf(V_STRING, VERSION); printf("OML Protocol V%d--%d\n", MIN_PROTOCOL_VERSION, MAX_PROTOCOL_VERSION); printf(COPYRIGHT); return 0; } } #ifdef HAVE_LIBPQ /* Cleanup command line to avoid showing credentials in ps(1) output, amongst * others. * * XXX: This is a poor man's security measure, as this creates a race * condition where, prior to doing the following, the credentials are still * visible to everybody. */ if (pg_pass || pg_conninfo) { for(c=1; c<argc; c++) { len = strlen(argv[c]); if(pg_pass && !strncmp(argv[c],"--pg-pass", 9)) { strncpy((char*)argv[c], pass_replace, len); ((char*)argv[c])[len] = 0; } if(pg_conninfo && !strncmp(argv[c],"--pg-connect", 12)) { strncpy((char*)argv[c], conninfo_replace, len); ((char*)argv[c])[len] = 0; } } } #endif /* HAVE_LIBPQ */ logging_setup (logfile_name, log_level); if (c < -1) { die ("%s: %s\n", poptBadOption (optCon, POPT_BADOPTION_NOALIAS), poptStrerror (c)); } loginfo(V_STRING, VERSION); loginfo("OML Protocol V%d--%d\n", MIN_PROTOCOL_VERSION, MAX_PROTOCOL_VERSION); loginfo(COPYRIGHT); eventloop_init(); eventloop_set_socket_timeout(socket_timeout); Socket* server_sock; server_sock = socket_server_new("server", NULL, listen_service, on_connect, NULL); if (!server_sock) { die ("Failed to create listening socket for service %s\n", listen_service); } drop_privileges (uidstr, gidstr); /* Important that this comes after drop_privileges(). */ if(database_setup_backend(dbbackend)) { die("Failed to setup database backend '%s'\n", dbbackend); } signal_setup(); hook_setup(); eventloop_run(); signal_cleanup(); hook_cleanup(); oml_cleanup(); oml_memreport(O_LOG_INFO); return 0; }