File sharing fixes.
diff --git a/files/file.c b/files/file.c
index 88b7ae6..f68e67c 100644
--- a/files/file.c
+++ b/files/file.c
@@ -603,8 +603,13 @@
/***********************************************************************
* FILE_Open
+ *
+ * path[I] name of file to open
+ * mode[I] mode how to open, in unix notation
+ * shareMode[I] the sharing mode in the win OpenFile notation
+ *
*/
-HFILE32 FILE_Open( LPCSTR path, INT32 mode )
+HFILE32 FILE_Open( LPCSTR path, INT32 mode, INT32 shareMode )
{
DOS_FULL_NAME full_name;
const char *unixName;
@@ -640,7 +645,7 @@
unixName = full_name.long_name;
}
- dosMode = FILE_UnixToDosMode(mode);
+ dosMode = FILE_UnixToDosMode(mode)| shareMode;
fileInUse = FILE_InUse(full_name.long_name,&oldMode);
if(fileInUse)
{
@@ -1409,9 +1414,7 @@
TRACE(file, "('%s',%04x)\n", path, mode );
unixMode= FILE_DOSToUnixMode(mode);
- unixMode |= (mode &0x70); /* transfer the OF_SHARE options to handle
- them in FILE_Open*/
- return FILE_Open( path, unixMode );
+ return FILE_Open( path, unixMode , (mode & 0x70));
}
diff --git a/include/file.h b/include/file.h
index b8fdff4..e7ab5a8 100644
--- a/include/file.h
+++ b/include/file.h
@@ -67,7 +67,7 @@
extern BOOL32 FILE_Stat( LPCSTR unixName, BY_HANDLE_FILE_INFORMATION *info );
extern HFILE32 FILE_Dup( HFILE32 hFile );
extern HFILE32 FILE_Dup2( HFILE32 hFile1, HFILE32 hFile2 );
-extern HFILE32 FILE_Open( LPCSTR path, INT32 mode );
+extern HFILE32 FILE_Open( LPCSTR path, INT32 mode ,INT32 sharemode);
extern HFILE32 FILE_OpenUnixFile( LPCSTR path, INT32 mode );
extern BOOL32 FILE_SetFileType( HFILE32 hFile, DWORD type );
extern LPVOID FILE_mmap( HFILE32 hFile, LPVOID start,
diff --git a/misc/crtdll.c b/misc/crtdll.c
index 62eda7d..d174e71 100644
--- a/misc/crtdll.c
+++ b/misc/crtdll.c
@@ -295,7 +295,7 @@
else if (strchr(mode,'b'))
TRACE(crtdll, "%s in BINARY mode\n",path);
- dos_fildes=FILE_Open(path, flagmode);
+ dos_fildes=FILE_Open(path, flagmode,0);
unix_fildes=FILE_GetUnixHandle(dos_fildes);
file = fdopen(unix_fildes,mode);
@@ -1199,7 +1199,7 @@
TRACE(crtdll,"CRTDLL_open file unsupported flags 0x%04x\n",flags);
/* End Fixme */
- ret = FILE_Open(path,wineflags);
+ ret = FILE_Open(path,wineflags,0);
TRACE(crtdll,"CRTDLL_open file %s mode 0x%04x (lccmode 0x%04x) got dfh %d\n",
path,wineflags,flags,ret);
return ret;
diff --git a/msdos/vxd.c b/msdos/vxd.c
index 04afafb..35eaeeb 100644
--- a/msdos/vxd.c
+++ b/msdos/vxd.c
@@ -607,7 +607,7 @@
IMAGE_NT_HEADERS *nt_header = PE_HEADER(module->baseAddr);
IMAGE_SECTION_HEADER *pe_seg = PE_SECTIONS(module->baseAddr);
- HFILE32 image = FILE_Open(module->pathName, O_RDONLY);
+ HFILE32 image = FILE_Open(module->pathName, O_RDONLY,0);
BOOL32 error = (image == INVALID_HANDLE_VALUE32);
UINT32 i;
diff --git a/win32/file.c b/win32/file.c
index e08475d..43f22b8 100644
--- a/win32/file.c
+++ b/win32/file.c
@@ -27,6 +27,7 @@
static int TranslateCreationFlags(DWORD create_flags);
static int TranslateAccessFlags(DWORD access_flags);
+static int TranslateShareFlags(DWORD share_flags);
/***********************************************************************
* WriteFile (KERNEL32.578)
@@ -129,13 +130,14 @@
LPSECURITY_ATTRIBUTES security, DWORD creation,
DWORD attributes, HANDLE32 template)
{
- int access_flags, create_flags;
+ int access_flags, create_flags, share_flags;
HFILE32 to_dup = HFILE_ERROR32; /* handle to dup */
/* Translate the various flags to Unix-style.
*/
access_flags = TranslateAccessFlags(access);
create_flags = TranslateCreationFlags(creation);
+ share_flags = TranslateShareFlags(sharing);
if(template)
FIXME(file, "template handles not supported.\n");
@@ -183,7 +185,7 @@
handle = HFILE_ERROR32;
return handle;
}
- return FILE_Open( filename, access_flags | create_flags );
+ return FILE_Open( filename, access_flags | create_flags,share_flags );
}
@@ -252,8 +254,29 @@
return rc;
}
-
-
+static int TranslateShareFlags(DWORD share_flags)
+/*
+OPEN_SHARE_DENYNONE FILE_SHARE_READ | FILE_SHARE_WRITE
+OPEN_SHARE_DENYREAD FILE_SHARE_WRITE
+OPEN_SHARE_DENYREADWRITE 0
+OPEN_SHARE_DENYWRITE FILE_SHARE_READ
+*/
+{
+ switch(share_flags)
+ {
+ case FILE_SHARE_READ | FILE_SHARE_WRITE:
+ return OF_SHARE_DENY_NONE;
+ case FILE_SHARE_WRITE:
+ return OF_SHARE_DENY_READ;
+ case FILE_SHARE_READ:
+ return OF_SHARE_DENY_WRITE;
+ case 0:
+ return OF_SHARE_EXCLUSIVE;
+ default:
+ }
+ FIXME(file,"unknown sharing flags 0x%04lx\n",share_flags);
+ return OF_SHARE_EXCLUSIVE;
+}
/**************************************************************************
* SetFileAttributes16 (KERNEL.421)
*/