| version 1.7, 2002/05/27 20:04:20 |
version 1.8, 2002/05/29 15:12:55 |
|
|
| #include "sigserv.h" |
#include "sigserv.h" |
| #include "message.h" |
#include "message.h" |
| |
|
| #if 0 |
#if DEBUG |
| |
static char *get_signal_str(int sig_no) |
| |
{ |
| |
char *s; |
| |
|
| |
switch (sig_no) { |
| |
default: s = "unknown"; break; |
| |
case SIGHUP: s = "SIGHUP"; break; |
| |
case SIGINT: s = "SIGINT"; break; |
| |
case SIGQUIT: s = "SIGQUIT"; break; |
| |
case SIGILL: s = "SIGILL"; break; |
| |
case SIGTRAP: s = "SIGTRAP"; break; |
| |
case SIGABRT: s = "SIGABRT"; break; |
| |
/* case SIGIOT: s = "SIGIOT"; break; */ |
| |
case SIGBUS: s = "SIGBUS"; break; |
| |
case SIGFPE: s = "SIGFPE"; break; |
| |
case SIGKILL: s = "SIGKILL"; break; |
| |
case SIGUSR1: s = "SIGUSR1"; break; |
| |
case SIGSEGV: s = "SIGSEGV"; break; |
| |
case SIGUSR2: s = "SIGUSR2"; break; |
| |
case SIGPIPE: s = "SIGPIPE"; break; |
| |
case SIGALRM: s = "SIGALRM"; break; |
| |
case SIGTERM: s = "SIGTERM"; break; |
| |
case SIGSTKFLT: s = "SIGSTKFLT"; break; |
| |
/* case SIGCLD: s = "SIGCLD"; break; */ |
| |
case SIGCHLD: s = "SIGCHLD"; break; |
| |
case SIGCONT: s = "SIGCONT"; break; |
| |
case SIGSTOP: s = "SIGSTOP"; break; |
| |
case SIGTSTP: s = "SIGTSTP"; break; |
| |
case SIGTTIN: s = "SIGTTIN"; break; |
| |
case SIGTTOU: s = "SIGTTOU"; break; |
| |
case SIGURG: s = "SIGURG"; break; |
| |
case SIGXCPU: s = "SIGXCPU"; break; |
| |
case SIGXFSZ: s = "SIGXFSZ"; break; |
| |
case SIGVTALRM: s = "SIGVTALRM"; break; |
| |
case SIGPROF: s = "SIGPROF"; break; |
| |
case SIGWINCH: s = "SIGWINCH"; break; |
| |
case SIGPOLL: s = "SIGPOLL"; break; |
| |
/* case SIGIO: s = "SIGIO"; break; */ |
| |
case SIGPWR: s = "SIGPWR"; break; |
| |
case SIGSYS: s = "SIGSYS"; break; |
| |
} |
| |
|
| |
return s; |
| |
} |
| |
|
| |
static char *get_signal_description(int sig_no) |
| |
{ |
| |
char *s; |
| |
|
| |
switch (sig_no) { |
| |
default: s = "unknown"; break; |
| |
case SIGHUP: s = "Hangup (POSIX)"; break; |
| |
case SIGINT: s = "Interrupt (ANSI)"; break; |
| |
case SIGQUIT: s = "Quit (POSIX)"; break; |
| |
case SIGILL: s = "Illegal instruction (ANSI)"; break; |
| |
case SIGTRAP: s = "Trace trap (POSIX)"; break; |
| |
case SIGABRT: s = "Abort (ANSI)"; break; |
| |
/* case SIGIOT: s = "IOT trap (4.2 BSD)"; break; */ |
| |
case SIGBUS: s = "BUS error (4.2 BSD)"; break; |
| |
case SIGFPE: s = "Floating-point exception (ANSI)"; break; |
| |
case SIGKILL: s = "Kill, unblockable (POSIX)"; break; |
| |
case SIGUSR1: s = "User-defined signal 1 (POSIX)"; break; |
| |
case SIGSEGV: s = "Segmentation violation (ANSI)"; break; |
| |
case SIGUSR2: s = "User-defined signal 2 (POSIX)"; break; |
| |
case SIGPIPE: s = "Broken pipe (POSIX)"; break; |
| |
case SIGALRM: s = "Alarm clock (POSIX)"; break; |
| |
case SIGTERM: s = "Termination (ANSI)"; break; |
| |
case SIGSTKFLT: s = "Stack fault"; break; |
| |
/* case SIGCLD: s = "Same as SIGCHLD (System V)"; break; */ |
| |
case SIGCHLD: s = "Child status has changed (POSIX)"; break; |
| |
case SIGCONT: s = "Continue (POSIX)"; break; |
| |
case SIGSTOP: s = "Stop, unblockable (POSIX)"; break; |
| |
case SIGTSTP: s = "Keyboard stop (POSIX)"; break; |
| |
case SIGTTIN: s = "Background read from tty (POSIX)"; break; |
| |
case SIGTTOU: s = "Background write to tty (POSIX)"; break; |
| |
case SIGURG: s = "Urgent condition on socket (4.2 BSD)"; break; |
| |
case SIGXCPU: s = "CPU limit exceeded (4.2 BSD)"; break; |
| |
case SIGXFSZ: s = "File size limit exceeded (4.2 BSD)"; break; |
| |
case SIGVTALRM: s = "Virtual alarm clock (4.2 BSD)"; break; |
| |
case SIGPROF: s = "Profiling alarm clock (4.2 BSD)"; break; |
| |
case SIGWINCH: s = "Window size change (4.3 BSD, Sun)"; break; |
| |
case SIGPOLL: s = "Pollable event occurred (System V)"; break; |
| |
/* case SIGIO: s = "I/O now possible (4.2 BSD)"; break; */ |
| |
case SIGPWR: s = "Power failure restart (System V)"; break; |
| |
case SIGSYS: s = "Bad system call"; break; |
| |
}; |
| |
|
| |
return s; |
| |
} |
| |
#endif |
| |
|
| static RETSIGTYPE |
static RETSIGTYPE |
| sigserv_sigaction(sig, info, unused) |
sigserv_sigaction(sig, info, unused) |
| Line 53 sigserv_sigaction(sig, info, unused) |
|
| Line 143 sigserv_sigaction(sig, info, unused) |
|
| { |
{ |
| |
|
| #if DEBUG |
#if DEBUG |
| msg_debug_print("sigserv_sigaction(sig = %d, info = %p, data = %p)\n", |
msg_debug_print("sigserv_sigaction(): sig = %s [%s]\n", |
| sig, info, unused); |
get_signal_str(sig), get_signal_description(sig)); |
| #endif |
#endif |
| |
|
| |
switch (sig) { |
| |
case SIGCHLD: |
| |
sig_chld = 1; |
| |
break; |
| |
}; |
| |
|
| |
#if 0 |
| return; |
return; |
| |
|
| switch (sig) { |
switch (sig) { |
| Line 78 sigserv_sigaction(sig, info, unused) |
|
| Line 175 sigserv_sigaction(sig, info, unused) |
|
| switch (info->si_code) { |
switch (info->si_code) { |
| case CLD_EXITED: /* | child has exited | */ |
case CLD_EXITED: /* | child has exited | */ |
| msg_print("SIGCHLD -- child %d exited " |
msg_print("SIGCHLD -- child %d exited " |
| "with status %d (%s)\n", |
"with status %d (%s)\n", |
| info->si_pid, |
info->si_pid, |
| info->si_errno, |
info->si_errno, |
| strerror(info->si_errno)); |
strerror(info->si_errno)); |
| break; |
break; |
| case CLD_KILLED: /* | child was killed | */ |
case CLD_KILLED: /* | child was killed | */ |
| msg_print("SIGCHLD -- child %d was killed" |
msg_print("SIGCHLD -- child %d was killed" |
| "by signal %d (%s)\n", |
"by signal %d (%s)\n", |
| info->si_pid, |
info->si_pid, |
| info->si_signo, |
info->si_signo, |
| strerror(info->si_errno)); |
strerror(info->si_errno)); |
| break; |
break; |
| case CLD_DUMPED: /* | child terminated abnormally | */ |
case CLD_DUMPED: /* | child terminated abnormally | */ |
| msg_print("SIGCHLD -- child %d terminated abnormaly" |
msg_print("SIGCHLD -- child %d terminated abnormaly" |
| "by signal %d (%s)\n", |
"by signal %d (%s)\n", |
| info->si_pid, |
info->si_pid, |
| info->si_signo, |
info->si_signo, |
| strerror(info->si_errno)); |
strerror(info->si_errno)); |
| break; |
break; |
| case CLD_TRAPPED: /* | traced child has trapped | */ |
case CLD_TRAPPED: /* | traced child has trapped | */ |
| break; |
break; |
| Line 112 sigserv_sigaction(sig, info, unused) |
|
| Line 209 sigserv_sigaction(sig, info, unused) |
|
| kill(0, SIGTERM); |
kill(0, SIGTERM); |
| break; |
break; |
| default: |
default: |
| #if DEBUG |
|
| msg_debug_print("signal %d received\n", sig); |
|
| #endif |
|
| break; |
break; |
| } |
} |
| |
#endif |
| } |
} |
| |
|
| void |
void |
| sigserv_init(ptbl) |
sigserv_init(ptbl) |
| PROCTABLE ptbl; |
PROCTABLE ptbl; |
| { |
{ |
| /* |
|
| struct sigaction sa; |
struct sigaction sa; |
| |
|
| memset(&sa, 0, sizeof sa); |
memset(&sa, '\0', sizeof sa); |
| sa.sa_sigaction = sigserv_sigaction; |
sa.sa_sigaction = sigserv_sigaction; |
| sa.sa_flags = SA_RESTART | SA_SIGINFO; |
sa.sa_flags = SA_RESTART | SA_SIGINFO; |
| |
|
| sigaction(SIGCHLD, &sa, NULL); |
sigaction(SIGQUIT, &sa, NULL); |
| sigaction(SIGINT, &sa, NULL); |
sigaction(SIGILL, &sa, NULL); |
| |
sigaction(SIGABRT, &sa, NULL); |
| |
sigaction(SIGFPE, &sa, NULL); |
| |
sigaction(SIGKILL, &sa, NULL); |
| |
sigaction(SIGSEGV, &sa, NULL); |
| sigaction(SIGPIPE, &sa, NULL); |
sigaction(SIGPIPE, &sa, NULL); |
| */ |
sigaction(SIGALRM, &sa, NULL); |
| /* |
sigaction(SIGTERM, &sa, NULL); |
| signal(SIGCHLD, sigserv_sigaction); |
sigaction(SIGUSR1, &sa, NULL); |
| signal(SIGINT, sigserv_sigaction); |
sigaction(SIGUSR2, &sa, NULL); |
| */ |
sigaction(SIGCHLD, &sa, NULL); |
| /* toto je zoznam vsetkych signalov ktore existuju |
sigaction(SIGCONT, &sa, NULL); |
| * moze to ist prec, len som skusal vo ^d, ale |
sigaction(SIGSTOP, &sa, NULL); |
| * ziadny signal vredy ep nedostava |
sigaction(SIGTSTP, &sa, NULL); |
| */ |
sigaction(SIGTTIN, &sa, NULL); |
| /* |
sigaction(SIGTTOU, &sa, NULL); |
| signal(SIGQUIT , sigserv_sigaction); |
sigaction(SIGBUS, &sa, NULL); |
| signal(SIGILL , sigserv_sigaction); |
sigaction(SIGPOLL, &sa, NULL); |
| signal(SIGABRT , sigserv_sigaction); |
sigaction(SIGPROF, &sa, NULL); |
| signal(SIGFPE , sigserv_sigaction); |
sigaction(SIGSYS, &sa, NULL); |
| //signal(SIGKILL , sigserv_sigaction); |
sigaction(SIGTRAP, &sa, NULL); |
| signal(SIGSEGV , sigserv_sigaction); |
sigaction(SIGURG, &sa, NULL); |
| signal(SIGPIPE , sigserv_sigaction); |
sigaction(SIGVTALRM, &sa, NULL); |
| signal(SIGALRM , sigserv_sigaction); |
sigaction(SIGXCPU, &sa, NULL); |
| signal(SIGTERM , sigserv_sigaction); |
sigaction(SIGXFSZ, &sa, NULL); |
| signal(SIGUSR1 , sigserv_sigaction); |
sigaction(SIGIOT, &sa, NULL); |
| signal(SIGUSR2 , sigserv_sigaction); |
sigaction(SIGSTKFLT, &sa, NULL); |
| signal(SIGCHLD , sigserv_sigaction); |
sigaction(SIGIO, &sa, NULL); |
| signal(SIGCONT , sigserv_sigaction); |
sigaction(SIGCLD, &sa, NULL); |
| //signal(SIGSTOP , sigserv_sigaction); |
sigaction(SIGPWR, &sa, NULL); |
| signal(SIGTSTP , sigserv_sigaction); |
sigaction(SIGWINCH, &sa, NULL); |
| signal(SIGTTIN , sigserv_sigaction); |
sigaction(SIGUNUSED, &sa, NULL); |
| signal(SIGTTOU , sigserv_sigaction); |
|
| signal(SIGBUS , sigserv_sigaction); |
#if DEBUG |
| signal(SIGPOLL , sigserv_sigaction); |
msg_debug_print("sigserv_init(): signal handles installed\n"); |
| signal(SIGPROF , sigserv_sigaction); |
#endif |
| signal(SIGSYS , sigserv_sigaction); |
|
| signal(SIGTRAP , sigserv_sigaction); |
sig_chld = 0; |
| signal(SIGURG , sigserv_sigaction); |
|
| signal(SIGVTALRM, sigserv_sigaction); |
|
| signal(SIGXCPU , sigserv_sigaction); |
|
| signal(SIGXFSZ , sigserv_sigaction); |
|
| signal(SIGIOT , sigserv_sigaction); |
|
| signal(SIGSTKFLT , sigserv_sigaction); |
|
| signal(SIGIO , sigserv_sigaction); |
|
| signal(SIGCLD , sigserv_sigaction); |
|
| signal(SIGPWR , sigserv_sigaction); |
|
| signal(SIGWINCH , sigserv_sigaction); |
|
| signal(SIGUNUSED , sigserv_sigaction); |
|
| */ |
|
| } |
} |
| |
|
| |
#if 0 /* Signals. */ /* Linux 2.4.17 /usr/include/bits/signum.h */ |
| |
#define SIGHUP 1 /* Hangup (POSIX). */ |
| |
#define SIGINT 2 /* Interrupt (ANSI). */ |
| |
#define SIGQUIT 3 /* Quit (POSIX). */ |
| |
#define SIGILL 4 /* Illegal instruction (ANSI). */ |
| |
#define SIGTRAP 5 /* Trace trap (POSIX). */ |
| |
#define SIGABRT 6 /* Abort (ANSI). */ |
| |
#define SIGIOT 6 /* IOT trap (4.2 BSD). */ |
| |
#define SIGBUS 7 /* BUS error (4.2 BSD). */ |
| |
#define SIGFPE 8 /* Floating-point exception (ANSI). */ |
| |
#define SIGKILL 9 /* Kill, unblockable (POSIX). */ |
| |
#define SIGUSR1 10 /* User-defined signal 1 (POSIX). */ |
| |
#define SIGSEGV 11 /* Segmentation violation (ANSI). */ |
| |
#define SIGUSR2 12 /* User-defined signal 2 (POSIX). */ |
| |
#define SIGPIPE 13 /* Broken pipe (POSIX). */ |
| |
#define SIGALRM 14 /* Alarm clock (POSIX). */ |
| |
#define SIGTERM 15 /* Termination (ANSI). */ |
| |
#define SIGSTKFLT 16 /* Stack fault. */ |
| |
#define SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */ |
| |
#define SIGCHLD 17 /* Child status has changed (POSIX). */ |
| |
#define SIGCONT 18 /* Continue (POSIX). */ |
| |
#define SIGSTOP 19 /* Stop, unblockable (POSIX). */ |
| |
#define SIGTSTP 20 /* Keyboard stop (POSIX). */ |
| |
#define SIGTTIN 21 /* Background read from tty (POSIX). */ |
| |
#define SIGTTOU 22 /* Background write to tty (POSIX). */ |
| |
#define SIGURG 23 /* Urgent condition on socket (4.2 BSD). */ |
| |
#define SIGXCPU 24 /* CPU limit exceeded (4.2 BSD). */ |
| |
#define SIGXFSZ 25 /* File size limit exceeded (4.2 BSD). */ |
| |
#define SIGVTALRM 26 /* Virtual alarm clock (4.2 BSD). */ |
| |
#define SIGPROF 27 /* Profiling alarm clock (4.2 BSD). */ |
| |
#define SIGWINCH 28 /* Window size change (4.3 BSD, Sun). */ |
| |
#define SIGPOLL SIGIO /* Pollable event occurred (System V). */ |
| |
#define SIGIO 29 /* I/O now possible (4.2 BSD). */ |
| |
#define SIGPWR 30 /* Power failure restart (System V). */ |
| |
#define SIGSYS 31 /* Bad system call. */ |
| |
#define SIGUNUSED 31 |
| #endif |
#endif |
| |
|