version 1.1, 1994/02/11 16:30:46
|
version 1.5, 1994/07/12 11:30:58
|
Line 3
|
Line 3
|
The following is stolen from the readline library for bash |
The following is stolen from the readline library for bash |
*/ |
*/ |
|
|
|
/* Use -DDOMAINOS for Apollo Domain-OS. |
|
Use -D_POSIX_VERSION for POSIX systems. |
|
*/ |
|
|
|
#ifdef DOMAINOS |
|
#define _POSIX_VERSION |
|
#endif |
|
|
#include <stdio.h> |
#include <stdio.h> |
#include <signal.h> |
#include <signal.h> |
#include <sys/types.h> |
#include <sys/types.h> |
|
#ifndef DOMAINOS |
#include <sys/ioctl.h> |
#include <sys/ioctl.h> |
|
#endif |
#include <fcntl.h> |
#include <fcntl.h> |
#include <sys/file.h> |
#include <sys/file.h> |
|
#include <setjmp.h> |
|
#include "forth.h" |
|
#include "io.h" |
|
|
#if defined (__GNUC__) |
#if defined (__GNUC__) |
# define alloca __builtin_alloca |
# define alloca __builtin_alloca |
Line 24
|
Line 37
|
|
|
#define NEW_TTY_DRIVER |
#define NEW_TTY_DRIVER |
#define HAVE_BSD_SIGNALS |
#define HAVE_BSD_SIGNALS |
|
/* |
|
#ifndef DOMAINOS |
#define USE_XON_XOFF |
#define USE_XON_XOFF |
|
#endif |
|
*/ |
|
|
|
#define HANDLE_SIGNALS |
|
|
/* Some USG machines have BSD signal handling (sigblock, sigsetmask, etc.) */ |
/* Some USG machines have BSD signal handling (sigblock, sigsetmask, etc.) */ |
#if defined (USG) && !defined (hpux) |
#if defined (USG) && !defined (hpux) |
Line 89 extern int errno;
|
Line 108 extern int errno;
|
# endif /* USGr3 */ |
# endif /* USGr3 */ |
#endif /* USG && hpux */ |
#endif /* USG && hpux */ |
|
|
#if defined (_POSIX_VERSION) || defined (USGr3) |
#if (defined (_POSIX_VERSION) || defined (USGr3)) && !defined(DOMAINOS) |
# include <dirent.h> |
# include <dirent.h> |
# define direct dirent |
# define direct dirent |
# if defined (_POSIX_VERSION) |
# if defined (_POSIX_VERSION) |
Line 694 graceful_exit (int sig)
|
Line 713 graceful_exit (int sig)
|
fprintf (stderr, "\n\n%s.\n", sigmsg (sig)); |
fprintf (stderr, "\n\n%s.\n", sigmsg (sig)); |
else |
else |
fprintf (stderr, "\n\nSignal %d received, terminated.\n", sig); |
fprintf (stderr, "\n\nSignal %d received, terminated.\n", sig); |
exit (sig); |
exit (0x80|sig); |
|
} |
|
|
|
jmp_buf throw_jmp_buf; |
|
|
|
static void |
|
signal_throw(int sig) |
|
{ |
|
static int throw_codes[] = { |
|
-256, |
|
-28, |
|
-257, |
|
-258, |
|
-259, |
|
-260, |
|
-261, |
|
-55, |
|
-262, |
|
-23, |
|
-9, |
|
-263, |
|
-264, |
|
-265, |
|
-266, |
|
-267, |
|
-268, |
|
}; |
|
signal(sig,signal_throw); |
|
longjmp(throw_jmp_buf,throw_codes[sig-1]); /* or use siglongjmp ? */ |
|
} |
|
|
|
static void |
|
termprep (int sig) |
|
{ |
|
terminal_prepped=0; prep_terminal(); |
|
signal(sig,termprep); |
} |
} |
|
|
void |
void |
Line 705 install_signal_handlers (void)
|
Line 759 install_signal_handlers (void)
|
but I would like something more automatic - anton */ |
but I would like something more automatic - anton */ |
#define SIGS_TO_IGNORE SIGCHLD |
#define SIGS_TO_IGNORE SIGCHLD |
#define SIGS_TO_ABORT SIGINT, SIGILL, SIGFPE, SIGUSR1, SIGSEGV, SIGUSR2, \ |
#define SIGS_TO_ABORT SIGINT, SIGILL, SIGFPE, SIGUSR1, SIGSEGV, SIGUSR2, \ |
SIGALRM, SIGEMT, SIGBUS, SIGSYS |
SIGALRM, SIGBUS |
#define SIGS_TO_QUIT SIGHUP, SIGQUIT, SIGABRT, SIGPIPE, \ |
#define SIGS_TO_QUIT SIGHUP, SIGQUIT, SIGABRT, SIGPIPE, \ |
SIGTERM |
SIGTERM |
|
#define SIGS_TO_TERMPREP SIGCONT |
|
|
static short sigs_to_ignore [] = { SIGS_TO_IGNORE }; |
static short sigs_to_ignore [] = { SIGS_TO_IGNORE }; |
static short sigs_to_abort [] = { SIGS_TO_ABORT }; |
static short sigs_to_abort [] = { SIGS_TO_ABORT }; |
static short sigs_to_quit [] = { SIGS_TO_QUIT }; |
static short sigs_to_quit [] = { SIGS_TO_QUIT }; |
|
static short sigs_to_termprep [] = { SIGS_TO_TERMPREP }; |
int i; |
int i; |
|
|
#define DIM(X) (sizeof (X) / sizeof *(X)) |
#define DIM(X) (sizeof (X) / sizeof *(X)) |
Line 719 install_signal_handlers (void)
|
Line 775 install_signal_handlers (void)
|
if (sigs_to_ignore [i]) |
if (sigs_to_ignore [i]) |
signal (sigs_to_ignore [i], SIG_IGN); |
signal (sigs_to_ignore [i], SIG_IGN); |
for (i = 0; i < DIM (sigs_to_abort); i++) |
for (i = 0; i < DIM (sigs_to_abort); i++) |
signal (sigs_to_abort [i], graceful_exit); /* !! change to throw */ |
signal (sigs_to_abort [i], signal_throw); /* !! change to throw */ |
for (i = 0; i < DIM (sigs_to_quit); i++) |
for (i = 0; i < DIM (sigs_to_quit); i++) |
signal (sigs_to_quit [i], graceful_exit); |
signal (sigs_to_quit [i], graceful_exit); |
|
for (i = 0; i < DIM (sigs_to_termprep); i++) |
|
signal (sigs_to_termprep [i], termprep); |
} |
} |
/* end signal handling */ |
/* end signal handling */ |