Fwd: [TRY 3] msvcrt: updated use of pmode flag in _s_open - set permissions of the file after it's been created.
Ivan Peevski
cyberhorse at gmail.com
Fri Oct 17 10:22:03 CDT 2008
Third time is a charm ... (hopefully)
ChangeLog:
Followed the documentation at
http://msdn.microsoft.com/en-us/library/w7sa2b22(VS.80).aspx. First,
ignore pmode if the file already exist. Then, apply pmode permissions
to the file, once it has been created.
---
dlls/msvcrt/file.c | 14 +++++++++-----
1 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index c78e46c..d998c05 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -1419,8 +1419,9 @@ int CDECL MSVCRT__pipe(int *pfds, unsigned int
psize, int textmode)
int CDECL MSVCRT__sopen( const char *path, int oflags, int shflags, ... )
{
va_list ap;
- int pmode;
+ int pmode = 0;
DWORD access = 0, creation = 0, attrib;
+ struct MSVCRT__stat buf;
DWORD sharing;
int wxflag = 0, fd;
HANDLE hand;
@@ -1444,10 +1445,9 @@ int CDECL MSVCRT__sopen( const char *path, int
oflags, int shflags, ... )
pmode = va_arg(ap, int);
va_end(ap);
- if(pmode & ~(MSVCRT__S_IREAD | MSVCRT__S_IWRITE))
- FIXME(": pmode 0x%04x ignored\n", pmode);
- else
- WARN(": pmode 0x%04x ignored\n", pmode);
+ /* Ignore _S_IREAD and _S_IWRITE if file exists. */
+ if (MSVCRT__stat(path, &buf) != 0)
+ pmode = pmode & (MSVCRT__S_IREAD | MSVCRT__S_IWRITE); /*relevant flags*/
if (oflags & MSVCRT__O_EXCL)
creation = CREATE_NEW;
@@ -1503,6 +1503,10 @@ int CDECL MSVCRT__sopen( const char *path, int
oflags, int shflags, ... )
return -1;
}
+ /* Apply file permissions as needed. */
+ if (pmode)
+ MSVCRT__chmod(path, pmode);
+
fd = msvcrt_alloc_fd(hand, wxflag);
TRACE(":fd (%d) handle (%p)\n",fd, hand);
--
1.5.4.3
More information about the wine-patches
mailing list