Pop up error when locking toerny file fails
authorH.G.Muller <hgm@hgm-xboard.(none)>
Tue, 18 Jun 2019 15:03:11 +0000 (17:03 +0200)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Tue, 18 Jun 2019 15:03:11 +0000 (17:03 +0200)
The WinBoard implementation of flock is made compatible with the Linux
version, returning 0 for success and -1 for fail. ReserveGame now tests
this, and makes us drop out of tournament mode with an error popup when
a failure occurs.

backend.c
winboard/winboard.c

index fe7ad95..77baf51 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -1522,7 +1522,10 @@ ReserveGame (int gameNr, char resChar)
     if(tf == NULL) { nextGame = appData.matchGames + 1; return; } // kludge to terminate match
     safeStrCpy(buf, lastMsg, MSG_SIZ);
     DisplayMessage(_("Pick new game"), "");
-    flock(fileno(tf), LOCK_EX); // lock the tourney file while we are messing with it
+    if(flock(fileno(tf), LOCK_EX)) { // lock the tourney file while we are messing with it
+       abortMatch = TRUE; appData.matchMode = FALSE; DisplayError("Access to tourney file denied", 0);
+       fclose(tf); return;
+    }
     ParseArgsFromFile(tf);
     p = q = appData.results;
     if(appData.debugMode) {
index 361f54f..ac5fc03 100644 (file)
@@ -2068,8 +2068,6 @@ static int TranslatePieceToFontPiece( int piece )
     case WhiteSilver:\r
         return PM_WSG;\r
     case WhiteLance:\r
-\r
-\r
         return PM_WL;\r
     case WhiteFalcon:\r
         return PM_WV;\r
@@ -10257,19 +10255,19 @@ SettingsPopUp(ChessProgramState *cps)
 \r
 int flock(int fid, int code)\r
 {\r
+    int res;\r
     HANDLE hFile = (HANDLE) _get_osfhandle(fid);\r
     OVERLAPPED ov;\r
     ov.hEvent = NULL;\r
     ov.Offset = 0;\r
     ov.OffsetHigh = 0;\r
     switch(code) {\r
-      case 1: LockFileEx(hFile, LOCKFILE_EXCLUSIVE_LOCK, 0, 1024, 0, &ov); break;   // LOCK_SH\r
-\r
-      case 2: LockFileEx(hFile, LOCKFILE_EXCLUSIVE_LOCK, 0, 1024, 0, &ov); break;   // LOCK_EX\r
-      case 3: UnlockFileEx(hFile, 0, 1024, 0, &ov); break; // LOCK_UN\r
+      case 1: res = LockFileEx(hFile, LOCKFILE_EXCLUSIVE_LOCK, 0, 1024, 0, &ov); break;   // LOCK_SH\r
+      case 2: res = LockFileEx(hFile, LOCKFILE_EXCLUSIVE_LOCK, 0, 1024, 0, &ov); break;   // LOCK_EX\r
+      case 3: res = UnlockFileEx(hFile, 0, 1024, 0, &ov); break; // LOCK_UN\r
       default: return -1;\r
     }\r
-    return 0;\r
+    return -!res;\r
 }\r
 \r
 char *\r