fix bug in file_lock when locking whole file and appending

master
mark 19 years ago
parent 5d1c269b6d
commit 331bf6db66

@ -311,23 +311,29 @@ static int file_lock(lua_State *L,
FILE *f, const char *mode, long offset, long length) FILE *f, const char *mode, long offset, long length)
{ {
HANDLE h = file_handle(f); HANDLE h = file_handle(f);
DWORD flags;
ULARGE_INTEGER len = zero_len; ULARGE_INTEGER len = zero_len;
OVERLAPPED ov = zero_ov; OVERLAPPED ov = zero_ov;
DWORD flags = 0;
BOOL ret; BOOL ret;
if (length) len.LowPart = length; if (length) len.LowPart = length;
else len.LowPart = GetFileSize(h, &len.HighPart); else len.LowPart = len.HighPart = -1;
ov.Offset = offset; ov.Offset = offset;
switch (*mode) { switch (*mode) {
case 'w': flags = LOCKFILE_EXCLUSIVE_LOCK; /*FALLTHRU*/ case 'w':
case 'r': flags |= LOCKFILE_FAIL_IMMEDIATELY; break; flags = LOCKFILE_EXCLUSIVE_LOCK;
case 'u': flags = 0; break; /*FALLTHRU*/
default: return luaL_error(L, "invalid mode"); case 'r':
flags |= LOCKFILE_FAIL_IMMEDIATELY;
ret = LockFileEx(h, flags, 0, len.LowPart, len.HighPart, &ov);
break;
case 'u':
ret = UnlockFileEx(h, 0, len.LowPart, len.HighPart, &ov);
break;
default:
return luaL_error(L, "invalid mode");
} }
ret = flags ? LockFileEx(h, flags, 0, len.LowPart, len.HighPart, &ov) if (!ret) return push_error(L);
: UnlockFileEx(h, 0, len.LowPart, len.HighPart, &ov); /* return the file */
if (!ret)
return push_error(L);
lua_settop(L, 1); lua_settop(L, 1);
return 1; return 1;
} }

Loading…
Cancel
Save