317 lines
8.3 KiB
Diff
317 lines
8.3 KiB
Diff
|
diff -Naur glib-2.46.0-orig/glib/gstdio.c glib-2.46.0/glib/gstdio.c
|
||
|
--- glib-2.46.0-orig/glib/gstdio.c 2015-02-26 15:57:09.000000000 +0300
|
||
|
+++ glib-2.46.0/glib/gstdio.c 2015-09-22 09:08:58.032066100 +0300
|
||
|
@@ -192,6 +192,11 @@
|
||
|
int mode)
|
||
|
{
|
||
|
#ifdef G_OS_WIN32
|
||
|
+ HANDLE hFile;
|
||
|
+ DWORD dwDesiredAccess = 0;
|
||
|
+ DWORD dwFlagsAndAttributes = 0;
|
||
|
+ DWORD dwDisposition = OPEN_EXISTING;
|
||
|
+ DWORD dwSharedAccess = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
|
||
|
wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
|
||
|
int retval;
|
||
|
int save_errno;
|
||
|
@@ -202,12 +207,114 @@
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
- retval = _wopen (wfilename, flags, mode);
|
||
|
- save_errno = errno;
|
||
|
+ /* Set up the access modes and other attributes */
|
||
|
+ if ((flags & _O_CREAT) && (mode & _S_IREAD))
|
||
|
+ {
|
||
|
+ if (! (mode & _S_IWRITE))
|
||
|
+ dwFlagsAndAttributes = FILE_ATTRIBUTE_READONLY; /* Sets file to 'read only' after the file gets closed */
|
||
|
+ }
|
||
|
+ if ( !(flags & _O_ACCMODE))
|
||
|
+ {
|
||
|
+ /* Equates to _O_RDONLY */
|
||
|
+ if (flags & _O_TRUNC)
|
||
|
+ {
|
||
|
+ errno = EINVAL;
|
||
|
+ g_free (wfilename);
|
||
|
+ return -1;
|
||
|
+ }
|
||
|
|
||
|
- g_free (wfilename);
|
||
|
+ dwDesiredAccess |= GENERIC_READ;
|
||
|
+ dwSharedAccess |= FILE_SHARE_WRITE;
|
||
|
+ }
|
||
|
+ if (flags & _O_WRONLY)
|
||
|
+ {
|
||
|
+ if (flags & _O_RDWR)
|
||
|
+ {
|
||
|
+ errno = EINVAL;
|
||
|
+ g_free (wfilename);
|
||
|
+ return -1;
|
||
|
+ }
|
||
|
|
||
|
+ dwDesiredAccess |= GENERIC_WRITE;
|
||
|
+ }
|
||
|
+ if (flags & _O_RDWR)
|
||
|
+ {
|
||
|
+ dwDesiredAccess |= GENERIC_READ;
|
||
|
+ dwDesiredAccess |= GENERIC_WRITE;
|
||
|
+ }
|
||
|
+ if (flags & _O_TRUNC)
|
||
|
+ {
|
||
|
+ if (flags & _O_CREAT)
|
||
|
+ dwDisposition = CREATE_ALWAYS;
|
||
|
+ else
|
||
|
+ dwDisposition = TRUNCATE_EXISTING;
|
||
|
+ }
|
||
|
+ if ((flags & _O_CREAT) && !(flags & _O_TRUNC))
|
||
|
+ {
|
||
|
+ if (flags & _O_EXCL)
|
||
|
+ dwDisposition = CREATE_NEW;
|
||
|
+ else
|
||
|
+ dwDisposition = OPEN_ALWAYS;
|
||
|
+ }
|
||
|
+ if (flags & _O_CREAT)
|
||
|
+ {
|
||
|
+ /* Handle the other flags that can be attached to _O_CREAT */
|
||
|
+ if ((flags & _O_TEMPORARY) || (flags & _O_SHORT_LIVED))
|
||
|
+ dwFlagsAndAttributes |= FILE_ATTRIBUTE_TEMPORARY;
|
||
|
+
|
||
|
+ if (flags & _O_TEMPORARY)
|
||
|
+ dwFlagsAndAttributes |= FILE_FLAG_DELETE_ON_CLOSE;
|
||
|
+ }
|
||
|
+ if ((flags & _O_SEQUENTIAL) || (flags & _O_APPEND))
|
||
|
+ {
|
||
|
+ dwFlagsAndAttributes |= FILE_FLAG_SEQUENTIAL_SCAN;
|
||
|
+ }
|
||
|
+ else if (flags & _O_RANDOM)
|
||
|
+ {
|
||
|
+ dwFlagsAndAttributes |= FILE_FLAG_RANDOM_ACCESS;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (0 == dwFlagsAndAttributes)
|
||
|
+ dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL;
|
||
|
+ hFile = CreateFileW(wfilename, dwDesiredAccess, dwSharedAccess, NULL, dwDisposition, dwFlagsAndAttributes, NULL);
|
||
|
+
|
||
|
+ if (INVALID_HANDLE_VALUE == hFile)
|
||
|
+ {
|
||
|
+ retval = (-1);
|
||
|
+
|
||
|
+ switch (GetLastError ())
|
||
|
+ {
|
||
|
+#define CASE(a,b) case ERROR_##a: errno = b; break
|
||
|
+ CASE (FILE_NOT_FOUND, ENOENT);
|
||
|
+ CASE (PATH_NOT_FOUND, ENOENT);
|
||
|
+ CASE (ACCESS_DENIED, EACCES);
|
||
|
+ CASE (NOT_SAME_DEVICE, EXDEV);
|
||
|
+ CASE (LOCK_VIOLATION, EACCES);
|
||
|
+ CASE (SHARING_VIOLATION, EACCES);
|
||
|
+ CASE (FILE_EXISTS, EEXIST);
|
||
|
+ CASE (ALREADY_EXISTS, EEXIST);
|
||
|
+#undef CASE
|
||
|
+ default: errno = EIO;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ else
|
||
|
+ retval = _open_osfhandle((long)hFile, flags);
|
||
|
+
|
||
|
+ if ((-1) != retval)
|
||
|
+ {
|
||
|
+ /* We have a valid file handle. Set its translation mode to text or binary, as appropriate */
|
||
|
+ if ((!(flags & _O_TEXT)) && (_fmode == _O_BINARY))
|
||
|
+ _setmode(retval, _O_BINARY);
|
||
|
+ else if ((flags & _O_TEXT) || (_fmode == _O_TEXT))
|
||
|
+ _setmode(retval, _O_TEXT);
|
||
|
+ else
|
||
|
+ _setmode(retval, _O_BINARY);
|
||
|
+ }
|
||
|
+
|
||
|
+ save_errno = errno;
|
||
|
+ g_free (wfilename);
|
||
|
errno = save_errno;
|
||
|
+
|
||
|
return retval;
|
||
|
#else
|
||
|
int fd;
|
||
|
@@ -254,6 +361,8 @@
|
||
|
int mode)
|
||
|
{
|
||
|
#ifdef G_OS_WIN32
|
||
|
+ HANDLE hFile;
|
||
|
+ DWORD dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL;
|
||
|
wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
|
||
|
int retval;
|
||
|
int save_errno;
|
||
|
@@ -264,12 +373,41 @@
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
- retval = _wcreat (wfilename, mode);
|
||
|
- save_errno = errno;
|
||
|
+ if (mode & _S_IREAD)
|
||
|
+ {
|
||
|
+ if (! (mode & _S_IWRITE))
|
||
|
+ dwFlagsAndAttributes = FILE_ATTRIBUTE_READONLY; /* Sets file to 'read only' after the file gets closed */
|
||
|
+ }
|
||
|
+
|
||
|
+ hFile = CreateFileW(wfilename, (GENERIC_READ | GENERIC_WRITE), (FILE_SHARE_READ | FILE_SHARE_DELETE),
|
||
|
+ NULL, CREATE_ALWAYS, dwFlagsAndAttributes, NULL);
|
||
|
+
|
||
|
+ if (INVALID_HANDLE_VALUE == hFile)
|
||
|
+ {
|
||
|
+ retval = (-1);
|
||
|
+
|
||
|
+ switch (GetLastError ())
|
||
|
+ {
|
||
|
+#define CASE(a,b) case ERROR_##a: errno = b; break
|
||
|
+ CASE (FILE_NOT_FOUND, ENOENT);
|
||
|
+ CASE (PATH_NOT_FOUND, ENOENT);
|
||
|
+ CASE (ACCESS_DENIED, EACCES);
|
||
|
+ CASE (NOT_SAME_DEVICE, EXDEV);
|
||
|
+ CASE (LOCK_VIOLATION, EACCES);
|
||
|
+ CASE (SHARING_VIOLATION, EACCES);
|
||
|
+ CASE (FILE_EXISTS, EEXIST);
|
||
|
+ CASE (ALREADY_EXISTS, EEXIST);
|
||
|
+#undef CASE
|
||
|
+ default: errno = EIO;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ else
|
||
|
+ retval = _open_osfhandle((long)hFile, _O_RDWR);
|
||
|
|
||
|
+ save_errno = errno;
|
||
|
g_free (wfilename);
|
||
|
-
|
||
|
errno = save_errno;
|
||
|
+
|
||
|
return retval;
|
||
|
#else
|
||
|
return creat (filename, mode);
|
||
|
@@ -702,33 +840,102 @@
|
||
|
const gchar *mode)
|
||
|
{
|
||
|
#ifdef G_OS_WIN32
|
||
|
- wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
|
||
|
- wchar_t *wmode;
|
||
|
- FILE *retval;
|
||
|
- int save_errno;
|
||
|
-
|
||
|
- if (wfilename == NULL)
|
||
|
- {
|
||
|
- errno = EINVAL;
|
||
|
- return NULL;
|
||
|
- }
|
||
|
-
|
||
|
- wmode = g_utf8_to_utf16 (mode, -1, NULL, NULL, NULL);
|
||
|
-
|
||
|
- if (wmode == NULL)
|
||
|
- {
|
||
|
- g_free (wfilename);
|
||
|
- errno = EINVAL;
|
||
|
- return NULL;
|
||
|
- }
|
||
|
-
|
||
|
- retval = _wfopen (wfilename, wmode);
|
||
|
- save_errno = errno;
|
||
|
-
|
||
|
- g_free (wfilename);
|
||
|
- g_free (wmode);
|
||
|
+ int hFile;
|
||
|
+ int flags = 0;
|
||
|
+ gchar priv_mode[4];
|
||
|
+ FILE *retval = NULL;
|
||
|
+
|
||
|
+ if ((NULL == filename) || (NULL == mode))
|
||
|
+ {
|
||
|
+ errno = EINVAL;
|
||
|
+ goto out;
|
||
|
+ }
|
||
|
+ if ((strlen(mode) < 1) || (strlen(mode) > 3))
|
||
|
+ {
|
||
|
+ errno = EINVAL;
|
||
|
+ goto out;
|
||
|
+ }
|
||
|
+
|
||
|
+ strncpy(priv_mode, mode, 3);
|
||
|
+ priv_mode[3] = '\0';
|
||
|
+
|
||
|
+ /* Set up any flags to pass to 'g_open()' */
|
||
|
+ if (3 == strlen(priv_mode))
|
||
|
+ {
|
||
|
+ if (('c' == priv_mode[2]) || ('n' == priv_mode[2]))
|
||
|
+ priv_mode[2] = '\0';
|
||
|
+ else
|
||
|
+ {
|
||
|
+ if (0 == strcmp(priv_mode, "a+b"))
|
||
|
+ flags = _O_RDWR | _O_CREAT | _O_APPEND | _O_BINARY;
|
||
|
+ else if (0 == strcmp(priv_mode, "a+t"))
|
||
|
+ flags = _O_RDWR | _O_CREAT | _O_APPEND | _O_TEXT;
|
||
|
+ else if (0 == strcmp(priv_mode, "r+b"))
|
||
|
+ flags = _O_RDWR | _O_BINARY;
|
||
|
+ else if (0 == strcmp(priv_mode, "r+t"))
|
||
|
+ flags = _O_RDWR | _O_TEXT;
|
||
|
+ else if (0 == strcmp(priv_mode, "w+b"))
|
||
|
+ flags = _O_RDWR | _O_CREAT |_O_TRUNC | _O_BINARY;
|
||
|
+ else if (0 == strcmp(priv_mode, "w+t"))
|
||
|
+ flags = _O_RDWR | _O_CREAT |_O_TRUNC | _O_TEXT;
|
||
|
+ else
|
||
|
+ {
|
||
|
+ errno = EINVAL;
|
||
|
+ goto out;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ if (2 == strlen(priv_mode))
|
||
|
+ {
|
||
|
+ if (('c' == priv_mode[1]) || ('n' == priv_mode[1]))
|
||
|
+ priv_mode[1] = '\0';
|
||
|
+ else
|
||
|
+ {
|
||
|
+ if (0 == strcmp(priv_mode, "a+"))
|
||
|
+ flags = _O_RDWR | _O_CREAT | _O_APPEND;
|
||
|
+ else if (0 == strcmp(priv_mode, "ab"))
|
||
|
+ flags = _O_WRONLY | _O_CREAT | _O_APPEND | _O_BINARY;
|
||
|
+ else if (0 == strcmp(priv_mode, "at"))
|
||
|
+ flags = _O_WRONLY | _O_CREAT | _O_APPEND | _O_TEXT;
|
||
|
+ else if (0 == strcmp(priv_mode, "rb"))
|
||
|
+ flags = _O_RDONLY | _O_BINARY;
|
||
|
+ else if (0 == strcmp(priv_mode, "rt"))
|
||
|
+ flags = _O_RDONLY | _O_TEXT;
|
||
|
+ else if (0 == strcmp(priv_mode, "wb"))
|
||
|
+ flags = _O_WRONLY | _O_CREAT | _O_TRUNC | _O_BINARY;
|
||
|
+ else if (0 == strcmp(priv_mode, "wt"))
|
||
|
+ flags = _O_WRONLY | _O_CREAT | _O_TRUNC | _O_TEXT;
|
||
|
+ else
|
||
|
+ {
|
||
|
+ errno = EINVAL;
|
||
|
+ goto out;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ if (1 == strlen(priv_mode))
|
||
|
+ {
|
||
|
+ if (0 == strcmp(priv_mode, "a"))
|
||
|
+ flags = _O_WRONLY | _O_CREAT | _O_APPEND;
|
||
|
+ else if (0 == strcmp(priv_mode, "r"))
|
||
|
+ flags = _O_RDONLY;
|
||
|
+ else if (0 == strcmp(priv_mode, "w"))
|
||
|
+ flags = _O_WRONLY | _O_CREAT | _O_TRUNC;
|
||
|
+ else if ( !((0 == strcmp(priv_mode, "c")) || (0 == strcmp(priv_mode, "n"))))
|
||
|
+ {
|
||
|
+ errno = EINVAL;
|
||
|
+ goto out;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ hFile = g_open (filename, flags, (_S_IREAD | _S_IWRITE));
|
||
|
+
|
||
|
+ if (INVALID_HANDLE_VALUE == (HANDLE)hFile)
|
||
|
+ /* 'errno' will have already been set by 'g_open()' */
|
||
|
+ retval = NULL;
|
||
|
+ else
|
||
|
+ retval = _fdopen(hFile, mode);
|
||
|
|
||
|
- errno = save_errno;
|
||
|
+out:
|
||
|
return retval;
|
||
|
#else
|
||
|
return fopen (filename, mode);
|