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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
/* This is file signal.c
**
** Copyright (C) 1992 Rami EL CHARIF and William SCHELTER
** rcharif@ma.utexas.edu wfs@cs.utexas.edu
**
** Signal package for djgpp versions 1.05, 1.06
** version 0.0 alpha 03/30/1992
**
** Send your comments or bugs report to
** rcharif@ma.utexas.edu or wfs@cs.utexas.edu
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
#include <stdio.h>
#include <dos.h>
#include <signal.h>
unsigned long SignalTable[_NSIG + 1] = {
(unsigned long)SIG_DFL, /* SIGHUP */
(unsigned long)SIG_DFL, /* SIGINT +*/
(unsigned long)SIG_DFL, /* SIGQUIT */
(unsigned long)SIG_DFL, /* SIGILL */
(unsigned long)SIG_DFL, /* SIGABRT */
(unsigned long)SIG_DFL, /* SIGTRAP */
(unsigned long)SIG_DFL, /* SIGIOT */
(unsigned long)SIG_DFL, /* SIGEMT */
(unsigned long)SIG_DFL, /* SIGFPE */
(unsigned long)SIG_DFL, /* SIGKILL */
(unsigned long)SIG_DFL, /* SIGBUS */
(unsigned long)SIG_DFL, /* SIGSEGV +*/
(unsigned long)SIG_DFL, /* SIGSYS */
(unsigned long)SIG_DFL, /* SIGPIPE */
(unsigned long)SIG_DFL, /* SIGALRM */
(unsigned long)SIG_DFL, /* SIGTERM */
(unsigned long)SIG_DFL, /* SIGURG */
(unsigned long)SIG_DFL, /* SIGSTOP */
(unsigned long)SIG_DFL, /* SIGTSTP */
(unsigned long)SIG_DFL, /* SIGCONT */
(unsigned long)SIG_DFL, /* SIGCHLD */
(unsigned long)SIG_DFL, /* SIGCLD */
(unsigned long)SIG_DFL, /* SIGTTIN */
(unsigned long)SIG_DFL, /* SIGTTOU */
(unsigned long)SIG_DFL, /* SIGIO */
(unsigned long)SIG_DFL, /* SIGPOLL */
(unsigned long)SIG_DFL, /* SIGXCPU */
(unsigned long)SIG_DFL, /* SIGXFSZ */
(unsigned long)SIG_DFL, /* SIGVTALRM */
(unsigned long)SIG_DFL, /* SIGPROF */
(unsigned long)SIG_DFL, /* SIGWINCH */
(unsigned long)SIG_DFL, /* SIGUSR1 */
(unsigned long)SIG_DFL /* SIGUSR2 */
};
SignalHandler signal(int sig, SignalHandler action)
{
extern void SignalManager();
union REGS in, out;
SignalHandler hsigOld;
in.h.ah = 1;
in.h.al = sig;
SignalTable[sig] = in.x.dx = (long)action;
in.x.cx = (long)SignalManager;
int86(0xfa, &in, &out);
hsigOld = (SignalHandler)out.x.dx;
return hsigOld;
}
void SigInst()
{
union REGS in, out;
extern void SignalManager();
in.h.ah = 0;
in.h.al = 0;
in.x.dx = (long)SignalManager;
#ifdef DEBUG_SIG
printf("\nSignal Manager = %ld, %lx", in.x.dx, in.x.dx);
#endif
int86(0xfa, &in, &out);
}
#ifndef NO_SIG_ALARM
unsigned int alarm(int culSeconds)
{
union REGS in, out;
if (!culSeconds) {
in.h.ah = 3; /* Reset alarm */
int86(0xfa, &in, &out);
}
else {
in.h.ah = 2;
in.x.dx = culSeconds;
int86(0xfa, &in, &out);
}
return in.x.cx;
}
#else
unsigned int alarm(int n)
{ return 0; }
#endif
|