fix for U486: Can't get Nethack 3.4.1 to work

>nhversion: 3.4.1
>
> nhfrom: 3.4.1 Official binary release for Windows 95/98/NT/2000/Me/XP
> (nh341win.zip)
> comments: Whenever I run NethackW.exe, the nethack window
> appears, and does not run anything.  When I close out of the
> program, I get this message:
> Waiting for access to C:\GAMES\NETHACK341\record.  (X  retries left).  > The X seems to  always be either 9 or 59.  I don't know how to fix this > > problem, any help would  be greatly appreciated

<Someone> writes:
>win32 open() returns -1 if failed - same as POSIX open().
> There is no STDIN in GUI applications so 0 is a valid return
> value from open().
> So it should read like that unless that breaks Amiga code:

Since I can't test the Amiga code, I added a macro
OPENFAILURE to keep the Amiga code the same as it
is now.  It should probably be reviewed by someone on
the Amiga team to verify if open() on the Amiga returns
0 or -1 on failure.  If the latter, the macro could be
removed completely.
This commit is contained in:
nethack.allison
2003-06-07 13:16:40 +00:00
parent a67ed775cb
commit ff8744798d
2 changed files with 20 additions and 5 deletions

View File

@@ -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

View File

@@ -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);