Blame src/LYClean.c

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
}