Пример #1
0
/*
 * Last exit routine...
 * Use global *tty_tmp and terms[]
 */
void 
g00dbye(void)
{
    write_log(0," g00dbye function called from %d\n",(int)pthread_self());
    
    term_delete_all_tty();
    
#ifdef HAS_CURSES
    if (tty_tmp->interactive && (terms->gui_th.id != 0))
       thread_destroy(&terms->gui_th);
#endif

#ifdef HAVE_GTK
    if (tty_tmp->gtk && (terms->gui_gtk_th.id != 0)) {
       thread_destroy(&terms->gui_gtk_th);
    }
#endif

#ifdef HAVE_REMOTE_ADMIN
    if (tty_tmp->daemonize)
       admin_exit();
#endif

   /* Kill Uptime thread... */
   if (terms->uptime_th.id)
      thread_destroy_cancel(terms->uptime_th.id);
    
   if (tty_tmp && tty_tmp->term)
      free(tty_tmp->term);

   /* Destroy interfaces only if they are initialized!! */
   if (terms) 
      interfaces_destroy(&terms->pcap_listen_th);

   protocol_destroy();

   if (terms)
      term_destroy();
   
   if (!tty_tmp->daemonize)
   {
      write_log(0, " Showing MOTD..\n");
      show_vty_motd();
   }

   finish_log();

   if (tty_tmp)
      free(tty_tmp);

   exit(0);
}
Пример #2
0
int
main(int argc, char *argv[])
{
	struct passwd *pw;
	char *ctlpath = NULL;
	int ch, debug = 0;

	while ((ch = getopt(argc, argv, "ds:")) != -1) {
		switch (ch) {
		case 'd':
			++debug;
			break;
		case 's':
			ctlpath = optarg;
			break;
		default:
			return usage();
		}
	}

	argc -= optind;
	argv += optind;

	if ((pw = getpwnam(UNPRIVILEGED_USER)) == NULL)
		err(1, "there isn't any user called " UNPRIVILEGED_USER);

	if (control_sock == -1)
		control_sock = control_init(ctlpath, pw->pw_uid, pw->pw_gid);
	if (control_sock == -1)
		errx(1, "there isn't any control socket.");

	if ((kernel_rtsock = rtsock_init()) == -1)
		errx(1, "there isn't any routing socket.");

	log_init(debug);
	log_info("starting");

	if (!debug)
		daemon(1, 0);

	drop_privileges(pw);
	set_defaults();

	if (event_init() == NULL)
		fatal("event_init");

	if (interfaces_discover() == -1)
		fatal("discovering interfaces");

	signal_set(&sigevents[0], SIGHUP, unprivileged_signal_handler, NULL);
	signal_set(&sigevents[1], SIGINT, unprivileged_signal_handler, NULL);
	signal_set(&sigevents[2], SIGTERM, unprivileged_signal_handler, NULL);
	signal_set(&sigevents[3], SIGCHLD, unprivileged_signal_handler, NULL);
	signal_set(&sigevents[4], SIGPIPE, unprivileged_signal_handler, NULL);

	for (int i = 0; i < __SIGNAL_HANDLERS__; ++i)
		if (signal_add(&sigevents[i], NULL))
			fatal("signal_add");

	event_set(&events[CONTROL_SOCKET], control_sock, EV_READ | EV_PERSIST,
	    control_accept, NULL);
	event_set(&events[ROUTING_SOCKET], kernel_rtsock, EV_READ | EV_PERSIST,
	    rtsock_dispatch, NULL);
	event_set(&events[PRIVSEP_SOCKET], privsep_sock, EV_READ | EV_PERSIST,
	    unprivileged_dispatch, NULL);

	//for (int i = 0; i < __SOCKETS_ALWAYS_PRESENT__; ++i)
	for (int i = 0; i <= PRIVSEP_SOCKET; ++i)
		if (event_add(events + i, NULL))
			fatal("event_add");

	stats[STATS_DAEMON_STARTED] = time(NULL);
	event_dispatch();

	close(control_sock);
	unsatisfied_purge();
	interfaces_destroy();
	log_info("exitting %s", privileged_exit_code ? "badly" : "gracefully");
	return (privileged_exit_code);
}