#include "types.h"
#include "defs.h"
#include "param.h"
#include "memlayout.h"
#include "mmu.h"
#include "x86.h"
#include "proc.h"
#include "spinlock.h"
#include "signal.h"

int defdisposition[MAXSIG+1] = { DIS_IGNORE, DIS_TERM, DIS_IGNORE, DIS_TERM, DIS_IGNORE, DIS_TERM};

// pid, signal#
int sys_sigqueue(void)
{
  int pid, signum;

  if (argint(0, &pid) < 0) return -1;
  if (argint(1, &signum) < 0) return -1;
  if (signum < 1 || signum > MAXSIG) return -1;

  return sigqueue(pid, signum);
}

int sys_signal(void)
{
  int sig;
  uint addr;

  if (argint(0, &sig) < 0) return -1;
  if (sig < 1 || sig > MAXSIG) return -1;
  if (sig == SIGKILL) return 0;

  if (argint(1, (int *)&addr) < 0) return -1;
  myproc()->sighandler[sig] = (uint)addr;
  return 0;
}

int sys_sigreturn(void)
{
  struct proc *p = myproc();
  if (p == 0) return -1;

  if (p->inhandler == 0) return -1;
  memmove(p->tf, p->savedtf, sizeof(struct trapframe));
  p->inhandler = 0;
  return 0;
}
