summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/win32/emu.cpp18
-rw-r--r--lib/win32/emu.h3
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