#include <signal.h>
#include <stdio.h>

#include "config.h"
#include "lint.h"

extern int interupted;

static struct sig_disp
{
    int sig;
    char *name;
} disp[] = {
    {SIGHUP, "HUP"},
    {SIGINT, "INT"},
    {SIGQUIT, "QUIT"},
    {SIGTERM, "TERM"},
    {SIGUSR1, "USR1"},
    {SIGUSR2, "USR2"},
    {SIGTSTP, "TSTP"},
    {SIGCONT, "CONT"},
    {0, "UNKNOWN"},
};

static int pending_signals = 0;

static void sig_handler(int sig)
{
    int i;

    for (i = 0; disp[i].sig && disp[i].sig != sig; i++) ;
    
    pending_signals |= 1<<(i);
    interupted = 1;
#if defined(SYSV) || defined(LINUX)
    signal(sig, sig_handler);
#endif
}

void
init_signals()
{
    int i;
    for (i = 0; disp[i].sig; i++)
	signal(disp[i].sig, sig_handler);
}

void
deliver_signals()
{
    int i;

    for (i = 0; pending_signals; i++)
    {
	if (pending_signals & (1<<i))
	{
	    pending_signals &= ~(1<<i);
	    /* deliver the signal */
	    push_constant_string(disp[i].name);
	    apply_master_ob(M_EXTERNAL_SIGNAL, 1);
	}
    }
}