recover utility updates

This commit is contained in:
nhmall
2025-04-15 18:02:44 -04:00
parent 502b60d210
commit 44af2a96a5
3 changed files with 45 additions and 30 deletions

View File

@@ -3,9 +3,12 @@
/*-Copyright (c) Michael Allison, 2018. */ /*-Copyright (c) Michael Allison, 2018. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
#include "hack.h" #include "hack.h"
#include "dlb.h" #include "dlb.h"
#ifndef MINIMAL_FOR_RECOVER
#ifndef OPTIONS_AT_RUNTIME #ifndef OPTIONS_AT_RUNTIME
#define OPTIONS_AT_RUNTIME #define OPTIONS_AT_RUNTIME
#endif #endif
@@ -513,6 +516,7 @@ dump_version_info(void)
release_runtime_info(); release_runtime_info();
return; return;
} }
#endif /* MINIMAL_FOR_RECOVER */
struct critical_sizes_with_names { struct critical_sizes_with_names {
uchar ucsize; uchar ucsize;
@@ -647,6 +651,7 @@ get_critical_size_count(void)
return SIZE(critical_sizes); return SIZE(critical_sizes);
} }
#ifndef MINIMAL_FOR_RECOVER
void void
store_critical_bytes(NHFILE *nhfp) store_critical_bytes(NHFILE *nhfp)
{ {
@@ -741,5 +746,6 @@ compare_critical_bytes(NHFILE *nhfp)
} }
return 0; /* everything matched */ return 0; /* everything matched */
} }
#endif /* MINIMAL_FOR_RECOVER */
/*version.c*/ /*version.c*/

View File

@@ -200,7 +200,7 @@ HACKLIBOBJ = $(OBJDIR)/hacklib.o panic.o
MAKEOBJS = makedefs.o $(OMONOBJ) $(ODATE) $(OALLOC) MAKEOBJS = makedefs.o $(OMONOBJ) $(ODATE) $(OALLOC)
# object files for recovery utility # object files for recovery utility
RECOVOBJS = recover.o RECOVOBJS = recover.o recover-version.o
# object files for the data librarian # object files for the data librarian
DLBOBJS = dlb_main.o $(OBJDIR)/dlb.o $(OALLOC) DLBOBJS = dlb_main.o $(OBJDIR)/dlb.o $(OALLOC)
@@ -284,6 +284,11 @@ recover: $(RECOVOBJS) $(HACKLIB)
recover.o: recover.c $(CONFIG_H) recover.o: recover.c $(CONFIG_H)
$(CC) $(CFLAGS) $(CSTD) -c recover.c -o $@ $(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 # dependencies for dlb
# #

View File

@@ -34,7 +34,9 @@ int restore_savefile(char *);
void set_levelfile_name(int); void set_levelfile_name(int);
int open_levelfile(int); int open_levelfile(int);
int create_savefile(void); int create_savefile(void);
static void store_formatindicator(int);
extern int get_critical_size_count(void);
extern uchar cscbuf[];
#ifndef WIN_CE #ifndef WIN_CE
#define Fprintf (void) fprintf #define Fprintf (void) fprintf
@@ -201,17 +203,15 @@ int
restore_savefile(char *basename) restore_savefile(char *basename)
{ {
int gfd, lfd, sfd; int gfd, lfd, sfd;
int res = 0, lev, savelev, hpid, pltmpsiz, filecmc; int res = 0, lev, savelev, hpid, pltmpsiz;
xint8 levc; xint8 levc;
struct version_info version_data; struct version_info version_data;
struct savefile_info sfi; char plbuf[PL_NSIZ], indicator, cscsize;
char plbuf[PL_NSIZ], indicator;
/* level 0 file contains: /* level 0 file contains:
* pid of creating process (ignored here) * pid of creating process (ignored here)
* level number for current level of save file * level number for current level of save file
* name of save file nethack would have created * name of save file nethack would have created
* savefile info
* player name * player name
* and game state * and game state
*/ */
@@ -252,11 +252,12 @@ restore_savefile(char *basename)
!= sizeof savename) != sizeof savename)
|| (read(gfd, (genericptr_t) &indicator, sizeof indicator) || (read(gfd, (genericptr_t) &indicator, sizeof indicator)
!= sizeof indicator) != sizeof indicator)
|| (read(gfd, (genericptr_t) &filecmc, sizeof filecmc) || (read(gfd, (genericptr_t) &cscsize, sizeof cscsize)
!= sizeof filecmc) != sizeof cscsize)
|| (read(gfd, (genericptr_t) &cscbuf, cscsize)
!= cscsize)
|| (read(gfd, (genericptr_t) &version_data, sizeof version_data) || (read(gfd, (genericptr_t) &version_data, sizeof version_data)
!= sizeof version_data) != sizeof version_data)
|| (read(gfd, (genericptr_t) &sfi, sizeof sfi) != sizeof sfi)
|| (read(gfd, (genericptr_t) &pltmpsiz, sizeof pltmpsiz) || (read(gfd, (genericptr_t) &pltmpsiz, sizeof pltmpsiz)
!= sizeof pltmpsiz) || (pltmpsiz > PL_NSIZ) != sizeof pltmpsiz) || (pltmpsiz > PL_NSIZ)
|| (read(gfd, (genericptr_t) plbuf, pltmpsiz) != pltmpsiz)) { || (read(gfd, (genericptr_t) plbuf, pltmpsiz) != pltmpsiz)) {
@@ -289,20 +290,35 @@ restore_savefile(char *basename)
return -1; return -1;
} }
store_formatindicator(sfd); if (write(sfd, (genericptr_t) &indicator, sizeof indicator)
if (write(sfd, (genericptr_t) &version_data, sizeof version_data) != sizeof indicator) {
!= sizeof version_data) { Fprintf(stderr, "Error writing %s %s; recovery failed.\n",
Fprintf(stderr, "Error writing %s; recovery failed.\n", savename); savename, "indicator");
Close(gfd); Close(gfd);
Close(sfd); Close(sfd);
Close(lfd); Close(lfd);
return -1; return -1;
} }
if (write(sfd, (genericptr_t) &cscsize, sizeof cscsize) != sizeof cscsize) {
if (write(sfd, (genericptr_t) &sfi, sizeof sfi) != sizeof sfi) { Fprintf(stderr, "Error writing %s %s; recovery failed.\n",
Fprintf(stderr, savename, "cscsize");
"Error writing %s; recovery failed (savefile_info).\n", Close(gfd);
savename); 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(gfd);
Close(sfd); Close(sfd);
Close(lfd); Close(lfd);
@@ -399,18 +415,6 @@ restore_savefile(char *basename)
return res; 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 EXEPATH
#ifdef __DJGPP__ #ifdef __DJGPP__
#define PATH_SEPARATOR '/' #define PATH_SEPARATOR '/'