]> granicus.if.org Git - nethack/commitdiff
hangup() cleanup; SIGXCPU handling
authornethack.rankin <nethack.rankin>
Tue, 9 Jan 2007 05:29:17 +0000 (05:29 +0000)
committernethack.rankin <nethack.rankin>
Tue, 9 Jan 2007 05:29:17 +0000 (05:29 +0000)
include/os2conf.h
src/end.c
src/files.c
src/save.c
sys/unix/unixmain.c
sys/vms/vmsmain.c
sys/vms/vmstty.c

index 3cb3a4274c5fb6df666fdb859c34181ba9e17bfe..1e96a6da1ab5277859413dc1e9d6d55f478659c5 100644 (file)
@@ -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 <unistd.h>
+#define sethanguphandler(foo) (void)signal(SIGHUP, (SIG_RET_TYPE)foo)
 #endif
 
 #ifndef REDO
index 17afad2b9eccbf9d1c2552771db978e4b12e4529..0bc1e0114ff52b454896629ef7a4378d9fd161b1 100644 (file)
--- 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);
 }
 
index a5f3780e4ed43195afbad6a588308bb54889046f..4ab5aeeb61acbcf52986623bd6d38e6a99ccd2b6 100644 (file)
@@ -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--)
index 3281f2da607b8ccae73d09571644c075eecc8f86..551428f1a8d9113546d6b42b71b3b7314cfc9a97 100644 (file)
@@ -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);
index 54dd91f96768b25e19f72e9f57aef7013085fc42..11c340ef75dd21ff40094de3b7d264fb50185080 100644 (file)
@@ -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()
index 1124411c4253c0fb63a8bc5e18826810c251a2cf..5a37966936bd9fe9f0654813a6ee2522c14c30ed 100644 (file)
@@ -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()
index d95419de829aaf7208eb7469760097c46905d54a..8f54e3d85f80f2cacccc56afb7ce263666e112e5 100644 (file)
@@ -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);
 }