diff --git a/doc/fixes34.2 b/doc/fixes34.2 index 45211cb00..1ce180a99 100644 --- a/doc/fixes34.2 +++ b/doc/fixes34.2 @@ -98,6 +98,10 @@ vms: create an empty paniclog file during playground installation win32tty: add subkeyvalue option to alter key values; Finnish keyboard fix win32tty: distinguish between black/gray/white (by Quietust) win32gui: prevent male Valkyrie and other incorrect startup settings +win32: some code in files.c was incorrectly assuming that a file + descriptor return value of 0 from open() was invalid but it + could be valid on win32gui where stdin, stdout, stderr aren't open; + now it correctly checks for return value < 0 from open() tiles: high priest tile had a couple bad pixels tiles: bad pixels in Croesus and Yeenoghu tiles FreeBSD: incorrect srandom declaration diff --git a/src/files.c b/src/files.c index 498af1349..fddd9bcd4 100644 --- a/src/files.c +++ b/src/files.c @@ -91,6 +91,7 @@ char SAVEP[SAVESIZE]; /* holds path of directory for save file */ #ifdef HOLD_LOCKFILE_OPEN struct level_ftrack { +int init; int fd; /* file descriptor for level file */ int oflag; /* open flags */ boolean nethack_thinks_it_is_open; /* Does NetHack think it's open? */ @@ -535,7 +536,11 @@ const char *name; int lev, oflag; { int reslt, fd; - if (lftrack.fd) { + if (!lftrack.init) { + lftrack.init = 1; + lftrack.fd = -1; + } + if (lftrack.fd >= 0) { /* check for compatible access */ if (lftrack.oflag == oflag) { fd = lftrack.fd; @@ -554,7 +559,7 @@ int lev, oflag; fd = sopen(name, oflag,SH_DENYRW, FCMASK); lftrack.fd = fd; lftrack.oflag = oflag; - if (fd) + if (fd >= 0) lftrack.nethack_thinks_it_is_open = TRUE; } return fd; @@ -565,12 +570,13 @@ really_close() { int fd = lftrack.fd; lftrack.nethack_thinks_it_is_open = FALSE; - lftrack.fd = 0; + lftrack.fd = -1; lftrack.oflag = 0; (void)_close(fd); return; } +int close(fd) int fd; { @@ -1349,15 +1355,20 @@ int retryct; #endif /* UNIX || VMS */ #if defined(AMIGA) || defined(WIN32) || defined(MSDOS) +# ifdef AMIGA +#define OPENFAILURE(fd) (!fd) +# else +#define OPENFAILURE(fd) (fd < 0) +# endif lockptr = 0; - while (retryct-- && !lockptr) { + while (retryct-- && OPENFAILURE(lockptr)) { # ifdef AMIGA (void)DeleteFile(lockname); /* in case dead process was here first */ lockptr = Open(lockname,MODE_NEWFILE); # else lockptr = open(lockname, O_RDWR|O_CREAT|O_EXCL, S_IWRITE); # endif - if (!lockptr) { + if (OPENFAILURE(lockptr)) { raw_printf("Waiting for access to %s. (%d retries left).", filename, retryct); Delay(50);