From 6c46840eab321fabe3df18be0dd8c81b87dca192 Mon Sep 17 00:00:00 2001 From: "John \"Elwin\" Edwards" Date: Sun, 3 Sep 2017 19:58:22 -0400 Subject: [PATCH] UltraRogue: add the autosave feature. UltraRogue now automatically saves the game when SIGHUP or SIGTERM is received. --- urogue/main.c | 8 ++++++++ urogue/mdport.c | 40 ++++++++++++++++++++++++++++++++++++++++ urogue/rogue.h | 2 ++ urogue/save.c | 12 ++++++++++++ 4 files changed, 62 insertions(+) diff --git a/urogue/main.c b/urogue/main.c index cea0360..7d26e6b 100644 --- a/urogue/main.c +++ b/urogue/main.c @@ -197,6 +197,8 @@ main(int argc, char *argv[]) food_left = (int) (food_left * scale); + md_onsignal_autosave(); + /* Set up windows */ cw = newwin(LINES, COLS, 0, 0); @@ -272,6 +274,12 @@ fatal(char *s) exit(100); } +void +fatal_handler(int sig) +{ + fatal(""); +} + /* rnd() Pick a very random number. diff --git a/urogue/mdport.c b/urogue/mdport.c index 827a6b9..a36c9dc 100644 --- a/urogue/mdport.c +++ b/urogue/mdport.c @@ -1271,3 +1271,43 @@ md_readchar(WINDOW *win) return(ch & 0x7F); } + +extern void auto_save(int sig); +extern void fatal_handler(int sig); +extern void quit_handler(int sig); + +void +md_onsignal_autosave(void) +{ +#ifdef SIGHUP + signal(SIGHUP, auto_save); +#endif +#ifdef SIGQUIT + signal(SIGQUIT, fatal_handler); +#endif +#ifdef SIGTERM + signal(SIGTERM, auto_save); +#endif +#ifdef SIGINT + signal(SIGINT, quit_handler); +#endif + return; +} + +void +md_ignore_signals(void) +{ +#ifdef SIGHUP + signal(SIGHUP, SIG_IGN); +#endif +#ifdef SIGQUIT + signal(SIGQUIT, SIG_IGN); +#endif +#ifdef SIGTERM + signal(SIGTERM, SIG_IGN); +#endif +#ifdef SIGINT + signal(SIGINT, SIG_IGN); +#endif + return; +} diff --git a/urogue/rogue.h b/urogue/rogue.h index c8be605..f884e54 100644 --- a/urogue/rogue.h +++ b/urogue/rogue.h @@ -1813,6 +1813,8 @@ void md_srandom(long seed); int md_readchar(WINDOW *win); int md_getuid(void); void md_normaluser(void); +void md_onsignal_autosave(void); +void md_ignore_signals(void); #define NOOP(x) (x += 0) #define CCHAR(x) ( (char) (x & A_CHARTEXT) ) diff --git a/urogue/save.c b/urogue/save.c index 7403566..f44dcbc 100644 --- a/urogue/save.c +++ b/urogue/save.c @@ -115,6 +115,18 @@ save_savedir_game(void) } } +void +auto_save(int sig) +{ + FILE *savef; + + md_ignore_signals(); + if (file_name[0] && (savef = fopen(file_name, "w"))) { + save_file(savef); + } + exit(0); +} + int restore(char *file) {