summaryrefslogtreecommitdiff
path: root/elksemu/elks_signal.c
blob: 1eb9336a06a8d3a42e0fb2a17132129396b9ce22 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/vm86.h>
#include "elks.h" 

static int elks_sigtrap= -1;

void sig_trap(int signo)
{
   elks_cpu.regs.esp -= 2;
   ELKS_POKE(unsigned short, elks_cpu.regs.esp, signo);
   elks_cpu.regs.esp -= 2;
   ELKS_POKE(unsigned short, elks_cpu.regs.esp, elks_cpu.regs.eip);
   elks_cpu.regs.eip = elks_sigtrap;
}

int elks_signal(int bx,int cx,int dx,int di,int si)
{
   void (*oldsig)(int) = 0;
   if( bx < 0 || bx >= NSIG ) { errno = EINVAL; return -1; }
   if( cx == 0 )      oldsig = signal(bx, SIG_DFL);
   else if( cx == 1 ) oldsig = signal(bx, SIG_IGN);
   else 
   {
      elks_sigtrap = cx;
      oldsig = signal(bx, sig_trap);
   }
   if( oldsig == SIG_ERR) return -1;
   if( oldsig == SIG_DFL) return 0;
   if( oldsig == SIG_IGN) return 1;
   return 2;
}