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

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