recover utility updates
This commit is contained in:
@@ -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*/
|
||||||
|
|||||||
@@ -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
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -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 '/'
|
||||||
|
|||||||
Reference in New Issue
Block a user