summaryrefslogtreecommitdiffstats
path: root/src/LYexit.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/LYexit.c')
-rw-r--r--src/LYexit.c183
1 files changed, 183 insertions, 0 deletions
diff --git a/src/LYexit.c b/src/LYexit.c
new file mode 100644
index 0000000..b266117
--- /dev/null
+++ b/src/LYexit.c
@@ -0,0 +1,183 @@
+/*
+ * $LynxId: LYexit.c,v 1.37 2018/03/21 00:50:51 tom Exp $
+ *
+ * Copyright (c) 1994, University of Kansas, All Rights Reserved
+ * (most of this file was rewritten in 1996 and 2004).
+ */
+#include <HTUtils.h>
+#include <LYexit.h>
+#include <HTAlert.h>
+#ifndef VMS
+#include <LYGlobalDefs.h>
+#include <LYUtils.h>
+#include <LYSignal.h>
+#include <LYMainLoop.h>
+#endif /* !VMS */
+#include <LYStrings.h>
+#include <LYClean.h>
+
+/*
+ * Flag for outofmem macro. - FM
+ */
+BOOL LYOutOfMemory = FALSE;
+
+/*
+ * Stack of functions to call upon exit.
+ */
+static void (*callstack[ATEXITSIZE]) (void);
+static int topOfStack = 0;
+
+/*
+ * Capture "atexit()" calls for our own accounting.
+ */
+int LYatexit(void (*function) (void))
+{
+ int result = 0;
+
+ if (topOfStack >= ATEXITSIZE) {
+ CTRACE((tfp, "(LY)atexit: Too many functions, ignoring one!\n"));
+ result = -1;
+ } else {
+ int n;
+ BOOLEAN found = FALSE;
+
+ for (n = 0; n < topOfStack; ++n) {
+ if (callstack[n] == function) {
+ found = TRUE;
+ break;
+ }
+ }
+ if (!found) {
+ callstack[topOfStack++] = function;
+ }
+ }
+ return result;
+}
+
+/*
+ * Purpose: Call the functions registered with LYatexit
+ * Arguments: void
+ * Return Value: void
+ * Remarks/Portability/Dependencies/Restrictions:
+ * Revision History:
+ * 06-15-94 created Lynx 2-3-1 Garrett Arch Blythe
+ */
+static void LYCompleteExit(void)
+{
+ /*
+ * Just loop through registered functions. This is reentrant if more exits
+ * occur in the registered functions.
+ */
+ while (--topOfStack >= 0) {
+ callstack[topOfStack] ();
+ }
+}
+
+/*
+ * Purpose: Terminates program, reports memory not freed.
+ * Arguments: status Exit code.
+ * Return Value: void
+ * Remarks/Portability/Dependencies/Restrictions:
+ * Function calls stdlib.h exit
+ * Revision History:
+ * 06-15-94 created Lynx 2-3-1 Garrett Arch Blythe
+ */
+void LYexit(int status)
+{
+#ifndef VMS /* On VMS, the VMSexit() handler does these. - FM */
+#ifdef _WINDOWS
+ DeleteCriticalSection(&critSec_READ);
+
+ WSACleanup();
+#endif
+ if (LYOutOfMemory == TRUE) {
+ /*
+ * Ignore further interrupts. - FM
+ */
+#ifndef NOSIGHUP
+ (void) signal(SIGHUP, SIG_IGN);
+#endif /* NOSIGHUP */
+ (void) signal(SIGTERM, SIG_IGN);
+ (void) signal(SIGINT, SIG_IGN);
+#ifndef __linux__
+#ifdef SIGBUS
+ (void) signal(SIGBUS, SIG_IGN);
+#endif /* SIGBUS */
+#endif /* !__linux__ */
+ (void) signal(SIGSEGV, SIG_IGN);
+ (void) signal(SIGILL, SIG_IGN);
+
+ /*
+ * Flush all messages. - FM
+ */
+ fflush(stderr);
+ fflush(stdout);
+
+ /*
+ * Deal with curses, if on, and clean up. - FM
+ */
+ if (LYCursesON) {
+ LYSleepAlert();
+ }
+ cleanup_sig(0);
+#ifndef __linux__
+#ifdef SIGBUS
+ signal(SIGBUS, SIG_DFL);
+#endif /* SIGBUS */
+#endif /* !__linux__ */
+ signal(SIGSEGV, SIG_DFL);
+ signal(SIGILL, SIG_DFL);
+ }
+#endif /* !VMS */
+
+ /*
+ * Close syslog before doing atexit-cleanup, since it may use a string
+ * that would be freed there.
+ */
+#ifdef SYSLOG_REQUESTED_URLS
+ LYCloselog();
+#endif
+
+ /*
+ * Do functions registered with LYatexit. - GAB
+ */
+ LYCompleteExit();
+
+ LYCloseCmdLogfile();
+
+#ifdef exit
+/* Make sure we use stdlib exit and not LYexit. - GAB
+*/
+#undef exit
+#endif /* exit */
+
+ cleanup_files(); /* if someone starts with LYNXfoo: page */
+#ifndef VMS /* On VMS, the VMSexit() handler does these. - FM */
+ fflush(stderr);
+ if (LYOutOfMemory == TRUE) {
+ LYOutOfMemory = FALSE;
+ printf("\r\n%s\r\n\r\n", MEMORY_EXHAUSTED_ABORT);
+ fflush(stdout);
+ }
+ LYCloseTracelog();
+#endif /* !VMS */
+ show_alloc();
+
+#if defined(NCURSES_VERSION) && defined(LY_FIND_LEAKS)
+#if defined(HAVE__NC_FREE_AND_EXIT)
+ _nc_free_and_exit(status);
+#elif defined(HAVE__NC_FREEALL)
+ _nc_freeall();
+#endif
+#endif /* NCURSES_VERSION */
+
+ exit(status);
+}
+
+void outofmem(const char *fname,
+ const char *func)
+{
+ fprintf(stderr, "\n\n\n%s %s: %s\n", fname, func, MEMORY_EXHAUSTED_ABORTING);
+ LYOutOfMemory = TRUE;
+ LYexit(-1);
+}