| 207 | } |
| 208 | |
| 209 | int |
| 210 | restore_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) |
no test coverage detected