diff -rupN --no-dereference glib-2.80.0/gio/tests/org.gtk.test.gschema.override.orig glib-2.80.0-new/gio/tests/org.gtk.test.gschema.override.orig --- glib-2.80.0/gio/tests/org.gtk.test.gschema.override.orig 2024-03-07 22:35:05.000000000 +0100 +++ glib-2.80.0-new/gio/tests/org.gtk.test.gschema.override.orig 1970-01-01 01:00:00.000000000 +0100 @@ -1,2 +0,0 @@ -[org.gtk.test.per-desktop:GNOME-Classic] -desktop = "GNOME Classic" diff -rupN --no-dereference glib-2.80.0/gio/tests/org.gtk.test.gschema.xml.orig glib-2.80.0-new/gio/tests/org.gtk.test.gschema.xml.orig --- glib-2.80.0/gio/tests/org.gtk.test.gschema.xml.orig 2024-03-07 22:35:05.000000000 +0100 +++ glib-2.80.0-new/gio/tests/org.gtk.test.gschema.xml.orig 1970-01-01 01:00:00.000000000 +0100 @@ -1,225 +0,0 @@ - - - - - "Hello, earthlings" - A greeting - - Greeting of the invading martians - - - - "So long" - - - - - - - - - - true - - - - - - true - - - 25 - - - -1234 - - - 1234 - - - -123456 - - - 123456 - - - -123456789 - - - 123456789 - - - 123.456 - - - "a string, it seems" - - - "/a/object/path" - - - - - - ("one",(2,3)) - - - [0,1,2,3,4,5] - - - - { - "AC": [0,0, 0,0,0,0,0,0], - "IV": [0,0, 0,0,0,0,0,0] - } - - - - - - - "Unnamed" - - - "BackSpace" - - - "12:00 AM" - - - - - - false - - - false - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - "" - - - [48, 49] - - - [] - - - 'foo' - - - ['mourning', 'laughing'] - - - 33 - - - - - - - 'bar' - - - - - - [] - - - - - - - - - [] - - - 'bar' - - - - - - 33 - - - - - - - 33 - - - - - - 0 - - - - - - - a paragraph. - - with some whitespace. - - because not everyone has a great editor. - - - - - lots of space is as one. - - 0 - - - - - - 0 - - - '' - - - - 42 - - 0 - - - - - - "GNOME" - - - - diff -rupN --no-dereference glib-2.80.0/glib/gstdio.c glib-2.80.0-new/glib/gstdio.c --- glib-2.80.0/glib/gstdio.c 2024-03-07 22:35:05.000000000 +0100 +++ glib-2.80.0-new/glib/gstdio.c 2024-03-23 15:49:26.580309338 +0100 @@ -1052,6 +1052,11 @@ g_open (const gchar *filename, 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_DELETE; wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); int retval; int save_errno; @@ -1062,12 +1067,114 @@ g_open (const gchar *filename, 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; + } + + 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); - g_free (wfilename); + 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; @@ -1115,6 +1222,8 @@ g_creat (const gchar *filename, 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; @@ -1125,12 +1234,41 @@ g_creat (const gchar *filename, 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); @@ -1572,34 +1710,102 @@ g_fopen (const gchar *filename, 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; - } - - _g_win32_fix_mode (wmode); - retval = _wfopen (wfilename, wmode); - save_errno = errno; - - g_free (wfilename); - g_free (wmode); - - errno = save_errno; + 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); + +out: return retval; #else return fopen (filename, mode);