/* sys/signal.c (emx+gcc) -- Copyright (c) 1992-1993 by Eberhard Mattes */

#include <sys/emx.h>
#define INCL_DOSEXCEPTIONS
#include <os2emx.h>
#include <signal.h>
#include <errno.h>
#include "syscalls.h"

typedef void sigfun (int sig);

sigfun *__signal (int sig, sigfun *handler)
{
  sigfun *prev;
  thread_data *tp;

  if (sig < 1 || sig >= NSIG || sig == SIGKILL || !_sys_sig_valid[sig])
    {
      errno = EINVAL;
      return (SIG_ERR);
    }
  tp = SYS_THREAD;
  if (tp == NULL)
    return (SIG_ERR);
  prev = tp->sig_handlers[sig];
  if (handler != SIG_ACK)
    tp->sig_handlers[sig] = handler;
  else
    {
      if (tp->sig_pending[sig])
        {
          tp->sig_ack_req[sig] = 0;
          tp->sig_pending[sig] = 0;
          __raise (sig);
        }
      else
        {
          tp->sig_ack_req[sig] = 0;
          switch (sig)
            {
            case SIGINT:
              DosAcknowledgeSignalException (XCPT_SIGNAL_INTR);
              break;
            case SIGTERM:
              DosAcknowledgeSignalException (XCPT_SIGNAL_KILLPROC);
              break;
            case SIGBREAK:
              DosAcknowledgeSignalException (XCPT_SIGNAL_BREAK);
              break;
            }
        }
    }
  return (prev);
}
