diff options
author | Chris Wilson <chris+github@qwirx.com> | 2007-03-10 17:32:44 +0000 |
---|---|---|
committer | Chris Wilson <chris+github@qwirx.com> | 2007-03-10 17:32:44 +0000 |
commit | a67d2d4364280ffa21f8054afde91af027f4214b (patch) | |
tree | 4daa65c3f11b3b6e2df250d6e437858886eaa2d5 | |
parent | a936147b531d87060e61dec21342d32d05d2f0a0 (diff) |
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])
-rw-r--r-- | lib/win32/emu.cpp | 18 | ||||
-rw-r--r-- | lib/win32/emu.h | 3 |
2 files changed, 15 insertions, 6 deletions
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 |