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;
* 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);
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;
/* save file should contain:
* version info
+ * savefile info
+ * player name
* current level (including pets)
* (non-level-based) game state
* other levels
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);
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);
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);
/* save file should contain:
* version info
+ * savefile info
+ * player name
* current level (including pets)
* (non-level-based) game state
* other levels
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);