home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Games / warp / sig.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-05-03  |  3.8 KB  |  229 lines

  1. /* $Header: /b/iv/src/warp/RCS/sig.c,v 1.1 1993/06/09 23:35:21 iv Exp iv $ */
  2.  
  3. /* $Log: sig.c,v $
  4.  * Revision 1.1  1993/06/09  23:35:21  iv
  5.  * Initial revision
  6.  *
  7.  * Revision 7.0.1.1a  87/07/03  01:47:11  games
  8.  * Changed sigsetmask to use sigmask instead of calculating it (incorrectly)
  9.  * by hand.
  10.  * 
  11.  * Revision 7.0.1.1  86/12/12  17:02:44  lwall
  12.  * Baseline for net release.
  13.  * 
  14.  * Revision 7.0  86/10/08  15:13:24  lwall
  15.  * Split into separate files.  Added amoebas and pirates.
  16.  * 
  17.  */
  18.  
  19. #include "EXTERN.h"
  20. #include "warp.h"
  21. #include "play.h"
  22. #include "score.h"
  23. #include "term.h"
  24. #include "util.h"
  25. #include "INTERN.h"
  26. #include "sig.h"
  27.  
  28. void
  29. sig_init()
  30. {
  31. #ifdef lint
  32.     ;
  33. #else
  34.     sigignore(SIGINT);  /* for inquiry of existence via kill call */
  35. #ifdef SIGTTOU
  36.     sigignore(SIGTTOU);
  37. #endif
  38.  
  39.     sigset(SIGHUP, sig_catcher);
  40.     if (!debugging) {
  41.     sigset(SIGQUIT, sig_catcher);
  42.     sigset(SIGILL, sig_catcher);
  43.     sigset(SIGFPE, sig_catcher);
  44.     sigset(SIGBUS, sig_catcher);
  45.     sigset(SIGSEGV, sig_catcher);
  46.     sigset(SIGSYS, sig_catcher);
  47.     sigset(SIGTERM, sig_catcher);
  48.     }
  49. #ifdef SIGXCPU
  50.     sigset(SIGXCPU, sig_catcher);
  51. #endif
  52. #ifdef SIGCONT
  53.     sigset(SIGCONT, cont_catcher);
  54. #endif
  55. #ifdef SIGTSTP
  56.     sigset(SIGTSTP, stop_catcher);
  57.     sigset(SIGSTOP, stop_catcher);
  58. #endif
  59. #endif /* lint */
  60. }
  61.  
  62. #ifdef SIGTSTP
  63. void
  64. cont_catcher()
  65. {
  66. #ifndef lint
  67.     sigset(SIGCONT,cont_catcher);
  68. #endif
  69.     savetty();
  70.     crmode();
  71.     raw();
  72.     noecho();
  73.     nonl();
  74. }
  75. #endif
  76.  
  77. void
  78. mytstp()
  79. {
  80.     resetty();
  81. #ifdef SIGTSTP
  82.     kill(0,SIGTSTP);
  83. #else
  84.     if (fork())
  85.     wait(0);
  86.     else {
  87.     char *shell = getenv("SHELL");
  88.  
  89.     setuid(getuid());
  90.     if (!*shell)
  91.         shell = "/bin/sh";
  92.     execl(shell,shell,0);
  93.     exit(1);
  94.     }
  95. #endif
  96.     rewrite();
  97. }
  98.  
  99. void                    /* very much void */
  100. finalize(status)
  101. int status;
  102. {
  103.     if (bizarre)
  104.     resetty();
  105.     if (status < 0) {
  106.     chdir("/usr/tmp");
  107.     sigset(SIGILL,SIG_DFL);
  108.     abort();
  109.     }
  110.     exit(status);
  111. }
  112.  
  113. /* come here on signal other than interrupt, stop, or cont */
  114.  
  115. void
  116. sig_catcher(signo)
  117. {
  118. #ifdef VERBOSE
  119.     static char *signame[] = {
  120.     "",
  121.     "HUP",
  122.     "INT",
  123.     "QUIT",
  124.     "ILL",
  125.     "TRAP",
  126.     "IOT",
  127.     "EMT",
  128.     "FPE",
  129.     "KILL",
  130.     "BUS",
  131.     "SEGV",
  132.     "SYS",
  133.     "PIPE",
  134.     "ALRM",
  135.     "TERM",
  136.     "???"
  137. #ifdef SIGTSTP
  138.     ,"STOP",
  139.     "TSTP",
  140.     "CONT",
  141.     "CHLD",
  142.     "TTIN",
  143.     "TTOU",
  144.     "TINT",
  145.     "XCPU",
  146.     "XFSZ"
  147. #ifdef SIGPROF
  148.     ,"VTALARM",
  149.     "PROF"
  150. #endif
  151. #endif
  152.     };
  153. #endif
  154.  
  155. #ifdef SIGTTOU
  156. #ifndef lint
  157.     sigignore(SIGTTOU);
  158. #endif /* lint */
  159. #endif
  160. #ifdef DEBUGGING
  161.     if (debug) {
  162.     printf("\r\nSIG%s--game not saved in debug\r\n",signame[signo]);
  163.     finalize(-1);
  164.     }
  165. #endif
  166.     panic++;
  167.     if (panic >= 2) {
  168.     if (panic >= 3)
  169.         abort();
  170.     chdir(SAVEDIR);
  171.     kill(0,SIGIOT);
  172.     }
  173.     (void) sigset(SIGILL,SIG_DFL);
  174.     if (signo == SIGHUP && (timer < 10 || didkill))
  175.     signo = SIGQUIT;
  176.     if (signo == SIGQUIT) {    /* can't let them bomb out without penalty */
  177.     if (smarts < 20)
  178.         smarts += 4;
  179.     else if (smarts < 35)
  180.         smarts += 2;
  181.     else
  182.         smarts++;
  183.     totalscore -= possiblescore / 2;
  184.     }
  185.     save_game();
  186.     if (signo != SIGHUP && signo != SIGQUIT)
  187. #ifdef VERBOSE
  188.     IF(verbose)
  189.         printf("\r\nCaught %s%s--%s\r\n",
  190.         signo ? "a SIG" : "an internal error", signame[signo],
  191.         experimenting ? "game saved" : "bye bye");
  192.     ELSE
  193. #endif
  194. #ifdef TERSE
  195.         printf("\r\nSignal %d--bye bye\r\n",signo);
  196. #endif
  197.     switch (signo) {
  198.     case SIGBUS:
  199.     case SIGILL:
  200.     case SIGSEGV:
  201.     finalize(-signo);
  202.     }
  203.     finalize(1);                /* and blow up */
  204. }
  205.  
  206. #ifdef SIGTSTP
  207. /* come here on stop signal */
  208.  
  209. void
  210. stop_catcher()
  211. {
  212.     if (!waiting) {
  213.     resetty();            /* this is the point of all this */
  214. #ifdef DEBUGGING
  215.     if (debug)
  216.         write(2,"stop_catcher\r\n",13);
  217. #endif
  218.     sigset(SIGTSTP,SIG_DFL);    /* enable stop */
  219. #ifdef BSD42
  220.     sigsetmask(sigblock(0L) & ~sigmask(SIGTSTP));
  221. #endif
  222.     kill(0,SIGTSTP);        /* and do the stop */
  223.     }
  224. #ifndef lint
  225.     sigset(SIGTSTP,stop_catcher);    /* unenable the stop */
  226. #endif
  227. }
  228. #endif
  229.