From dceabbe3c1fca121e02f8dfe54b81fcd0b038a8e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net>
Date: Wed, 9 Oct 1996 04:01:32 +0200
Subject: [PATCH] exit_on_error fixed

Rev: src/backend.c:1.4
Rev: src/builtin_functions.c:1.7
Rev: src/error.c:1.5
Rev: src/error.h:1.4
Rev: src/main.c:1.8
---
 src/backend.c           |  5 +++--
 src/builtin_functions.c |  4 +++-
 src/error.c             | 32 ++++++++++++++++++++------------
 src/error.h             |  3 ++-
 src/main.c              |  4 +++-
 5 files changed, 31 insertions(+), 17 deletions(-)

diff --git a/src/backend.c b/src/backend.c
index 391c8a3147..2498fd811a 100644
--- a/src/backend.c
+++ b/src/backend.c
@@ -184,11 +184,12 @@ void backend()
 
   if(SETJMP(back))
   {
-    exit_on_error="Error in handle_error in master object!\nPrevious error:";
+    ONERROR tmp;
+    SET_ONERROR(tmp,exit_on_error,"Error in handle_error in master object!");
     assign_svalue_no_free(sp++, & throw_value);
     APPLY_MASTER("handle_error", 1);
     pop_stack();
-    automatic_fatal=0;
+    UNSET_ONERROR(tmp);
   }
 
   while(first_object)
diff --git a/src/builtin_functions.c b/src/builtin_functions.c
index 65a0fd6352..16bffa63f0 100644
--- a/src/builtin_functions.c
+++ b/src/builtin_functions.c
@@ -617,6 +617,7 @@ struct callback *add_exit_callback(callback_func call,
 
 void f_exit(INT32 args)
 {
+  ONERROR tmp;
   int i;
   if(args < 1)
     error("Too few arguments to exit.\n");
@@ -624,7 +625,7 @@ void f_exit(INT32 args)
   if(sp[-args].type != T_INT)
     error("Bad argument 1 to exit.\n");
 
-  exit_on_error="Pike is exiting: ";
+  SET_ONERROR(tmp,exit_on_error,"Error in handle_error in master object!");
 
   call_callback(&exit_callbacks, (void *)0);
   free_callback(&exit_callbacks);
@@ -634,6 +635,7 @@ void f_exit(INT32 args)
   exit_modules();
 #endif
 
+  UNSET_ONERROR(tmp);
   exit(i);
 }
 
diff --git a/src/error.c b/src/error.c
index b4bd3c5cef..72493f2b30 100644
--- a/src/error.c
+++ b/src/error.c
@@ -15,7 +15,6 @@
 #undef ATTRIBUTE
 #define ATTRIBUTE(X)
 
-char *automatic_fatal, *exit_on_error;
 JMP_BUF *recoveries=0;
 
 JMP_BUF *init_recovery(JMP_BUF *r)
@@ -80,22 +79,13 @@ void va_error(char *fmt, va_list args) ATTRIBUTE((noreturn))
 
   VSPRINTF(buf, fmt, args);
 
-  if(automatic_fatal)
-  {
-    fprintf(stderr,"%s %s",automatic_fatal,buf);
-    abort();
-  }
-
-  if(exit_on_error || !recoveries)
+  if(!recoveries)
   {
-    if(!exit_on_error)
-      exit_on_error="No error recovery context: ";
-
 #ifdef DEBUG
     dump_backlog();
 #endif
 
-    fprintf(stderr,"%s %s",exit_on_error,buf);
+    fprintf(stderr,"No error recovery context!\n%s",buf);
     exit(99);
   }
 
@@ -113,6 +103,24 @@ void va_error(char *fmt, va_list args) ATTRIBUTE((noreturn))
   throw();  /* Hope someone is catching, or we will be out of balls. */
 }
 
+void exit_on_error(void *msg)
+{
+#ifdef DEBUG
+  dump_backlog();
+#endif
+  fprintf(stderr,"%s\n",(char *)msg);
+  exit(1);
+}
+
+void fatal_on_error(void *msg)
+{
+#ifdef DEBUG
+  dump_backlog();
+#endif
+  fprintf(stderr,"%s\n",(char *)msg);
+  abort();
+}
+
 void error(char *fmt,...) ATTRIBUTE((noreturn,format (printf, 1, 2)))
 {
   va_list args;
diff --git a/src/error.h b/src/error.h
index 900a783513..4f137b6e91 100644
--- a/src/error.h
+++ b/src/error.h
@@ -41,7 +41,6 @@ typedef struct JMP_BUF
 
 extern JMP_BUF *recoveries;
 extern struct svalue throw_value;
-extern char *automatic_fatal, *exit_on_error;
 
 #define SETJMP(X) setjmp((init_recovery(&X)->recovery))
 #define UNSETJMP(X) recoveries=X.previous;
@@ -60,6 +59,8 @@ extern char *automatic_fatal, *exit_on_error;
 JMP_BUF *init_recovery(JMP_BUF *r);
 void throw() ATTRIBUTE((noreturn));
 void va_error(char *fmt, va_list args) ATTRIBUTE((noreturn));
+void exit_on_error(void *msg);
+void fatal_on_error(void *msg);
 void error(char *fmt,...) ATTRIBUTE((noreturn,format (printf, 1, 2)));
 void fatal(char *fmt, ...) ATTRIBUTE((noreturn,format (printf, 1, 2)));
 /* Prototypes end here */
diff --git a/src/main.c b/src/main.c
index 16e86ff9fe..c9db3ad6ac 100644
--- a/src/main.c
+++ b/src/main.c
@@ -225,11 +225,13 @@ void main(int argc, char **argv, char **env)
 
   if(SETJMP(back))
   {
-    exit_on_error="Error in handle_error, previous error (in _main): ";
+    ONERROR tmp;
+    SET_ONERROR(tmp,exit_on_error,"Error in handle_error in master object!");
     assign_svalue_no_free(sp, & throw_value);
     sp++;
     APPLY_MASTER("handle_error", 1);
     pop_stack();
+    UNSET_ONERROR(tmp);
     exit(10);
   }
 
-- 
GitLab