recover (trunk only)
Bring recover process up to date with current save file contents (self_recover and external recover)
This commit is contained in:
+47
-2
@@ -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
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user