]> granicus.if.org Git - nethack/commitdiff
recover (trunk only)
authornethack.allison <nethack.allison>
Fri, 4 Aug 2006 03:58:46 +0000 (03:58 +0000)
committernethack.allison <nethack.allison>
Fri, 4 Aug 2006 03:58:46 +0000 (03:58 +0000)
Bring recover process up to date with current save file contents
(self_recover and external recover)

src/files.c
util/recover.c

index 98371420f869bd8c2d507770f9c829885ee536d0..279e3e888c712c03f9968cf99ad13d484daa9b73 100644 (file)
@@ -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);
index a5f2fe2b606edf03e6386eabfa47adb83054eb4b..356dcd0364dedf4d6ff903866e92c37dbddf28e5 100644 (file)
@@ -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);