From fcf38a5e3526a023e5ee7c5b3333646bab26b09f Mon Sep 17 00:00:00 2001 From: "nethack.allison" Date: Fri, 4 Aug 2006 03:58:46 +0000 Subject: [PATCH] recover (trunk only) Bring recover process up to date with current save file contents (self_recover and external recover) --- src/files.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- util/recover.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 91 insertions(+), 4 deletions(-) diff --git a/src/files.c b/src/files.c index 98371420f..279e3e888 100644 --- a/src/files.c +++ b/src/files.c @@ -2527,11 +2527,13 @@ boolean recover_savefile() { int gfd, lfd, sfd; - int lev, savelev, hpid; + int lev, savelev, hpid, pltmpsiz; xchar levc; struct version_info version_data; int processed[256]; char savename[SAVESIZE], errbuf[BUFSZ]; + struct savefile_info sfi; + char tmpplbuf[PL_NSIZ]; for (lev = 0; lev < 256; lev++) processed[lev] = 0; @@ -2540,6 +2542,8 @@ recover_savefile() * 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 */ gfd = open_levelfile(0, errbuf); @@ -2563,7 +2567,13 @@ recover_savefile() if ((read(gfd, (genericptr_t) savename, sizeof savename) != sizeof savename) || (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) + != sizeof pltmpsiz) || (pltmpsiz > PL_NSIZ) || + (read(gfd, (genericptr_t) &tmpplbuf, pltmpsiz) + != pltmpsiz)) { raw_printf("\nError reading %s -- can't recover.\n", lock); (void)close(gfd); return FALSE; @@ -2571,6 +2581,8 @@ recover_savefile() /* save file should contain: * version info + * savefile info + * player name * current level (including pets) * (non-level-based) game state * other levels @@ -2601,6 +2613,39 @@ recover_savefile() return FALSE; } + if (write(sfd, (genericptr_t) &sfi, sizeof sfi) + != sizeof sfi) { + raw_printf( + "\nError writing %s; recovery failed (savefile_info).\n", + SAVEF); + (void)close(gfd); + (void)close(sfd); + delete_savefile(); + return FALSE; + } + + if (write(sfd, (genericptr_t) &pltmpsiz, sizeof pltmpsiz) + != sizeof pltmpsiz) { + raw_printf( + "Error writing %s; recovery failed (player name size).\n", + SAVEF); + (void)close(gfd); + (void)close(sfd); + delete_savefile(); + return FALSE; + } + + if (write(sfd, (genericptr_t) &tmpplbuf, pltmpsiz) + != pltmpsiz) { + raw_printf( + "Error writing %s; recovery failed (player name).\n", + SAVEF); + (void)close(gfd); + (void)close(sfd); + delete_savefile(); + return FALSE; + } + if (!copy_bytes(lfd, sfd)) { (void) close(lfd); (void) close(sfd); diff --git a/util/recover.c b/util/recover.c index a5f2fe2b6..356dcd036 100644 --- a/util/recover.c +++ b/util/recover.c @@ -208,14 +208,18 @@ restore_savefile(basename) char *basename; { int gfd, lfd, sfd; - int lev, savelev, hpid; + int lev, savelev, hpid, pltmpsiz; xchar levc; struct version_info version_data; + struct savefile_info sfi; + char plbuf[PL_NSIZ]; /* 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 */ (void) strcpy(lock, basename); @@ -252,7 +256,13 @@ char *basename; if ((read(gfd, (genericptr_t) savename, sizeof savename) != sizeof savename) || (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) + != sizeof pltmpsiz) || (pltmpsiz > PL_NSIZ) || + (read(gfd, (genericptr_t) &plbuf, pltmpsiz) + != pltmpsiz)) { Fprintf(stderr, "Error reading %s -- can't recover.\n", lock); Close(gfd); return(-1); @@ -260,6 +270,8 @@ char *basename; /* save file should contain: * version info + * savefile info + * player name * current level (including pets) * (non-level-based) game state * other levels @@ -287,6 +299,36 @@ char *basename; return(-1); } + if (write(sfd, (genericptr_t) &sfi, sizeof sfi) + != sizeof sfi) { + Fprintf(stderr, + "Error writing %s; recovery failed (savefile_info).\n", + savename); + Close(gfd); + Close(sfd); + return(-1); + } + + if (write(sfd, (genericptr_t) &pltmpsiz, sizeof pltmpsiz) + != sizeof pltmpsiz) { + Fprintf(stderr, + "Error writing %s; recovery failed (player name size).\n", + savename); + Close(gfd); + Close(sfd); + return(-1); + } + + if (write(sfd, (genericptr_t) &plbuf, pltmpsiz) + != pltmpsiz) { + Fprintf(stderr, + "Error writing %s; recovery failed (player name).\n", + savename); + Close(gfd); + Close(sfd); + return(-1); + } + copy_bytes(lfd, sfd); Close(lfd); (void) unlink(lock); -- 2.40.0