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

View 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);