home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Linux / Divers / lynx2.8.1dev.10.tar.gz / lynx2.8.1dev.10.tar / lynx2-8 / src / LYexit.c < prev    next >
C/C++ Source or Header  |  1998-05-10  |  4KB  |  172 lines

  1. /*
  2.  *    Copyright (c) 1994, University of Kansas, All Rights Reserved
  3.  */
  4. #include <HTUtils.h>
  5. #include <tcp.h>
  6. #include <LYexit.h>
  7. #ifndef VMS
  8. #include <LYGlobalDefs.h>
  9. #include <LYUtils.h>
  10. #include <LYSignal.h>
  11. #include <LYClean.h>
  12. #include <LYMainLoop.h>
  13. #ifdef SYSLOG_REQUESTED_URLS
  14. #include <syslog.h>
  15. #endif /* SYSLOG_REQUESTED_URLS */
  16. #endif /* !VMS */
  17.  
  18. #define FREE(x) if (x) {free(x); x = NULL;}
  19.  
  20. /*
  21.  *  Stack of functions to call upon exit.
  22.  */
  23. PRIVATE void (*callstack[ATEXITSIZE]) NOPARAMS;
  24. PRIVATE int topOfStack = 0;
  25.  
  26. /*
  27.  *  Flag for outofmem macro. - FM
  28.  */
  29. PUBLIC BOOL LYOutOfMemory = FALSE;
  30.  
  31. /*
  32.  *  Forward declarations.
  33.  */
  34. PRIVATE void LYCompleteExit NOPARAMS;
  35.  
  36. /*
  37.  *  Purpose:        Terminates program.
  38.  *  Arguments:        status    Exit code.
  39.  *  Return Value:    void
  40.  *  Remarks/Portability/Dependencies/Restrictions:
  41.  *    Function calls stdlib.h exit
  42.  *  Revision History:
  43.  *    06-15-94    created Lynx 2-3-1 Garrett Arch Blythe
  44.  */
  45. PUBLIC void LYexit ARGS1(
  46.     int,        status)
  47. {
  48. #ifndef VMS    /*  On VMS, the VMSexit() handler does these. - FM */
  49. #ifdef _WINDOWS
  50.     WSACleanup();
  51. #endif
  52.     if (LYOutOfMemory == TRUE) {
  53.     /*
  54.      *  Ignore further interrupts. - FM
  55.      */
  56. #ifndef NOSIGHUP
  57.     (void) signal(SIGHUP, SIG_IGN);
  58. #endif /* NOSIGHUP */
  59.     (void) signal (SIGTERM, SIG_IGN);
  60.     (void) signal (SIGINT, SIG_IGN);
  61. #ifndef __linux__
  62. #ifndef DOSPATH
  63.     (void) signal(SIGBUS, SIG_IGN);
  64. #endif /* DOSPATH */
  65. #endif /* !__linux__ */
  66.     (void) signal(SIGSEGV, SIG_IGN);
  67.     (void) signal(SIGILL, SIG_IGN);
  68.  
  69.      /*
  70.       *  Flush all messages. - FM
  71.       */
  72.      fflush(stderr);
  73.      fflush(stdout);
  74.  
  75.     /*
  76.      *  Deal with curses, if on, and clean up. - FM
  77.      */
  78.     if (LYCursesON) {
  79.         sleep(AlertSecs);
  80.     }
  81.     cleanup_sig(0);
  82. #ifndef __linux__
  83. #ifndef DOSPATH
  84.     signal(SIGBUS, SIG_DFL);
  85. #endif /* DOSPATH */
  86. #endif /* !__linux__ */
  87.     signal(SIGSEGV, SIG_DFL);
  88.     signal(SIGILL, SIG_DFL);
  89.     }
  90. #endif /* !VMS */
  91.  
  92.     /*
  93.      *    Do functions registered with LYatexit. - GAB
  94.      */
  95.     LYCompleteExit();
  96.  
  97. #ifndef VMS
  98. #ifdef SYSLOG_REQUESTED_URLS
  99.     syslog(LOG_INFO, "Session over");
  100.     closelog();
  101. #endif /* SYSLOG_REQUESTED_URLS */
  102. #endif /* !VMS */
  103.  
  104. #ifdef exit
  105. /*  Make sure we use stdlib exit and not LYexit. - GAB
  106. */
  107. #undef exit
  108. #endif /* exit */
  109.  
  110. #ifndef VMS    /*  On VMS, the VMSexit() handler does these. - FM */
  111.     fflush(stderr);
  112.     if (LYOutOfMemory == TRUE) {
  113.     LYOutOfMemory = FALSE;
  114.     printf("\r\n%s\r\n\r\n", MEMORY_EXHAUSTED_ABORT);
  115.     fflush(stdout);
  116.     }
  117.     LYCloseTracelog();
  118. #endif /* !VMS */
  119.     exit(status);
  120. }
  121.  
  122. /*
  123.  *  Purpose:        Registers termination function.
  124.  *  Arguments:        function    The function to register.
  125.  *  Return Value:    int    0    registered
  126.  *                !0    no more space to register
  127.  *  Remarks/Portability/Dependencies/Restrictions:
  128.  *  Revision History:
  129.  *    06-15-94    created Lynx 2-3-1 Garrett Arch Blythe
  130.  */
  131. #ifdef __STDC__
  132. PUBLIC int LYatexit(void (*function)(void))
  133. #else /* Not ANSI, ugh! */
  134. PUBLIC int LYatexit(function)
  135. void (*function)();
  136. #endif /* __STDC__ */
  137. {
  138.     /*
  139.      *  Check for available space.
  140.      */
  141.     if (topOfStack == ATEXITSIZE) {
  142.     CTRACE(tfp, "(LY)atexit: Too many functions, ignoring one!\n");
  143.     return(-1);
  144.     }
  145.  
  146.     /*
  147.      *  Register the function.
  148.      */
  149.     callstack[topOfStack] = function;
  150.     topOfStack++;
  151.     return(0);
  152. }
  153.  
  154. /*
  155.  *  Purpose:        Call the functions registered with LYatexit
  156.  *  Arguments:        void
  157.  *  Return Value:    void
  158.  *  Remarks/Portability/Dependencies/Restrictions:
  159.  *  Revision History:
  160.  *    06-15-94    created Lynx 2-3-1 Garrett Arch Blythe
  161.  */
  162. PRIVATE void LYCompleteExit NOPARAMS
  163. {
  164.     /*
  165.      *  Just loop through registered functions.
  166.      *  This is reentrant if more exits occur in the registered functions.
  167.      */
  168.     while (--topOfStack >= 0) {
  169.     callstack[topOfStack]();
  170.     }
  171. }
  172.