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