From 67604538c676d0bbe9adbf071a251e56d8432109 Mon Sep 17 00:00:00 2001 From: "nethack.allison" Date: Sun, 24 Mar 2002 01:37:16 +0000 Subject: [PATCH] #R668: Windows 2000 Lock File Creation Error This was a tricky one. While the error was ultimately because he was specifying a non-existant directory in defaults.nh, the error message lead me to the wrong area until I traced through with a debugger. It turns out that an fqn buffer was being re-used before it was finished being used with the original information in sys/share/pcunix.c, so the error message listed the wrong file! This adds one more buffer and fixes the problem. Note that it could only affect plaforms with PREFIXES_IN_USE defined (NOCWD_ASSUMPTIONS or VAR_PLAYGROUND) It also alters the WIN32 error message to give them a hint as to what the problem might be. Sent: Saturday, March 23, 2002 9:27 AM Subject: #R668: Windows 2000 Lock File Creation Error > nhfrom: 3.4.0 Official binary release for Windows 95/98/NT/2000/Me/XP > I get an error after unzipping nethack to c:\nethack, and changing the > configuration (defaults.nh) to reflect this in the hackdir, levels and save > configuration items. > > The error I get is "cannot creat lock file (C:\nethack\NHPERM_lock.)" after > entering nethack at the command line and answering the Who are you? question. --- src/files.c | 6 +++--- sys/share/pcunix.c | 11 +++++++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/files.c b/src/files.c index 00d539b3f..20b80ef6e 100644 --- a/src/files.c +++ b/src/files.c @@ -34,7 +34,7 @@ extern int errno; #endif #ifdef PREFIXES_IN_USE -#define FQN_NUMBUF 2 +#define FQN_NUMBUF 3 static char fqn_filename_buffer[FQN_NUMBUF][FQN_MAX_FILENAME]; #endif @@ -909,7 +909,7 @@ int retryct; lockname = make_lockname(filename, locknambuf); filename = fqname(filename, whichprefix, 0); #ifndef NO_FILE_LINKS /* LOCKDIR should be subsumed by LOCKPREFIX */ - lockname = fqname(lockname, LOCKPREFIX, 1); + lockname = fqname(lockname, LOCKPREFIX, 2); #endif #if defined(UNIX) || defined(VMS) @@ -1013,7 +1013,7 @@ const char *filename; if (nesting == 1) { lockname = make_lockname(filename, locknambuf); #ifndef NO_FILE_LINKS /* LOCKDIR should be subsumed by LOCKPREFIX */ - lockname = fqname(lockname, LOCKPREFIX, 1); + lockname = fqname(lockname, LOCKPREFIX, 2); #endif #if defined(UNIX) || defined(VMS) diff --git a/sys/share/pcunix.c b/sys/share/pcunix.c index 2ec56227a..ee112821d 100644 --- a/sys/share/pcunix.c +++ b/sys/share/pcunix.c @@ -96,7 +96,7 @@ eraseoldlocks() void getlock() { - register int fd, c, ci, ct; + register int fd, c, ci, ct, ern; char tbuf[BUFSZ]; const char *fq_lock; # if defined(MSDOS) && defined(NO_TERMS) @@ -180,10 +180,17 @@ getlock() gotlock: fd = creat(fq_lock, FCMASK); + if (fd == -1) ern = errno; unlock_file(HLOCK); if(fd == -1) { chdirx(orgdir, 0); - error("cannot creat lock file (%s.)", fq_lock); +#if defined(WIN32) + error("cannot creat file (%s.)\n%s\n%s\"%s\" exists?\n", + fq_lock, strerror(ern), "Are you sure that the directory", + fqn_prefix[LEVELPREFIX]); +#else + error("cannot creat file (%s.)", fq_lock); +#endif } else { if(write(fd, (char *) &hackpid, sizeof(hackpid)) != sizeof(hackpid)){