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
|
setjmp/longjmp are used to jump out of signal handlers. That
causes weirdness. Use sigsetjmp/siglongjmp.
--- a/main.c
+++ b/main.c
@@ -20,7 +20,7 @@
extern trapint(); /* defined below */
extern char *getenv();
-jmp_buf jmpenv;
+sigjmp_buf jmpenv;
#ifndef NO_DIGRAPH
static init_digraphs();
@@ -310,7 +310,7 @@ int main(argc, argv)
*/
while (mode != MODE_QUIT)
{
- if (setjmp(jmpenv))
+ if (sigsetjmp(jmpenv, 1))
{
/* Maybe we just aborted a change? */
abortdo();
@@ -371,7 +371,7 @@ int trapint(signo)
#else
signal(signo, trapint);
#endif
- longjmp(jmpenv, 1);
+ siglongjmp(jmpenv, 1);
return 0;
}
--- a/tio.c
+++ b/tio.c
@@ -350,10 +350,10 @@ static struct _keymap
#if !MSDOS && !TOS
# if BSD || COHERENT
-static jmp_buf env_timeout;
+static sigjmp_buf env_timeout;
static int dummy()
{
- longjmp(env_timeout, 1);
+ siglongjmp(env_timeout, 1);
return 0;
}
# else
@@ -552,7 +552,7 @@ int getkey(when)
while (j > 1)
{
#if BSD || COHERENT
- if (setjmp(env_timeout))
+ if (sigsetjmp(env_timeout, 1))
{
/* we timed out - assume no mapping */
j = 0;
|