diff --git a/src/version.c b/src/version.c index 72ea79348..f1303744d 100644 --- a/src/version.c +++ b/src/version.c @@ -3,9 +3,12 @@ /*-Copyright (c) Michael Allison, 2018. */ /* NetHack may be freely redistributed. See license for details. */ + #include "hack.h" #include "dlb.h" +#ifndef MINIMAL_FOR_RECOVER + #ifndef OPTIONS_AT_RUNTIME #define OPTIONS_AT_RUNTIME #endif @@ -513,6 +516,7 @@ dump_version_info(void) release_runtime_info(); return; } +#endif /* MINIMAL_FOR_RECOVER */ struct critical_sizes_with_names { uchar ucsize; @@ -647,6 +651,7 @@ get_critical_size_count(void) return SIZE(critical_sizes); } +#ifndef MINIMAL_FOR_RECOVER void store_critical_bytes(NHFILE *nhfp) { @@ -741,5 +746,6 @@ compare_critical_bytes(NHFILE *nhfp) } return 0; /* everything matched */ } +#endif /* MINIMAL_FOR_RECOVER */ /*version.c*/ diff --git a/sys/unix/Makefile.utl b/sys/unix/Makefile.utl index 770213255..1936257b0 100644 --- a/sys/unix/Makefile.utl +++ b/sys/unix/Makefile.utl @@ -200,7 +200,7 @@ HACKLIBOBJ = $(OBJDIR)/hacklib.o panic.o MAKEOBJS = makedefs.o $(OMONOBJ) $(ODATE) $(OALLOC) # object files for recovery utility -RECOVOBJS = recover.o +RECOVOBJS = recover.o recover-version.o # object files for the data librarian DLBOBJS = dlb_main.o $(OBJDIR)/dlb.o $(OALLOC) @@ -284,6 +284,11 @@ recover: $(RECOVOBJS) $(HACKLIB) recover.o: recover.c $(CONFIG_H) $(CC) $(CFLAGS) $(CSTD) -c recover.c -o $@ +recover-version.o: ../src/version.c $(HACK_H) + $(CC) $(CFLAGS) $(CSTD) -DMINIMAL_FOR_RECOVER -c ../src/version.c -o $@ + +recover-sfstruct.o: ../src/sfstruct.c $(HACK_H) + $(CC) $(CFLAGS) $(CSTD) -DMINIMAL_FOR_RECOVER -c ../src/sfstruct.c -o $@ # dependencies for dlb # diff --git a/util/recover.c b/util/recover.c index 8c701c799..85aceb4ce 100644 --- a/util/recover.c +++ b/util/recover.c @@ -34,7 +34,9 @@ int restore_savefile(char *); void set_levelfile_name(int); int open_levelfile(int); int create_savefile(void); -static void store_formatindicator(int); + +extern int get_critical_size_count(void); +extern uchar cscbuf[]; #ifndef WIN_CE #define Fprintf (void) fprintf @@ -201,17 +203,15 @@ int restore_savefile(char *basename) { int gfd, lfd, sfd; - int res = 0, lev, savelev, hpid, pltmpsiz, filecmc; + int res = 0, lev, savelev, hpid, pltmpsiz; xint8 levc; struct version_info version_data; - struct savefile_info sfi; - char plbuf[PL_NSIZ], indicator; + char plbuf[PL_NSIZ], indicator, cscsize; /* level 0 file contains: * pid of creating process (ignored here) * level number for current level of save file * name of save file nethack would have created - * savefile info * player name * and game state */ @@ -252,11 +252,12 @@ restore_savefile(char *basename) != sizeof savename) || (read(gfd, (genericptr_t) &indicator, sizeof indicator) != sizeof indicator) - || (read(gfd, (genericptr_t) &filecmc, sizeof filecmc) - != sizeof filecmc) + || (read(gfd, (genericptr_t) &cscsize, sizeof cscsize) + != sizeof cscsize) + || (read(gfd, (genericptr_t) &cscbuf, cscsize) + != cscsize) || (read(gfd, (genericptr_t) &version_data, sizeof version_data) != sizeof version_data) - || (read(gfd, (genericptr_t) &sfi, sizeof sfi) != sizeof sfi) || (read(gfd, (genericptr_t) &pltmpsiz, sizeof pltmpsiz) != sizeof pltmpsiz) || (pltmpsiz > PL_NSIZ) || (read(gfd, (genericptr_t) plbuf, pltmpsiz) != pltmpsiz)) { @@ -289,20 +290,35 @@ restore_savefile(char *basename) return -1; } - store_formatindicator(sfd); - if (write(sfd, (genericptr_t) &version_data, sizeof version_data) - != sizeof version_data) { - Fprintf(stderr, "Error writing %s; recovery failed.\n", savename); + if (write(sfd, (genericptr_t) &indicator, sizeof indicator) + != sizeof indicator) { + Fprintf(stderr, "Error writing %s %s; recovery failed.\n", + savename, "indicator"); Close(gfd); Close(sfd); Close(lfd); return -1; } - - if (write(sfd, (genericptr_t) &sfi, sizeof sfi) != sizeof sfi) { - Fprintf(stderr, - "Error writing %s; recovery failed (savefile_info).\n", - savename); + if (write(sfd, (genericptr_t) &cscsize, sizeof cscsize) != sizeof cscsize) { + Fprintf(stderr, "Error writing %s %s; recovery failed.\n", + savename, "cscsize"); + Close(gfd); + Close(sfd); + Close(lfd); + return -1; + } + if (write(sfd, (genericptr_t) &cscbuf, cscsize) != cscsize) { + Fprintf(stderr, "Error writing %s %s; recovery failed.\n", + savename, "critical bytes"); + Close(gfd); + Close(sfd); + Close(lfd); + return -1; + } + if (write(sfd, (genericptr_t) &version_data, sizeof version_data) + != sizeof version_data) { + Fprintf(stderr, "Error writing %s %s; recovery failed.\n", + savename, "version_data"); Close(gfd); Close(sfd); Close(lfd); @@ -399,18 +415,6 @@ restore_savefile(char *basename) return res; } -static void -store_formatindicator(int fd) -{ - char indicate = 'h'; /* historical */ - int cmc = 0; - - (void) write(fd, (genericptr_t) &indicate, sizeof indicate); - (void) write(fd, (genericptr_t) &cmc, sizeof cmc); -} - - - #ifdef EXEPATH #ifdef __DJGPP__ #define PATH_SEPARATOR '/'