MCPcopy Create free account
hub / github.com/NetHack/NetHack / restore_savefile

Function restore_savefile

util/recover.c:209–425  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

207}
208
209int
210restore_savefile(char *basename)
211{
212 int gfd, lfd, sfd;
213 int res = 0, lev, savelev, hpid, pltmpsiz;
214 xint8 levc;
215 struct version_info version_data;
216 char plbuf[PL_NSIZ_PLUS], indicator, cscsize;
217
218 /* level 0 file contains:
219 * pid of creating process (ignored here)
220 * level number for current level of save file
221 * name of save file nethack would have created
222 * player name
223 * and game state
224 */
225 (void) strcpy(lock, basename);
226 gfd = open_levelfile(0);
227 if (gfd < 0) {
228#if defined(WIN32) && !defined(WIN_CE)
229 if (errno == EACCES) {
230 Fprintf(
231 stderr,
232 "\nThere are files from a game in progress under your name.");
233 Fprintf(stderr, "\nThe files are locked or inaccessible.");
234 Fprintf(stderr, "\nPerhaps the other game is still running?\n");
235 } else
236 Fprintf(stderr, "\nTrouble accessing level 0 (errno = %d).\n",
237 errno);
238#endif
239 Fprintf(stderr, "Cannot open level 0 for %s.\n", basename);
240 return -1;
241 }
242 if (read(gfd, (genericptr_t) &hpid, sizeof hpid) != sizeof hpid) {
243 Fprintf(
244 stderr, "%s\n%s%s%s\n",
245 "Checkpoint data incompletely written or subsequently clobbered;",
246 "recovery for \"", basename, "\" impossible.");
247 Close(gfd);
248 return -1;
249 }
250 if (read(gfd, (genericptr_t) &savelev, sizeof(savelev))
251 != sizeof(savelev)) {
252 Fprintf(stderr, "Checkpointing was not in effect for %s -- recovery "
253 "impossible.\n",
254 basename);
255 Close(gfd);
256 return -1;
257 }
258 if ((read(gfd, (genericptr_t) savename, sizeof savename)
259 != sizeof savename)
260 || (read(gfd, (genericptr_t) &indicator, sizeof indicator)
261 != sizeof indicator)
262 || (read(gfd, (genericptr_t) &cscsize, sizeof cscsize)
263 != sizeof cscsize)
264 || (read(gfd, (genericptr_t) &cscbuf, cscsize)
265 != cscsize)
266 || (read(gfd, (genericptr_t) &version_data, sizeof version_data)

Callers 1

mainFunction · 0.70

Calls 9

readFunction · 0.85
writeFunction · 0.85
unlinkFunction · 0.85
openFunction · 0.85
closeFunction · 0.85
open_levelfileFunction · 0.70
create_savefileFunction · 0.70
set_levelfile_nameFunction · 0.70
copy_bytesFunction · 0.50

Tested by

no test coverage detected