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;
}
|