示例#1
0
void			trap_signals ()
{
	switch (trapping) {

	case -1:	/* first time */

#define	SETSIG(SIG) \
		if (signal(SIG, SIG_IGN) != SIG_IGN) \
			signal (SIG, catch);

		SETSIG (SIGHUP);
		SETSIG (SIGINT);
		SETSIG (SIGQUIT);
		SETSIG (SIGTERM);
		break;

	case 0:		/* currently ignoring */
		signal (SIGHUP, old_sighup);
		signal (SIGINT, old_sigint);
		signal (SIGQUIT, old_sigquit);
		signal (SIGTERM, old_sigterm);
		trapping = 1;
		break;

	case 1:		/* already trapping */
		break;

	}
	return;
}
示例#2
0
文件: sig.c 项目: carriercomm/finit
void sig_init(void)
{
	int i;
	struct sigaction sa;

	for (i = 1; i < NSIG; i++)
		IGNSIG(sa, i, SA_RESTART);

	SETSIG(sa, SIGCHLD, chld_handler, SA_RESTART);
}
示例#3
0
文件: nflogd.cpp 项目: urykhy/nflogd
int main(int argc, char** argv)
try
{
	if(!setup(argc, argv))
	{
		usage();
		exit(-2);
	}

	std::cerr << "parsed channels: ";
	std::copy(channel_list.begin(), channel_list.end(),
      std::ostream_iterator<int> (std::cerr, " "));
	std::cerr << std::endl;
	std::cerr << "nflogd starting..." << std::endl;

	PacketHandler ph(pcap_filename);
	NFmain nf(channel_list, [ph = std::ref(ph)](struct nflog_data *nfa){
       ph(nfa);
    });

	// setup signal
	SETSIG(SIGTERM, term_handler, SA_RESTART);
	SETSIG(SIGINT, term_handler, SA_RESTART);
	SETSIG(SIGHUP, hup_handler, SA_RESTART);

	std::cerr << "going into main loop" << std::endl;

	switch_user();
	set_dumpable();
	nf.loop(term_flag);

	std::cerr << "terminating..." << std::endl;
	return 0;
}
catch (const std::exception& e)
{
    std::cerr << e.what() << std::endl;
    return -1;
}
示例#4
0
文件: sig.c 项目: benatto/finit
/*
 * Setup limited set of SysV compatible signals to respond to
 */
