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

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