|
Packit |
f574b8 |
/* $LynxId: LYClean.c,v 1.40 2013/10/10 23:47:25 tom Exp $ */
|
|
Packit |
f574b8 |
#include <HTUtils.h>
|
|
Packit |
f574b8 |
#include <LYCurses.h>
|
|
Packit |
f574b8 |
#include <LYUtils.h>
|
|
Packit |
f574b8 |
#include <LYSignal.h>
|
|
Packit |
f574b8 |
#include <LYClean.h>
|
|
Packit |
f574b8 |
#include <LYMainLoop.h>
|
|
Packit |
f574b8 |
#include <LYGlobalDefs.h>
|
|
Packit |
f574b8 |
#include <LYTraversal.h>
|
|
Packit |
f574b8 |
#include <LYHistory.h>
|
|
Packit |
f574b8 |
#include <LYCookie.h>
|
|
Packit |
f574b8 |
#include <LYSession.h>
|
|
Packit |
f574b8 |
#include <UCAuto.h>
|
|
Packit |
f574b8 |
#include <HTAlert.h>
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
#include <LYexit.h>
|
|
Packit |
f574b8 |
#include <LYLeaks.h>
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
#ifdef DJGPP
|
|
Packit |
f574b8 |
extern void sig_handler_watt(int);
|
|
Packit |
f574b8 |
#endif /* DJGPP */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
#ifdef VMS
|
|
Packit |
f574b8 |
BOOLEAN HadVMSInterrupt = FALSE;
|
|
Packit |
f574b8 |
#endif /* VMS */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Interrupt handler. Stop curses and exit gracefully.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
void cleanup_sig(int sig)
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
#ifdef IGNORE_CTRL_C
|
|
Packit |
f574b8 |
if (sig == SIGINT) {
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Need to rearm the signal.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
#ifdef DJGPP
|
|
Packit |
f574b8 |
if (wathndlcbrk) {
|
|
Packit |
f574b8 |
sig_handler_watt(sig); /* Use WATT-32 signal handler */
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
#endif /* DJGPP */
|
|
Packit |
f574b8 |
signal(SIGINT, cleanup_sig);
|
|
Packit |
f574b8 |
sigint = TRUE;
|
|
Packit |
f574b8 |
#ifdef DJGPP
|
|
Packit |
f574b8 |
_eth_release();
|
|
Packit |
f574b8 |
_eth_init();
|
|
Packit |
f574b8 |
#endif /* DJGPP */
|
|
Packit |
f574b8 |
return;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
#endif /* IGNORE_CTRL_C */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
#ifdef VMS
|
|
Packit |
f574b8 |
if (!dump_output_immediately) {
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Reassert the AST.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
(void) signal(SIGINT, cleanup_sig);
|
|
Packit |
f574b8 |
if (LYCursesON) {
|
|
Packit |
f574b8 |
lynx_force_repaint(); /* wipe away the "cancel" message */
|
|
Packit |
f574b8 |
LYrefresh();
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Ask if exit is intended.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
if (LYQuitDefaultYes == TRUE) {
|
|
Packit |
f574b8 |
int Dft = ((LYQuitDefaultYes == TRUE) ? YES : NO);
|
|
Packit |
f574b8 |
int c = HTConfirmDefault(REALLY_EXIT, Dft);
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
HadVMSInterrupt = TRUE;
|
|
Packit |
f574b8 |
if (c != Dft) {
|
|
Packit |
f574b8 |
return;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
return;
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
#endif /* VMS */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Ignore signals from terminal.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
#ifndef NOSIGHUP
|
|
Packit |
f574b8 |
(void) signal(SIGHUP, SIG_IGN);
|
|
Packit |
f574b8 |
#endif /* NOSIGHUP */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
#ifdef VMS
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Use ttclose() from cleanup() for VMS if not dumping.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
if (dump_output_immediately)
|
|
Packit |
f574b8 |
(void) signal(SIGTERM, SIG_IGN);
|
|
Packit |
f574b8 |
#else /* Unix: */
|
|
Packit |
f574b8 |
(void) signal(SIGINT, SIG_IGN);
|
|
Packit |
f574b8 |
(void) signal(SIGTERM, SIG_IGN);
|
|
Packit |
f574b8 |
#endif /* VMS */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
if (traversal)
|
|
Packit |
f574b8 |
dump_traversal_history();
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
#ifndef NOSIGHUP
|
|
Packit |
f574b8 |
if (sig != SIGHUP) {
|
|
Packit |
f574b8 |
#endif /* NOSIGHUP */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
if (!dump_output_immediately) {
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* cleanup() also calls cleanup_files().
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
cleanup();
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
if (sig != 0) {
|
|
Packit |
f574b8 |
SetOutputMode(O_TEXT);
|
|
Packit |
f574b8 |
printf("\n\n%s %d\n\n",
|
|
Packit |
f574b8 |
gettext("Exiting via interrupt:"),
|
|
Packit |
f574b8 |
sig);
|
|
Packit |
f574b8 |
fflush(stdout);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
#ifndef NOSIGHUP
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
#ifdef USE_SESSIONS
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* It is useful to save the session if a user closed lynx in a
|
|
Packit |
f574b8 |
* nonstandard way, such as closing xterm window or in even a crash.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
SaveSession();
|
|
Packit |
f574b8 |
#endif /* USE_SESSIONS */
|
|
Packit |
f574b8 |
cleanup_files();
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
#endif /* NOSIGHUP */
|
|
Packit |
f574b8 |
if (sig != 0) {
|
|
Packit |
f574b8 |
exit_immediately(EXIT_SUCCESS);
|
|
Packit |
f574b8 |
} else {
|
|
Packit |
f574b8 |
reset_signals();
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Called by interrupt handler or at quit-time, this erases the temporary files
|
|
Packit |
f574b8 |
* that lynx created.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
void cleanup_files(void)
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
LYCleanupTemp();
|
|
Packit |
f574b8 |
FREE(lynx_temp_space);
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
void cleanup(void)
|
|
Packit |
f574b8 |
{
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Ignore signals from terminal.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
#ifndef NOSIGHUP
|
|
Packit |
f574b8 |
(void) signal(SIGHUP, SIG_IGN);
|
|
Packit |
f574b8 |
#endif /* NOSIGHUP */
|
|
Packit |
f574b8 |
#ifndef VMS /* use ttclose() from cleanup() for VMS */
|
|
Packit |
f574b8 |
(void) signal(SIGINT, SIG_IGN);
|
|
Packit |
f574b8 |
#endif /* !VMS */
|
|
Packit |
f574b8 |
(void) signal(SIGTERM, SIG_IGN);
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
if (LYCursesON) {
|
|
Packit |
f574b8 |
LYParkCursor();
|
|
Packit |
f574b8 |
lynx_stop_all_colors();
|
|
Packit |
f574b8 |
LYrefresh();
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
stop_curses();
|
|
Packit |
f574b8 |
}
|
|
Packit |
f574b8 |
#ifdef EXP_CHARTRANS_AUTOSWITCH
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* Currently implemented only for LINUX: Restore original font.
|
|
Packit |
f574b8 |
*/ UCChangeTerminalCodepage(-1, (LYUCcharset *) 0);
|
|
Packit |
f574b8 |
#endif /* EXP_CHARTRANS_AUTOSWITCH */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
#ifdef USE_PERSISTENT_COOKIES
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* This can go right here for now. We need to work up a better place
|
|
Packit |
f574b8 |
* to save cookies for the next release, preferably whenever a new
|
|
Packit |
f574b8 |
* persistent cookie is received or used. Some sort of protocol to
|
|
Packit |
f574b8 |
* handle two processes writing to the cookie file needs to be worked
|
|
Packit |
f574b8 |
* out as well.
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
if (persistent_cookies)
|
|
Packit |
f574b8 |
LYStoreCookies(LYCookieSaveFile);
|
|
Packit |
f574b8 |
#endif
|
|
Packit |
f574b8 |
#ifdef USE_SESSIONS
|
|
Packit |
f574b8 |
SaveSession();
|
|
Packit |
f574b8 |
#endif /* USE_SESSIONS */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
cleanup_files();
|
|
Packit |
f574b8 |
#ifdef VMS
|
|
Packit |
f574b8 |
ttclose();
|
|
Packit |
f574b8 |
DidCleanup = TRUE;
|
|
Packit |
f574b8 |
#endif /* VMS */
|
|
Packit |
f574b8 |
|
|
Packit |
f574b8 |
/*
|
|
Packit |
f574b8 |
* If we're looking at memory leaks, hang onto the trace file, since there
|
|
Packit |
f574b8 |
* is no memory freed in this function, and it is a nuisance to not be able
|
|
Packit |
f574b8 |
* to trace the cleanup activity -TD
|
|
Packit |
f574b8 |
*/
|
|
Packit |
f574b8 |
#ifndef LY_FIND_LEAKS
|
|
Packit |
f574b8 |
LYCloseTracelog();
|
|
Packit |
f574b8 |
#endif
|
|
Packit |
f574b8 |
}
|