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