
#include <signal.h>

#define handler_t __handler_t

extern void _abort();

handler_t _signal_handlers[SIG_MAX + 1];

handler_t _signal_defaults[] = {
  SIG_IGN,
  _abort,	/* SIGABRT */
  SIG_IGN,	/* SIGFPE  */
  SIG_IGN,	/* SIGILL  */
  _abort,	/* SIGINT  */
  SIG_IGN,	/* SIGSEGV */
  _abort	/* SIGTERM */
};

handler_t
signal (sig, handler)
    int sig;
    handler_t handler;
{
  handler_t old_handler;

  /* If a signal number is zero, nothing is done. */
  if (sig == 0)
    return SIG_DFL;

  if (sig < 0 || sig > SIG_MAX)
    return SIG_ERR;

  old_handler = _signal_handlers[sig];
  _signal_handlers[sig] = handler;

  return old_handler;
}


int
raise (sig)
    int sig;
{
  handler_t handler;

  if (sig == 0)
    return -1;

  if (sig < 0 || sig > SIG_MAX)
    return -1;

  handler = _signal_handlers[sig];

  if (handler == SIG_DFL)
    handler = _signal_defaults[sig];

  if (handler != SIG_IGN)
    {
      _signal_handlers[sig] = SIG_DFL;
      (*handler) (sig);
    }

  return 0;
}
