recover (trunk only)

Bring recover process up to date with current save file contents
(self_recover and external recover)
This commit is contained in:
nethack.allison
2006-08-04 03:58:46 +00:00
parent 2cca9c3114
commit fcf38a5e35
2 changed files with 91 additions and 4 deletions
+47 -2
View File
@@ -2527,11 +2527,13 @@ boolean
recover_savefile() recover_savefile()
{ {
int gfd, lfd, sfd; int gfd, lfd, sfd;
int lev, savelev, hpid; int lev, savelev, hpid, pltmpsiz;
xchar levc; xchar levc;
struct version_info version_data; struct version_info version_data;
int processed[256]; int processed[256];
char savename[SAVESIZE], errbuf[BUFSZ]; char savename[SAVESIZE], errbuf[BUFSZ];
struct savefile_info sfi;
char tmpplbuf[PL_NSIZ];
for (lev = 0; lev < 256; lev++) for (lev = 0; lev < 256; lev++)
processed[lev] = 0; processed[lev] = 0;
@@ -2540,6 +2542,8 @@ recover_savefile()
* 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
* and game state * and game state
*/ */
gfd = open_levelfile(0, errbuf); gfd = open_levelfile(0, errbuf);
@@ -2563,7 +2567,13 @@ recover_savefile()
if ((read(gfd, (genericptr_t) savename, sizeof savename) if ((read(gfd, (genericptr_t) savename, sizeof savename)
!= sizeof savename) || != sizeof savename) ||
(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)
!= sizeof pltmpsiz) || (pltmpsiz > PL_NSIZ) ||
(read(gfd, (genericptr_t) &tmpplbuf, pltmpsiz)
!= pltmpsiz)) {
raw_printf("\nError reading %s -- can't recover.\n", lock); raw_printf("\nError reading %s -- can't recover.\n", lock);
(void)close(gfd); (void)close(gfd);
return FALSE; return FALSE;
@@ -2571,6 +2581,8 @@ recover_savefile()
/* save file should contain: /* save file should contain:
* version info * version info
* savefile info
* player name
* current level (including pets) * current level (including pets)
* (non-level-based) game state * (non-level-based) game state
* other levels * other levels
@@ -2601,6 +2613,39 @@ recover_savefile()
return FALSE; 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)) { if (!copy_bytes(lfd, sfd)) {
(void) close(lfd); (void) close(lfd);
(void) close(sfd); (void) close(sfd);
+44 -2
View File
@@ -208,14 +208,18 @@ restore_savefile(basename)
char *basename; char *basename;
{ {
int gfd, lfd, sfd; int gfd, lfd, sfd;
int lev, savelev, hpid; int lev, savelev, hpid, pltmpsiz;
xchar levc; xchar levc;
struct version_info version_data; struct version_info version_data;
struct savefile_info sfi;
char plbuf[PL_NSIZ];
/* 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
* and game state * and game state
*/ */
(void) strcpy(lock, basename); (void) strcpy(lock, basename);
@@ -252,7 +256,13 @@ char *basename;
if ((read(gfd, (genericptr_t) savename, sizeof savename) if ((read(gfd, (genericptr_t) savename, sizeof savename)
!= sizeof savename) || != sizeof savename) ||
(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)
!= sizeof pltmpsiz) || (pltmpsiz > PL_NSIZ) ||
(read(gfd, (genericptr_t) &plbuf, pltmpsiz)
!= pltmpsiz)) {
Fprintf(stderr, "Error reading %s -- can't recover.\n", lock); Fprintf(stderr, "Error reading %s -- can't recover.\n", lock);
Close(gfd); Close(gfd);
return(-1); return(-1);
@@ -260,6 +270,8 @@ char *basename;
/* save file should contain: /* save file should contain:
* version info * version info
* savefile info
* player name
* current level (including pets) * current level (including pets)
* (non-level-based) game state * (non-level-based) game state
* other levels * other levels
@@ -287,6 +299,36 @@ char *basename;
return(-1); 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); copy_bytes(lfd, sfd);
Close(lfd); Close(lfd);
(void) unlink(lock); (void) unlink(lock);