Home | History | Annotate | Line # | Download | only in warp
sig.c revision 1.4
      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.4  christos sig_init(void)
     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.3     kamil cont_catcher(int x)
     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.4  christos mytstp(void)
     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.4  christos finalize(int status)
     98  1.1     kamil {
     99  1.1     kamil     if (bizarre)
    100  1.1     kamil 	resetty();
    101  1.1     kamil     if (status < 0) {
    102  1.1     kamil 	chdir("/usr/tmp");
    103  1.1     kamil 	sigset(SIGILL,SIG_DFL);
    104  1.1     kamil 	abort();
    105  1.1     kamil     }
    106  1.1     kamil     exit(status);
    107  1.1     kamil }
    108  1.1     kamil 
    109  1.1     kamil /* come here on signal other than interrupt, stop, or cont */
    110  1.1     kamil 
    111  1.1     kamil void
    112  1.3     kamil sig_catcher(int signo)
    113  1.1     kamil {
    114  1.1     kamil #ifdef VERBOSE
    115  1.4  christos     static const char *signame[] = {
    116  1.1     kamil 	"",
    117  1.1     kamil 	"HUP",
    118  1.1     kamil 	"INT",
    119  1.1     kamil 	"QUIT",
    120  1.1     kamil 	"ILL",
    121  1.1     kamil 	"TRAP",
    122  1.1     kamil 	"IOT",
    123  1.1     kamil 	"EMT",
    124  1.1     kamil 	"FPE",
    125  1.1     kamil 	"KILL",
    126  1.1     kamil 	"BUS",
    127  1.1     kamil 	"SEGV",
    128  1.1     kamil 	"SYS",
    129  1.1     kamil 	"PIPE",
    130  1.1     kamil 	"ALRM",
    131  1.1     kamil 	"TERM",
    132  1.1     kamil 	"???"
    133  1.1     kamil #ifdef SIGTSTP
    134  1.1     kamil 	,"STOP",
    135  1.1     kamil 	"TSTP",
    136  1.1     kamil 	"CONT",
    137  1.1     kamil 	"CHLD",
    138  1.1     kamil 	"TTIN",
    139  1.1     kamil 	"TTOU",
    140  1.1     kamil 	"TINT",
    141  1.1     kamil 	"XCPU",
    142  1.1     kamil 	"XFSZ"
    143  1.1     kamil #ifdef SIGPROF
    144  1.1     kamil 	,"VTALARM",
    145  1.1     kamil 	"PROF"
    146  1.1     kamil #endif
    147  1.1     kamil #endif
    148  1.1     kamil 	};
    149  1.1     kamil #endif
    150  1.1     kamil 
    151  1.1     kamil #ifdef SIGTTOU
    152  1.1     kamil #ifndef lint
    153  1.1     kamil     sigignore(SIGTTOU);
    154  1.1     kamil #endif /* lint */
    155  1.1     kamil #endif
    156  1.1     kamil #ifdef DEBUGGING
    157  1.1     kamil     if (debug) {
    158  1.1     kamil 	printf("\r\nSIG%s--game not saved in debug\r\n",signame[signo]);
    159  1.1     kamil 	finalize(-1);
    160  1.1     kamil     }
    161  1.1     kamil #endif
    162  1.1     kamil     panic++;
    163  1.1     kamil     if (panic >= 2) {
    164  1.1     kamil 	if (panic >= 3)
    165  1.1     kamil 	    abort();
    166  1.1     kamil 	chdir(SAVEDIR);
    167  1.1     kamil 	kill(0,SIGIOT);
    168  1.1     kamil     }
    169  1.1     kamil     (void) sigset(SIGILL,SIG_DFL);
    170  1.1     kamil     if (signo == SIGHUP && (timer < 10 || didkill))
    171  1.1     kamil 	signo = SIGQUIT;
    172  1.1     kamil     if (signo == SIGQUIT) {	/* can't let them bomb out without penalty */
    173  1.1     kamil 	if (smarts < 20)
    174  1.1     kamil 	    smarts += 4;
    175  1.1     kamil 	else if (smarts < 35)
    176  1.1     kamil 	    smarts += 2;
    177  1.1     kamil 	else
    178  1.1     kamil 	    smarts++;
    179  1.1     kamil 	totalscore -= possiblescore / 2;
    180  1.1     kamil     }
    181  1.1     kamil     save_game();
    182  1.4  christos     if (signo != SIGHUP && signo != SIGQUIT) {
    183  1.1     kamil #ifdef VERBOSE
    184  1.1     kamil 	IF(verbose)
    185  1.1     kamil 	    printf("\r\nCaught %s%s--%s\r\n",
    186  1.1     kamil 		signo ? "a SIG" : "an internal error", signame[signo],
    187  1.1     kamil 		experimenting ? "game saved" : "bye bye");
    188  1.1     kamil 	ELSE
    189  1.1     kamil #endif
    190  1.1     kamil #ifdef TERSE
    191  1.4  christos 	    printf("\r\nsignal %d--bye bye\r\n",signo);
    192  1.1     kamil #endif
    193  1.4  christos     }
    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.3     kamil stop_catcher(int sig)
    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