From a67d2d4364280ffa21f8054afde91af027f4214b Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Sat, 10 Mar 2007 17:32:44 +0000 Subject: Fix handling of O_EXCL to behave just like Unix, not abused to lock files. Add a new constant which specifies that files are to be locked open. (refs #3, merges [1288]) --- lib/win32/emu.cpp | 18 ++++++++++++------ lib/win32/emu.h | 3 +++ 2 files changed, 15 insertions(+), 6 deletions(-) (limited to 'lib') diff --git a/lib/win32/emu.cpp b/lib/win32/emu.cpp index b201a9e0..3de83517 100644 --- a/lib/win32/emu.cpp +++ b/lib/win32/emu.cpp @@ -541,30 +541,37 @@ HANDLE openfile(const char *pFileName, int flags, int mode) // flags could be O_WRONLY | O_CREAT | O_RDONLY DWORD createDisposition = OPEN_EXISTING; - DWORD shareMode = FILE_SHARE_READ; - DWORD accessRights = FILE_READ_ATTRIBUTES | FILE_LIST_DIRECTORY | FILE_READ_EA; + DWORD shareMode = FILE_SHARE_READ | FILE_SHARE_WRITE + | FILE_SHARE_DELETE; + DWORD accessRights = FILE_READ_ATTRIBUTES | FILE_LIST_DIRECTORY + | FILE_READ_EA; if (flags & O_WRONLY) { accessRights = FILE_WRITE_DATA; - shareMode = FILE_SHARE_WRITE; } else if (flags & O_RDWR) { accessRights |= FILE_WRITE_ATTRIBUTES | FILE_WRITE_DATA | FILE_WRITE_EA; - shareMode |= FILE_SHARE_WRITE; } if (flags & O_CREAT) { createDisposition = OPEN_ALWAYS; } + if (flags & O_TRUNC) { createDisposition = CREATE_ALWAYS; } - if (flags & O_EXCL) + + if ((flags & O_CREAT) && (flags & O_EXCL)) + { + createDisposition = CREATE_NEW; + } + + if (flags & O_LOCK) { shareMode = 0; } @@ -573,7 +580,6 @@ HANDLE openfile(const char *pFileName, int flags, int mode) if (flags & O_TEMPORARY) { winFlags |= FILE_FLAG_DELETE_ON_CLOSE; - shareMode |= FILE_SHARE_DELETE; } HANDLE hdir = CreateFileW(pBuffer, diff --git a/lib/win32/emu.h b/lib/win32/emu.h index 5b3e2280..0612e441 100644 --- a/lib/win32/emu.h +++ b/lib/win32/emu.h @@ -290,6 +290,9 @@ DIR *opendir(const char *name); struct dirent *readdir(DIR *dp); int closedir(DIR *dp); +// local constant to open file exclusively without shared access +#define O_LOCK 0x10000 + HANDLE openfile(const char *filename, int flags, int mode); #define LOG_INFO 6 -- cgit v1.2.3