home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume23 / trn / part12 / final.c < prev    next >
C/C++ Source or Header  |  1991-08-22  |  6KB  |  273 lines

  1. /* $Header: final.c,v 4.3.3.2 91/01/16 02:38:15 davison Trn $
  2.  *
  3.  * $Log:    final.c,v $
  4.  * Revision 4.3.3.2  91/01/16  02:38:15  davison
  5.  * Integrated rn patches 48-54.
  6.  * 
  7.  * Revision 4.3.3.1  90/06/20  22:36:57  davison
  8.  * Initial Trn Release
  9.  * 
  10.  * Revision 4.3.2.9  90/11/22  16:08:34  sob
  11.  * Added changes to accomodate pick C preprocessors.
  12.  * 
  13.  * Revision 4.3.2.8  90/04/14  19:37:14  sob
  14.  * Added better support for the NeXT.
  15.  * 
  16.  * Revision 4.3.2.7  90/03/17  21:33:49  sob
  17.  * cleaned up a bit
  18.  * 
  19.  * Revision 4.3.2.6  90/03/17  16:48:25  sob
  20.  * Added changes to insure that rrn cleans up its temporary files when
  21.  * exiting.
  22.  * 
  23.  * Revision 4.3.2.5  89/11/28  01:51:28  sob
  24.  * Now handles SIGWINCH correctly.
  25.  * 
  26.  * Revision 4.3.2.4  89/11/27  01:30:24  sob
  27.  * Altered NNTP code per ideas suggested by Bela Lubkin
  28.  * <filbo@gorn.santa-cruz.ca.us>
  29.  * 
  30.  * Revision 4.3.2.3  89/11/08  02:25:07  sob
  31.  * Integrated modifications from other RRN patches colleceted from USENET
  32.  * 
  33.  * Revision 4.3.2.2  89/11/07  23:26:31  sob
  34.  * Added some fixes that relate to SIGSTP
  35.  * 
  36.  * Revision 4.3.2.1  89/11/06  00:16:08  sob
  37.  * Added RRN support from NNTP 1.5
  38.  *
  39.  * Revision 4.3  85/05/01  11:38:08  lwall
  40.  * Baseline for release with 4.3bsd.
  41.  * 
  42.  */
  43.  
  44. #include "EXTERN.h"
  45. #include "common.h"
  46. #include "util.h"
  47. #include "term.h"
  48. #include "ng.h"
  49. #include "init.h"
  50. #include "bits.h"
  51. #include "last.h"
  52. #include "rcstuff.h"
  53. #include "ngdata.h"
  54. #include "artio.h"
  55. #include "INTERN.h"
  56. #include "final.h"
  57.  
  58. void
  59. final_init()
  60. {
  61. #ifdef SIGTSTP
  62.     sigset(SIGTSTP, stop_catcher);    /* job control signals */
  63.     sigset(SIGTTOU, stop_catcher);    /* job control signals */
  64.     sigset(SIGTTIN, stop_catcher);    /* job control signals */
  65. #endif
  66.  
  67.     sigset(SIGINT, int_catcher);    /* always catch interrupts */
  68. #ifdef SIGHUP
  69.     sigset(SIGHUP, sig_catcher);    /* and hangups */
  70. #endif
  71. #ifndef lint
  72. #ifdef SIGEMT
  73.     sigignore(SIGEMT);
  74. #endif
  75. #endif /* lint */
  76.  
  77.     sigset(SIGILL, sig_catcher);
  78. #ifdef SIGTRAP
  79.     sigset(SIGTRAP, sig_catcher);
  80. #endif
  81.     sigset(SIGFPE, sig_catcher);
  82. #ifdef SIGBUS
  83.     sigset(SIGBUS, sig_catcher);
  84. #endif
  85.     sigset(SIGSEGV, sig_catcher);
  86. #ifdef SIGSYS
  87.     sigset(SIGSYS, sig_catcher);
  88. #endif
  89.     sigset(SIGTERM, sig_catcher);
  90. #ifdef SIGXCPU
  91.     sigset(SIGXCPU, sig_catcher);
  92. #endif
  93. #ifdef SIGXFSZ
  94.     sigset(SIGXFSZ, sig_catcher);
  95. #endif
  96. #ifdef SIGWINCH
  97.     sigset(SIGWINCH, winch_catcher);
  98. #endif
  99. }
  100.  
  101. void                    /* very much void */
  102. finalize(status)
  103. int status;
  104. {
  105. #ifdef SERVER
  106.     char artname[32];
  107. #endif /* SERVER */
  108.  
  109.     if (bizarre)
  110.     resetty();
  111.     if (lockname && *lockname)
  112.      UNLINK(lockname);
  113. #ifdef SERVER
  114.     if (*active_name)
  115.     UNLINK(active_name);
  116.     if (openart) {
  117.      char artname[32];
  118.      sprintf(artname, "/tmp/rrn%ld.%d", (long)openart, getpid());
  119.      UNLINK(artname);
  120.     }
  121.     close_server();
  122. #endif /* SERVER */
  123.     if (status < 0) {
  124.     chdir("/usr/tmp");
  125.     sigset(SIGILL,SIG_DFL);
  126.     abort();
  127.     }
  128.     exit(status);
  129. }
  130.  
  131. /* come here on interrupt */
  132.  
  133. SIGRET
  134. int_catcher()
  135. {
  136.     sigset(SIGINT,int_catcher);
  137. #ifdef DEBUGGING
  138.     if (debug)
  139.     write(2,"int_catcher\n",12);
  140. #endif
  141.     if (!waiting) {
  142.     if (int_count) {        /* was there already an interrupt? */
  143.         write(2,"\nBye-bye.\n",10);
  144.         sig_catcher(0);        /* emulate the other signals */
  145.     }
  146.     int_count++;
  147.     }
  148. }
  149.  
  150. /* come here on signal other than interrupt, stop, or cont */
  151.  
  152. SIGRET
  153. sig_catcher(signo)
  154. {
  155. #ifdef VERBOSE
  156.     static char *signame[] = {
  157.     "",
  158.     "HUP",
  159.     "INT",
  160.     "QUIT",
  161.     "ILL",
  162.     "TRAP",
  163.     "IOT",
  164.     "EMT",
  165.     "FPE",
  166.     "KILL",
  167.     "BUS",
  168.     "SEGV",
  169.     "SYS",
  170.     "PIPE",
  171.     "ALRM",
  172.     "TERM",
  173.     "???"
  174. #ifdef SIGTSTP
  175.     ,"STOP",
  176.     "TSTP",
  177.     "CONT",
  178.     "CHLD",
  179.     "TTIN",
  180.     "TTOU",
  181.     "TINT",
  182.     "XCPU",
  183.     "XFSZ"
  184. #ifdef SIGPROF
  185.     ,"VTALARM",
  186.     "PROF"
  187. #endif
  188. #endif
  189.     };
  190. #endif
  191.  
  192. #ifdef DEBUGGING
  193.     if (debug) {
  194.     printf("\nSIG%s--.newsrc not restored in debug\n",signame[signo]);
  195.     finalize(-1);
  196.     }
  197. #endif
  198.     if (panic)
  199.     abort();
  200.     (void) sigset(SIGILL,SIG_DFL);
  201.     panic = TRUE;            /* disable terminal I/O */
  202.     if (doing_ng) {            /* need we reconstitute rc line? */
  203.     yankback();
  204.     restore_ng();            /* then do so (hope this works) */
  205.     }
  206.     doing_ng = FALSE;
  207.     if (rc_changed)            /* need we write .newsrc out? */
  208.     write_rc();            /* then do so */
  209.     rc_changed = FALSE;
  210. #ifdef SIGHUP
  211.     if (signo != SIGHUP)
  212. #endif
  213. #ifdef VERBOSE
  214.     IF(verbose)
  215.         printf("\nCaught %s%s--.newsrc restored\n",
  216.         signo ? "a SIG" : "an internal error", signame[signo]);
  217.     ELSE
  218. #endif
  219. #ifdef TERSE
  220.         printf("\nSignal %d--bye bye\n",signo);
  221. #endif
  222.     switch (signo) {
  223. #ifdef SIGBUS
  224.     case SIGBUS:
  225. #endif
  226.     case SIGILL:
  227.     case SIGSEGV:
  228.     finalize(-signo);
  229.     }
  230.     finalize(1);                /* and blow up */
  231. }
  232.  
  233. #ifdef SIGTSTP
  234. /* come here on stop signal */
  235.  
  236. SIGRET
  237. stop_catcher(signo)
  238. int signo;
  239. {
  240.     if (!waiting) {
  241.     checkpoint_rc();        /* good chance of crash while stopped */
  242.     if (clear_on_stop) {
  243.         clear();
  244.         putchar('\n') FLUSH;
  245.     }
  246.     resetty();            /* this is the point of all this */
  247. #ifdef DEBUGGING
  248.     if (debug)
  249.         write(2,"stop_catcher\n",13);
  250. #endif
  251.     sigset(signo,SIG_DFL);    /* enable stop */
  252. #ifdef SIGBLOCK
  253.     sigsetmask(sigblock(0) & ~(1 << (signo-1)));
  254. #endif
  255.     kill(0,signo);        /* and do the stop */
  256.         savetty();
  257. #ifdef MAILCALL
  258.         mailcount = 0;            /* force recheck */
  259. #endif
  260.         if (!panic) {
  261.         if (!waiting) {
  262.             noecho();            /* set no echo */
  263.             crmode();            /* set cbreak mode */
  264.             forceme("\f");        /* cause a refresh */
  265.                     /* (defined only if TIOCSTI defined) */
  266.         errno = 0;            /* needed for getcmd */
  267.         }
  268.         }
  269.     }
  270.     sigset(signo,stop_catcher);    /* unenable the stop */
  271. }
  272. #endif
  273.