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