version 1.2, 1996/09/21 06:23:24 |
version 1.3, 1996/10/14 03:55:32 |
|
|
static char_u *extra_shell_arg = NULL; |
static char_u *extra_shell_arg = NULL; |
static int show_shell_mess = TRUE; |
static int show_shell_mess = TRUE; |
#endif |
#endif |
static int core_dump = FALSE; /* core dump in mch_windexit() */ |
static int deadly_signal = 0; /* The signal we caught */ |
|
|
#ifdef SYS_SIGLIST_DECLARED |
#ifdef SYS_SIGLIST_DECLARED |
/* |
/* |
|
|
{ |
{ |
int sig; /* Signal number, eg. SIGSEGV etc */ |
int sig; /* Signal number, eg. SIGSEGV etc */ |
char *name; /* Signal name (not char_u!). */ |
char *name; /* Signal name (not char_u!). */ |
int dump; /* Should this signal cause a core dump? */ |
|
} signal_info[] = |
} signal_info[] = |
{ |
{ |
#ifdef SIGHUP |
#ifdef SIGHUP |
{SIGHUP, "HUP", FALSE}, |
{SIGHUP, "HUP"}, |
#endif |
#endif |
#ifdef SIGINT |
#ifdef SIGINT |
{SIGINT, "INT", FALSE}, |
{SIGINT, "INT"}, |
#endif |
#endif |
#ifdef SIGQUIT |
#ifdef SIGQUIT |
{SIGQUIT, "QUIT", TRUE}, |
{SIGQUIT, "QUIT"}, |
#endif |
#endif |
#ifdef SIGILL |
#ifdef SIGILL |
{SIGILL, "ILL", TRUE}, |
{SIGILL, "ILL"}, |
#endif |
#endif |
#ifdef SIGTRAP |
#ifdef SIGTRAP |
{SIGTRAP, "TRAP", TRUE}, |
{SIGTRAP, "TRAP"}, |
#endif |
#endif |
#ifdef SIGABRT |
#ifdef SIGABRT |
{SIGABRT, "ABRT", TRUE}, |
{SIGABRT, "ABRT"}, |
#endif |
#endif |
#ifdef SIGEMT |
#ifdef SIGEMT |
{SIGEMT, "EMT", TRUE}, |
{SIGEMT, "EMT"}, |
#endif |
#endif |
#ifdef SIGFPE |
#ifdef SIGFPE |
{SIGFPE, "FPE", TRUE}, |
{SIGFPE, "FPE"}, |
#endif |
#endif |
#ifdef SIGBUS |
#ifdef SIGBUS |
{SIGBUS, "BUS", TRUE}, |
{SIGBUS, "BUS"}, |
#endif |
#endif |
#ifdef SIGSEGV |
#ifdef SIGSEGV |
{SIGSEGV, "SEGV", TRUE}, |
{SIGSEGV, "SEGV"}, |
#endif |
#endif |
#ifdef SIGSYS |
#ifdef SIGSYS |
{SIGSYS, "SYS", TRUE}, |
{SIGSYS, "SYS"}, |
#endif |
#endif |
#ifdef SIGALRM |
#ifdef SIGALRM |
{SIGALRM, "ALRM", FALSE}, |
{SIGALRM, "ALRM"}, |
#endif |
#endif |
#ifdef SIGTERM |
#ifdef SIGTERM |
{SIGTERM, "TERM", FALSE}, |
{SIGTERM, "TERM"}, |
#endif |
#endif |
#ifdef SIGVTALRM |
#ifdef SIGVTALRM |
{SIGVTALRM, "VTALRM", FALSE}, |
{SIGVTALRM, "VTALRM"}, |
#endif |
#endif |
#ifdef SIGPROF |
#ifdef SIGPROF |
{SIGPROF, "PROF", FALSE}, |
{SIGPROF, "PROF"}, |
#endif |
#endif |
#ifdef SIGXCPU |
#ifdef SIGXCPU |
{SIGXCPU, "XCPU", TRUE}, |
{SIGXCPU, "XCPU"}, |
#endif |
#endif |
#ifdef SIGXFSZ |
#ifdef SIGXFSZ |
{SIGXFSZ, "XFSZ", TRUE}, |
{SIGXFSZ, "XFSZ"}, |
#endif |
#endif |
#ifdef SIGUSR1 |
#ifdef SIGUSR1 |
{SIGUSR1, "USR1", FALSE}, |
{SIGUSR1, "USR1"}, |
#endif |
#endif |
#ifdef SIGUSR2 |
#ifdef SIGUSR2 |
{SIGUSR2, "USR2", FALSE}, |
{SIGUSR2, "USR2"}, |
#endif |
#endif |
{-1, "Unknown!", -1} |
{-1, "Unknown!"} |
}; |
}; |
|
|
void |
void |
|
|
#ifdef SIGHASARG |
#ifdef SIGHASARG |
int i; |
int i; |
|
|
for (i = 0; signal_info[i].dump != -1; i++) |
/* try to find the name of this signal */ |
{ |
for (i = 0; signal_info[i].sig != -1; i++) |
if (sigarg == signal_info[i].sig) |
if (sigarg == signal_info[i].sig) |
{ |
|
if (signal_info[i].dump) |
|
core_dump = TRUE; |
|
break; |
break; |
} |
deadly_signal = sigarg; |
} |
|
#endif |
#endif |
|
|
/* |
/* |
|
|
{ |
{ |
int i; |
int i; |
|
|
for (i = 0; signal_info[i].dump != -1; i++) |
for (i = 0; signal_info[i].sig != -1; i++) |
signal(signal_info[i].sig, func); |
signal(signal_info[i].sig, func); |
} |
} |
|
|
|
|
static void |
static void |
may_core_dump() |
may_core_dump() |
{ |
{ |
#ifdef SIGQUIT |
if (deadly_signal != 0) |
signal(SIGQUIT, SIG_DFL); |
{ |
if (core_dump) |
signal(deadly_signal, SIG_DFL); |
kill(getpid(), SIGQUIT); /* force a core dump */ |
kill(getpid(), deadly_signal); /* Die using the signal we caught */ |
#endif |
} |
} |
} |
|
|
static int curr_tmode = 0; /* contains current raw/cooked mode (0 = cooked) */ |
static int curr_tmode = 0; /* contains current raw/cooked mode (0 = cooked) */ |
|
|
FD_ZERO(&rfds); /* calls bzero() on a sun */ |
FD_ZERO(&rfds); /* calls bzero() on a sun */ |
FD_ZERO(&efds); |
FD_ZERO(&efds); |
FD_SET(fd, &rfds); |
FD_SET(fd, &rfds); |
|
#ifndef __QNX__ |
|
/* For QNX select() always returns 1 if this is set. Why? */ |
FD_SET(fd, &efds); |
FD_SET(fd, &efds); |
|
#endif |
return (select(fd + 1, &rfds, NULL, &efds, (msec >= 0) ? &tv : NULL) > 0); |
return (select(fd + 1, &rfds, NULL, &efds, (msec >= 0) ? &tv : NULL) > 0); |
#endif |
#endif |
} |
} |