From f2d8a537187a9b46fac8028b1c6e232225a103d3 Mon Sep 17 00:00:00 2001 From: "nethack.rankin" Date: Tue, 9 Jan 2007 05:29:17 +0000 Subject: [PATCH] hangup() cleanup; SIGXCPU handling --- include/os2conf.h | 3 ++- src/end.c | 9 ++++++-- src/files.c | 4 ++-- src/save.c | 20 +++++------------ sys/unix/unixmain.c | 53 +++++++++++++++++++++++++-------------------- sys/vms/vmsmain.c | 13 ++++++++--- sys/vms/vmstty.c | 7 +++--- 7 files changed, 60 insertions(+), 49 deletions(-) diff --git a/include/os2conf.h b/include/os2conf.h index 3cb3a4274..1e96a6da1 100644 --- a/include/os2conf.h +++ b/include/os2conf.h @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)os2conf.h 3.5 1996/10/29 */ +/* SCCS Id: @(#)os2conf.h 3.5 2007/01/08 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Timo Hakulinen, 1990, 1991, 1992, 1993, 1996. */ /* NetHack may be freely redistributed. See license for details. */ @@ -95,6 +95,7 @@ #ifdef __EMX__ #include +#define sethanguphandler(foo) (void)signal(SIGHUP, (SIG_RET_TYPE)foo) #endif #ifndef REDO diff --git a/src/end.c b/src/end.c index 17afad2b9..0bc1e0114 100644 --- a/src/end.c +++ b/src/end.c @@ -178,7 +178,7 @@ done_hangup(sig) /* signal() handler */ int sig; { program_state.done_hup++; - (void)signal(SIGHUP, SIG_IGN); + sethanguphandler((void FDECL((*),(int)))SIG_IGN); done_intr(sig); return; } @@ -662,7 +662,7 @@ die: (void) signal(SIGINT, (SIG_RET_TYPE) done_intr); # if defined(UNIX) || defined(VMS) || defined (__EMX__) (void) signal(SIGQUIT, (SIG_RET_TYPE) done_intr); - (void) signal(SIGHUP, (SIG_RET_TYPE) done_hangup); + sethanguphandler(done_hangup); # endif #endif /* NO_SIGNAL */ @@ -1034,6 +1034,11 @@ int status; dlb_cleanup(); } +#ifdef VMS + /* don't call exit() if already executing within an exit handler; + that would cancel any other pending user-mode handlers */ + if (program_state.exiting) return; +#endif nethack_exit(status); } diff --git a/src/files.c b/src/files.c index a5f3780e4..4ab5aeeb6 100644 --- a/src/files.c +++ b/src/files.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)files.c 3.5 2006/12/09 */ +/* SCCS Id: @(#)files.c 3.5 2007/01/08 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -564,7 +564,7 @@ clearlocks() register int x; # if defined(UNIX) || defined(VMS) - (void) signal(SIGHUP, SIG_IGN); + sethanguphandler((void FDECL((*),(int)))SIG_IGN); # endif /* can't access maxledgerno() before dungeons are created -dlc */ for (x = (n_dgns ? maxledgerno() : 0); x >= 0; x--) diff --git a/src/save.c b/src/save.c index 3281f2da6..551428f1a 100644 --- a/src/save.c +++ b/src/save.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)save.c 3.5 2006/04/14 */ +/* SCCS Id: @(#)save.c 3.5 2007/01/08 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -140,9 +140,7 @@ int sig_unused; # ifdef NOSAVEONHANGUP (void) signal(SIGINT, SIG_IGN); clearlocks(); -# ifndef VMS terminate(EXIT_FAILURE); -# endif # else /* SAVEONHANGUP */ if (!program_state.done_hup++) { # ifndef SAFERHANGUP @@ -152,18 +150,12 @@ int sig_unused; * against losing objects in the process of being thrown. */ if (program_state.something_worth_saving) (void) dosave0(); -# ifdef VMS - /* don't call exit when already within an exit handler; - that would cancel any other pending user-mode handlers */ - if (!program_state.exiting) -# endif - { - clearlocks(); - terminate(EXIT_FAILURE); - } + + clearlocks(); + terminate(EXIT_FAILURE); # endif /* !SAFERHANGUP */ } -# endif +# endif /* !NOSAVEONHANGUP */ } #endif @@ -182,7 +174,7 @@ dosave0() fq_save = fqname(SAVEF, SAVEPREFIX, 1); /* level files take 0 */ #if defined(UNIX) || defined(VMS) - (void) signal(SIGHUP, SIG_IGN); + sethanguphandler((void FDECL((*),(int)))SIG_IGN); #endif #ifndef NO_SIGNAL (void) signal(SIGINT, SIG_IGN); diff --git a/sys/unix/unixmain.c b/sys/unix/unixmain.c index 54dd91f96..11c340ef7 100644 --- a/sys/unix/unixmain.c +++ b/sys/unix/unixmain.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)unixmain.c 3.5 2006/04/01 */ +/* SCCS Id: @(#)unixmain.c 3.5 2007/01/08 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -157,29 +157,7 @@ char *argv[]; * It seems you really want to play. */ u.uhp = 1; /* prevent RIP on early quits */ -#ifdef SA_RESTART - /* don't want reads to restart. If SA_RESTART is defined, we know - * sigaction exists and can be used to ensure reads won't restart. - * If it's not defined, assume reads do not restart. If reads restart - * and a signal occurs, the game won't do anything until the read - * succeeds (or the stream returns EOF, which might not happen if - * reading from, say, a window manager). */ - { - struct sigaction sact; - - (void) memset((char*) &sact, 0, sizeof(struct sigaction)); - sact.sa_handler = (SIG_RET_TYPE)hangup; - (void) sigaction(SIGHUP, &sact, (struct sigaction*)0); -#ifdef SIGXCPU - (void) sigaction(SIGXCPU, &sact, (struct sigaction*)0); -#endif - } -#else - (void) signal(SIGHUP, (SIG_RET_TYPE) hangup); -#ifdef SIGXCPU - (void) signal(SIGXCPU, (SIG_RET_TYPE) hangup); -#endif -#endif + sethanguphandler((SIG_RET_TYPE)hangup); process_options(argc, argv); /* command line options */ init_nhwindows(&argc, argv); /* now we can set up window system */ @@ -519,6 +497,33 @@ whoami() { return TRUE; } +void +sethanguphandler(handler) +void FDECL((*handler), (int)); +{ +#ifdef SA_RESTART + /* don't want reads to restart. If SA_RESTART is defined, we know + * sigaction exists and can be used to ensure reads won't restart. + * If it's not defined, assume reads do not restart. If reads restart + * and a signal occurs, the game won't do anything until the read + * succeeds (or the stream returns EOF, which might not happen if + * reading from, say, a window manager). */ + struct sigaction sact; + + (void) memset((genericptr_t)&sact, 0, sizeof sact); + sact.sa_handler = (SIG_RET_TYPE)handler; + (void) sigaction(SIGHUP, &sact, (struct sigaction *)0); +# ifdef SIGXCPU + (void) sigaction(SIGXCPU, &sact, (struct sigaction *)0); +# endif +#else /* !SA_RESTART */ + (void) signal(SIGHUP, (SIG_RET_TYPE)handler); +# ifdef SIGXCPU + (void) signal(SIGXCPU, (SIG_RET_TYPE)handler); +# endif +#endif /* ?SA_RESTART */ +} + #ifdef PORT_HELP void port_help() diff --git a/sys/vms/vmsmain.c b/sys/vms/vmsmain.c index 1124411c4..5a3796693 100644 --- a/sys/vms/vmsmain.c +++ b/sys/vms/vmsmain.c @@ -122,7 +122,7 @@ char *argv[]; /* used to clear hangup stuff while still giving standard traceback */ VAXC$ESTABLISH(vms_handler); #endif - (void) signal(SIGHUP, (SIG_RET_TYPE) hangup); + sethanguphandler(hangup); process_options(argc, argv); /* command line options */ @@ -389,8 +389,8 @@ byebye() extern unsigned long FDECL(sys$delprc,(unsigned long *,const genericptr_t)); /* clean up any subprocess we've spawned that may still be hanging around */ - if (dosh_pid) (void) sys$delprc(&dosh_pid, 0), dosh_pid = 0; - if (mail_pid) (void) sys$delprc(&mail_pid, 0), mail_pid = 0; + if (dosh_pid) (void) sys$delprc(&dosh_pid, (genericptr_t)0), dosh_pid = 0; + if (mail_pid) (void) sys$delprc(&mail_pid, (genericptr_t)0), mail_pid = 0; #endif /* SIGHUP doesn't seem to do anything on VMS, so we fudge it here... */ @@ -429,6 +429,13 @@ genericptr_t sigargs, mechargs; /* [0] is argc, [1..argc] are the real args */ } #endif +void +sethanguphandler(handler) +void FDECL((*handler), (int)); +{ + (void)signal(SIGHUP, (SIG_RET_TYPE)handler); +} + #ifdef PORT_HELP void port_help() diff --git a/sys/vms/vmstty.c b/sys/vms/vmstty.c index d95419de8..8f54e3d85 100644 --- a/sys/vms/vmstty.c +++ b/sys/vms/vmstty.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)vmstty.c 3.5 2005/11/19 */ +/* SCCS Id: @(#)vmstty.c 3.5 2007/01/08 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* tty.c - (VMS) version */ @@ -478,14 +478,15 @@ void error VA_DECL(const char *,s) VA_START(s); VA_INIT(s, const char *); - if(settty_needed) + + if (settty_needed) settty((char *)0); Vprintf(s,VA_ARGS); (void) putchar('\n'); VA_END(); #ifndef SAVE_ON_FATAL_ERROR /* prevent vmsmain's exit handler byebye() from calling hangup() */ - (void)signal(SIGHUP, SIG_DFL); + sethanguphandler((void FDECL((*),(int)))SIG_DFL); #endif exit(EXIT_FAILURE); } -- 2.40.0