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