void sig_setup(void)
{
	struct sigaction sa;

	_d("Setup signals");

	/* Cleanup any stale finit control files */
	remove(SYNC_SHUTDOWN);
	remove(SYNC_STOPPED);

	/* Standard SysV init calls ctrl-alt-delete handler */
	SETSIG(sa, SIGINT,  shutdown_handler, 0);
	SETSIG(sa, SIGPWR,  shutdown_handler, 0);

	/* Ignore SIGUSR1/2 for now, only BusyBox init implements them as reboot+halt. */
//	  SETSIG2(sa, SIGUSR1, reopen_initctl, 0);
//	  SETSIG2(sa, SIGUSR2, pwrdwn_handler, 0);

	/* Init must ignore SIGTERM. May otherwise get false SIGTERM in forked children! */
	IGNSIG(sa, SIGTERM, 0);

	/* Some C APIs may need SIGALRM for implementing timers. */
	IGNSIG(sa, SIGALRM, 0);

	/* We don't have any /etc/inittab yet, reread finit.conf? */
	IGNSIG(sa, SIGHUP, 0);

	/* Stopping init is a bit tricky. */
	SETSIG(sa, SIGSTOP, sigstop_handler, 0);
	SETSIG(sa, SIGTSTP, sigstop_handler, 0);
	SETSIG(sa, SIGCONT, sigcont_handler, 0);

	/* Disable CTRL-ALT-DELETE from kernel, we handle shutdown gracefully with SIGINT, above */
	reboot(RB_DISABLE_CAD);
	setsid();
}
示例#5
0
文件: signal.c 项目: tokuhirom/Pone
void pone_signal_init(pone_world* world) {
    pone_val* module = pone_module_new(world, "signal");
    pone_module_put(world, module, "notify", pone_code_new_c(world, meth_signal_notify));
    pone_module_put(world, module, "kill", pone_code_new_c(world, meth_signal_kill));

#define SETSIG(sig) \
    pone_module_put(world, module, #sig, pone_int_new(world, sig))

    SETSIG(SIGHUP);
    SETSIG(SIGINT);
    SETSIG(SIGQUIT);
    SETSIG(SIGILL);
    SETSIG(SIGABRT);
    SETSIG(SIGFPE);
    SETSIG(SIGKILL);
    SETSIG(SIGSEGV);
    SETSIG(SIGPIPE);
    SETSIG(SIGALRM);
    SETSIG(SIGTERM);
    SETSIG(SIGUSR1);
    SETSIG(SIGUSR2);
    SETSIG(SIGCHLD);
    SETSIG(SIGCONT);
    SETSIG(SIGSTOP);
    SETSIG(SIGTSTP);
    SETSIG(SIGTTIN);
    SETSIG(SIGTTOU);
    SETSIG(SIGBUS);
#ifdef SIGPOLL
    SETSIG(SIGPOLL);
#endif
    SETSIG(SIGPROF);
    SETSIG(SIGSYS);
    SETSIG(SIGTRAP);
    SETSIG(SIGURG);
    SETSIG(SIGVTALRM);
    SETSIG(SIGXCPU);
    SETSIG(SIGXFSZ);

#undef SETSIG

    pone_universe_set_global(world->universe, "signal", module);
}
示例#6
0
static void ignore_sigs(char *list) {
	char *str, *p;
	int ignore = 1;
	if (list == NULL || *list == '\0') {
		return;
	}
	str = strdup(list);
	p = strtok(str, ":,");

#define SETSIG(x, y) \
	if (strstr(p, x)) { \
		if (ignore) { \
			signal(y, SIG_IGN); \
		} else { \
			signal(y, interrupted); \
		} \
	}

#ifdef SIG_IGN
	while (p) {
		if (!strcmp(p, "ignore")) {
			ignore = 1;
		} else if (!strcmp(p, "exit")) {
			ignore = 0;
		}
		/* Take off every 'sig' ;-) */
#ifdef SIGHUP
		SETSIG("HUP", SIGHUP);
#endif
#ifdef SIGINT
		SETSIG("INT", SIGINT);
#endif
#ifdef SIGQUIT
		SETSIG("QUIT", SIGQUIT);
#endif
#ifdef SIGTRAP
		SETSIG("TRAP", SIGTRAP);
#endif
#ifdef SIGABRT
		SETSIG("ABRT", SIGABRT);
#endif
#ifdef SIGBUS
		SETSIG("BUS", SIGBUS);
#endif
#ifdef SIGFPE
		SETSIG("FPE", SIGFPE);
#endif
#ifdef SIGSEGV
		SETSIG("SEGV", SIGSEGV);
#endif
#ifdef SIGPIPE
		SETSIG("PIPE", SIGPIPE);
#endif
#ifdef SIGTERM
		SETSIG("TERM", SIGTERM);
#endif
#ifdef SIGUSR1
		SETSIG("USR1", SIGUSR1);
#endif
#ifdef SIGUSR2
		SETSIG("USR2", SIGUSR2);
#endif
#ifdef SIGCONT
		SETSIG("CONT", SIGCONT);
#endif
#ifdef SIGSTOP
		SETSIG("STOP", SIGSTOP);
#endif
#ifdef SIGTSTP
		SETSIG("TSTP", SIGTSTP);
#endif
		p = strtok(NULL, ":,");
	}
#endif	/* SIG_IGN */
	free(str);
}