gint gnome_score_init (const gchar * gamename) { int inpipe[2], outpipe[2]; /* *creates a child process with which we communicate through a pair of pipes, * then drops privileges. */ if (!gamename) gamename = ""; if (!(defgamename = g_strdup (gamename)) || pipe(inpipe)) { drop_perms(); return -1; } if (pipe (outpipe)) { close (inpipe[0]); close (inpipe[1]); drop_perms (); return -1; } outfd = outpipe[1]; infd = inpipe[0]; #ifndef G_OS_WIN32 switch (fork ()) { case 0: if (dup2 (outpipe[0], STDIN_FILENO) == -1 || dup2 (inpipe[1], STDOUT_FILENO) == -1) exit (EXIT_FAILURE); close(inpipe[0]); close(inpipe[1]); close(outpipe[0]); close(outpipe[1]); exit (gnome_score_child (STDIN_FILENO, STDOUT_FILENO)); case -1: close (inpipe[0]); close (inpipe[1]); close (outpipe[0]); close (outpipe[1]); infd = outfd = -1; drop_perms (); return -1; } close(outpipe[0]); close(inpipe[1]); drop_perms (); #else { int a[2] = { outpipe[0], inpipe[1] }; g_thread_create (gnome_score_child_thread, a, FALSE, NULL); } #endif return 0; }
int main(int argc, char **argv) { const char *config_file = "/etc/sniproxy.conf"; int background_flag = 1; int max_nofiles = 65536; int opt; while ((opt = getopt(argc, argv, "fc:n:V")) != -1) { switch (opt) { case 'c': config_file = optarg; break; case 'f': /* foreground */ background_flag = 0; break; case 'n': max_nofiles = atoi(optarg); break; case 'V': printf("sniproxy %s\n", sniproxy_version); #ifdef HAVE_LIBUDNS printf("compiled with udns support\n"); #endif return EXIT_SUCCESS; default: usage(); return EXIT_FAILURE; } } config = init_config(config_file, EV_DEFAULT); if (config == NULL) { fprintf(stderr, "Unable to load %s\n", config_file); usage(); return EXIT_FAILURE; } /* ignore SIGPIPE, or it will kill us */ signal(SIGPIPE, SIG_IGN); if (background_flag) { if (config->pidfile != NULL) remove(config->pidfile); daemonize(); if (config->pidfile != NULL) write_pidfile(config->pidfile, getpid()); } start_binder(); set_limits(max_nofiles); init_listeners(&config->listeners, &config->tables, EV_DEFAULT); /* Drop permissions only when we can */ drop_perms(config->user ? config->user : default_username); ev_signal_init(&sighup_watcher, signal_cb, SIGHUP); ev_signal_init(&sigusr1_watcher, signal_cb, SIGUSR1); ev_signal_init(&sigusr2_watcher, signal_cb, SIGUSR2); ev_signal_init(&sigint_watcher, signal_cb, SIGINT); ev_signal_init(&sigterm_watcher, signal_cb, SIGTERM); ev_signal_start(EV_DEFAULT, &sighup_watcher); ev_signal_start(EV_DEFAULT, &sigusr1_watcher); ev_signal_start(EV_DEFAULT, &sigusr2_watcher); ev_signal_start(EV_DEFAULT, &sigint_watcher); ev_signal_start(EV_DEFAULT, &sigterm_watcher); resolv_init(EV_DEFAULT, config->resolver.nameservers, config->resolver.search, config->resolver.mode); init_connections(); ev_run(EV_DEFAULT, 0); free_connections(EV_DEFAULT); resolv_shutdown(EV_DEFAULT); free_config(config, EV_DEFAULT); stop_binder(); return 0; }