Blame SOURCES/0001-Use-CreateFile-on-Win32-to-make-sure-g_unlink-always.patch

e6143c
diff -rupN --no-dereference glib-2.66.7/gio/tests/org.gtk.test.gschema.override.orig glib-2.66.7-new/gio/tests/org.gtk.test.gschema.override.orig
e6143c
--- glib-2.66.7/gio/tests/org.gtk.test.gschema.override.orig	2021-02-11 13:24:55.208942400 +0100
e6143c
+++ glib-2.66.7-new/gio/tests/org.gtk.test.gschema.override.orig	1970-01-01 01:00:00.000000000 +0100
e6143c
@@ -1,2 +0,0 @@
e6143c
-[org.gtk.test.per-desktop:GNOME-Classic]
e6143c
-desktop = "GNOME Classic"
e6143c
diff -rupN --no-dereference glib-2.66.7/gio/tests/org.gtk.test.gschema.xml.orig glib-2.66.7-new/gio/tests/org.gtk.test.gschema.xml.orig
e6143c
--- glib-2.66.7/gio/tests/org.gtk.test.gschema.xml.orig	2021-02-11 13:24:55.208942400 +0100
e6143c
+++ glib-2.66.7-new/gio/tests/org.gtk.test.gschema.xml.orig	1970-01-01 01:00:00.000000000 +0100
e6143c
@@ -1,222 +0,0 @@
e6143c
-<schemalist>
e6143c
-
e6143c
-  <schema id="org.gtk.test" path="/tests/" gettext-domain="test">
e6143c
-    <key name="greeting" type="s">
e6143c
-      <default l10n="messages">"Hello, earthlings"</default>
e6143c
-      <summary>A greeting</summary>
e6143c
-      <description>
e6143c
-         Greeting of the invading martians
e6143c
-      </description>
e6143c
-    </key>
e6143c
-    <key name="farewell" type="s">
e6143c
-      <default l10n="messages">"So long"</default>
e6143c
-    </key>
e6143c
-
e6143c
-    <child name='basic-types' schema='org.gtk.test.basic-types'/>
e6143c
-    <child name='complex-types' schema='org.gtk.test.complex-types'/>
e6143c
-    <child name='localized' schema='org.gtk.test.localized'/>
e6143c
-  </schema>
e6143c
-
e6143c
-  <schema id="org.gtk.test.no-path">
e6143c
-    <key name="test-boolean" type="b">
e6143c
-      <default>true</default>
e6143c
-    </key>
e6143c
-  </schema>
e6143c
-
e6143c
-  <schema id="org.gtk.test.basic-types" path="/tests/basic-types/">
e6143c
-    <key name="test-boolean" type="b">
e6143c
-      <default>true</default>
e6143c
-    </key>
e6143c
-    <key name="test-byte" type="y">
e6143c
-      <default>25</default>
e6143c
-    </key>
e6143c
-    <key name="test-int16" type="n">
e6143c
-      <default>-1234</default>
e6143c
-    </key>
e6143c
-    <key name="test-uint16" type="q">
e6143c
-      <default>1234</default>
e6143c
-    </key>
e6143c
-    <key name="test-int32" type="i">
e6143c
-      <default>-123456</default>
e6143c
-    </key>
e6143c
-    <key name="test-uint32" type="u">
e6143c
-      <default>123456</default>
e6143c
-    </key>
e6143c
-    <key name="test-int64" type="x">
e6143c
-      <default>-123456789</default>
e6143c
-    </key>
e6143c
-    <key name="test-uint64" type="t">
e6143c
-      <default>123456789</default>
e6143c
-    </key>
e6143c
-    <key name="test-double" type="d">
e6143c
-      <default>123.456</default>
e6143c
-    </key>
e6143c
-    <key name="test-string" type="s">
e6143c
-      <default>"a string, it seems"</default>
e6143c
-    </key>
e6143c
-    <key name="test-objectpath" type="o">
e6143c
-      <default>"/a/object/path"</default>
e6143c
-    </key>
e6143c
-  </schema>
e6143c
-
e6143c
-  <schema id="org.gtk.test.complex-types" path="/tests/complex-types/">
e6143c
-    <key name="test-tuple" type="(s(ii))">
e6143c
-      <default>("one",(2,3))</default>
e6143c
-    </key>
e6143c
-    <key name="test-array" type="ai">
e6143c
-      <default>[0,1,2,3,4,5]</default>
e6143c
-    </key>
e6143c
-    <key name="test-dict" type="a{sau}">
e6143c
-      <default>
e6143c
-      {
e6143c
-        "AC": [0,0, 0,0,0,0,0,0],
e6143c
-        "IV": [0,0, 0,0,0,0,0,0]
e6143c
-      }
e6143c
-      </default>
e6143c
-    </key>
e6143c
-  </schema>
e6143c
-
e6143c
-  <schema id="org.gtk.test.localized" path="/tests/localized/" gettext-domain="test">
e6143c
-    <key name="error-message" type="s">
e6143c
-      <default l10n="messages">"Unnamed"</default>
e6143c
-    </key>
e6143c
-    <key name="backspace" type="s">
e6143c
-      <default l10n="messages" context="keyboard label">"BackSpace"</default>
e6143c
-    </key>
e6143c
-  </schema>
e6143c
-
e6143c
-  <schema id="org.gtk.test.binding" path="/tests/binding/">
e6143c
-    <key name="bool" type="b">
e6143c
-      <default>false</default>
e6143c
-    </key>
e6143c
-    <key name="anti-bool" type="b">
e6143c
-      <default>false</default>
e6143c
-    </key>
e6143c
-    <key name="byte" type="y">
e6143c
-      <default>0</default>
e6143c
-    </key>
e6143c
-    <key name="int16" type="n">
e6143c
-      <default>0</default>
e6143c
-    </key>
e6143c
-    <key name="uint16" type="q">
e6143c
-      <default>0</default>
e6143c
-    </key>
e6143c
-    <key name="int" type="i">
e6143c
-      <default>0</default>
e6143c
-    </key>
e6143c
-    <key name="uint" type="u">
e6143c
-      <default>0</default>
e6143c
-    </key>
e6143c
-    <key name="int64" type="x">
e6143c
-      <default>0</default>
e6143c
-    </key>
e6143c
-    <key name="uint64" type="t">
e6143c
-      <default>0</default>
e6143c
-    </key>
e6143c
-    <key name="double" type="d">
e6143c
-      <default>0</default>
e6143c
-    </key>
e6143c
-    <key name="string" type="s">
e6143c
-      <default>""</default>
e6143c
-    </key>
e6143c
-    <key name="chararray" type="ay">
e6143c
-      <default>[48, 49]</default>
e6143c
-    </key>
e6143c
-    <key name="strv" type="as">
e6143c
-      <default>[]</default>
e6143c
-    </key>
e6143c
-    <key name="enum" enum="org.gtk.test.TestEnum">
e6143c
-      <default>'foo'</default>
e6143c
-    </key>
e6143c
-    <key name="flags" flags="org.gtk.test.TestFlags">
e6143c
-      <default>['mourning', 'laughing']</default>
e6143c
-    </key>
e6143c
-    <key name="range" type='u'>
e6143c
-      <default>33</default>
e6143c
-      <range min="2" max="44"/>
e6143c
-    </key>
e6143c
-  </schema>
e6143c
-
e6143c
-  <schema id='org.gtk.test.enums' path='/tests/enums/'>
e6143c
-    <key name='test' enum='org.gtk.test.TestEnum'>
e6143c
-      <default>'bar'</default>
e6143c
-      <aliases>
e6143c
-        <alias value='qux' target='quux'/>
e6143c
-      </aliases>
e6143c
-    </key>
e6143c
-    <key name='f-test' flags='org.gtk.test.TestFlags'>
e6143c
-      <default>[]</default>
e6143c
-      <aliases>
e6143c
-        <alias value='speaking' target='talking'/>
e6143c
-      </aliases>
e6143c
-    </key>
e6143c
-  </schema>
e6143c
-
e6143c
-  <schema id='org.gtk.test.enums.direct' path='/tests/enums/'>
e6143c
-    <key name='f-test' type='as'>
e6143c
-      <default>[]</default>
e6143c
-    </key>
e6143c
-    <key name='test' type='s'>
e6143c
-      <default>'bar'</default>
e6143c
-    </key>
e6143c
-  </schema>
e6143c
-
e6143c
-  <schema id='org.gtk.test.range' path='/tests/range/'>
e6143c
-    <key name='val' type='i'>
e6143c
-      <default>33</default>
e6143c
-      <range min='2' max='44'/>
e6143c
-    </key>
e6143c
-  </schema>
e6143c
-
e6143c
-  <schema id='org.gtk.test.range.direct' path='/tests/range/'>
e6143c
-    <key name='val' type='i'>
e6143c
-      <default>33</default>
e6143c
-    </key>
e6143c
-  </schema>
e6143c
-
e6143c
-  <schema id='org.gtk.test.mapped' path='/tests/mapped/'>
e6143c
-    <key name='val' type='i'>
e6143c
-      <default>0</default>
e6143c
-    </key>
e6143c
-  </schema>
e6143c
-
e6143c
-  <schema id="org.gtk.test.descriptions" path="/a/">
e6143c
-    <key name='a' type='i'>
e6143c
-      <summary>
e6143c
-        a paragraph.
e6143c
-
e6143c
-        with some whitespace.
e6143c
-         
e6143c
-        because not everyone has a great editor.
e6143c
-
e6143c
-       	  
e6143c
-
e6143c
-
e6143c
-        lots of space is            as one.    
e6143c
-      </summary>
e6143c
-      <default>0</default>
e6143c
-    </key>
e6143c
-  </schema>
e6143c
-
e6143c
-  <schema id='org.gtk.test.extends.base'>
e6143c
-    <key name='int32' type='i'>
e6143c
-      <default>0</default>
e6143c
-    </key>
e6143c
-    <key name='string' type='s'>
e6143c
-      <default>''</default>
e6143c
-    </key>
e6143c
-  </schema>
e6143c
-  <schema id='org.gtk.test.extends.extended' extends='org.gtk.test.extends.base'>
e6143c
-    <override name="int32">42</override>
e6143c
-    <key name='another-int32' type='i'>
e6143c
-      <default>0</default>
e6143c
-    </key>
e6143c
-  </schema>
e6143c
-
e6143c
-  <schema id="org.gtk.test.per-desktop" path="/tests/per-desktop/">
e6143c
-    <key name="desktop" type="s">
e6143c
-      <default>"GNOME"</default>
e6143c
-    </key>
e6143c
-  </schema>
e6143c
-
e6143c
-</schemalist>
e6143c
diff -rupN --no-dereference glib-2.66.7/glib/gstdio.c glib-2.66.7-new/glib/gstdio.c
e6143c
--- glib-2.66.7/glib/gstdio.c	2021-02-11 13:24:55.239942800 +0100
e6143c
+++ glib-2.66.7-new/glib/gstdio.c	2021-03-05 23:02:21.918877448 +0100
e6143c
@@ -1045,6 +1045,11 @@ g_open (const gchar *filename,
e6143c
 	int          mode)
e6143c
 {
e6143c
 #ifdef G_OS_WIN32
e6143c
+  HANDLE hFile;
e6143c
+  DWORD  dwDesiredAccess       = 0;
e6143c
+  DWORD  dwFlagsAndAttributes  = 0;
e6143c
+  DWORD  dwDisposition         = OPEN_EXISTING;
e6143c
+  DWORD  dwSharedAccess        = FILE_SHARE_READ | FILE_SHARE_DELETE;
e6143c
   wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
e6143c
   int retval;
e6143c
   int save_errno;
e6143c
@@ -1055,12 +1060,114 @@ g_open (const gchar *filename,
e6143c
       return -1;
e6143c
     }
e6143c
 
e6143c
-  retval = _wopen (wfilename, flags, mode);
e6143c
-  save_errno = errno;
e6143c
+  /* Set up the access modes and other attributes */
e6143c
+  if ((flags & _O_CREAT) && (mode & _S_IREAD))
e6143c
+  {
e6143c
+    if (! (mode & _S_IWRITE))
e6143c
+      dwFlagsAndAttributes  = FILE_ATTRIBUTE_READONLY; /* Sets file to 'read only' after the file gets closed */
e6143c
+  }
e6143c
+  if ( !(flags & _O_ACCMODE))
e6143c
+  {
e6143c
+    /* Equates to _O_RDONLY */
e6143c
+    if (flags & _O_TRUNC)
e6143c
+	{
e6143c
+	  errno = EINVAL;
e6143c
+	  g_free (wfilename);
e6143c
+	  return -1;
e6143c
+	}
e6143c
+
e6143c
+	dwDesiredAccess |= GENERIC_READ;
e6143c
+	dwSharedAccess  |= FILE_SHARE_WRITE;
e6143c
+  }
e6143c
+  if (flags & _O_WRONLY)
e6143c
+  {
e6143c
+    if (flags & _O_RDWR)
e6143c
+	{
e6143c
+	  errno = EINVAL;
e6143c
+	  g_free (wfilename);
e6143c
+	  return -1;
e6143c
+	}
e6143c
+
e6143c
+	dwDesiredAccess |= GENERIC_WRITE;
e6143c
+  }
e6143c
+  if (flags & _O_RDWR)
e6143c
+  {
e6143c
+	dwDesiredAccess |= GENERIC_READ;
e6143c
+	dwDesiredAccess |= GENERIC_WRITE;
e6143c
+  }
e6143c
+  if (flags & _O_TRUNC)
e6143c
+  {
e6143c
+    if (flags & _O_CREAT)
e6143c
+	  dwDisposition = CREATE_ALWAYS;
e6143c
+	else
e6143c
+	  dwDisposition = TRUNCATE_EXISTING;
e6143c
+  }
e6143c
+  if ((flags & _O_CREAT) && !(flags & _O_TRUNC))
e6143c
+  {
e6143c
+    if (flags & _O_EXCL)
e6143c
+	  dwDisposition = CREATE_NEW;
e6143c
+	else
e6143c
+	  dwDisposition = OPEN_ALWAYS;
e6143c
+  }
e6143c
+  if (flags & _O_CREAT)
e6143c
+  {
e6143c
+    /* Handle the other flags that can be attached to _O_CREAT */
e6143c
+    if ((flags & _O_TEMPORARY) || (flags & _O_SHORT_LIVED))
e6143c
+      dwFlagsAndAttributes |= FILE_ATTRIBUTE_TEMPORARY;
e6143c
+
e6143c
+    if (flags & _O_TEMPORARY)
e6143c
+      dwFlagsAndAttributes |= FILE_FLAG_DELETE_ON_CLOSE;
e6143c
+  }
e6143c
+  if ((flags & _O_SEQUENTIAL) || (flags & _O_APPEND))
e6143c
+  {
e6143c
+    dwFlagsAndAttributes |= FILE_FLAG_SEQUENTIAL_SCAN;
e6143c
+  }
e6143c
+  else if (flags & _O_RANDOM)
e6143c
+  {
e6143c
+    dwFlagsAndAttributes |= FILE_FLAG_RANDOM_ACCESS;
e6143c
+  }
e6143c
+
e6143c
+  if (0 == dwFlagsAndAttributes)
e6143c
+    dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL;
e6143c
+  hFile = CreateFileW(wfilename, dwDesiredAccess, dwSharedAccess, NULL, dwDisposition, dwFlagsAndAttributes, NULL);
e6143c
+
e6143c
+  if (INVALID_HANDLE_VALUE == hFile)
e6143c
+  {
e6143c
+    retval = (-1);
e6143c
+
e6143c
+    switch (GetLastError ())
e6143c
+    {
e6143c
+#define CASE(a,b) case ERROR_##a: errno = b; break
e6143c
+      CASE (FILE_NOT_FOUND, ENOENT);
e6143c
+      CASE (PATH_NOT_FOUND, ENOENT);
e6143c
+      CASE (ACCESS_DENIED, EACCES);
e6143c
+      CASE (NOT_SAME_DEVICE, EXDEV);
e6143c
+      CASE (LOCK_VIOLATION, EACCES);
e6143c
+      CASE (SHARING_VIOLATION, EACCES);
e6143c
+      CASE (FILE_EXISTS, EEXIST);
e6143c
+      CASE (ALREADY_EXISTS, EEXIST);
e6143c
+#undef CASE
e6143c
+      default: errno = EIO;
e6143c
+    }
e6143c
+  }
e6143c
+  else
e6143c
+    retval = _open_osfhandle((long)hFile, flags);
e6143c
 
e6143c
-  g_free (wfilename);
e6143c
+  if ((-1) != retval)
e6143c
+  {
e6143c
+    /* We have a valid file handle. Set its translation mode to text or binary, as appropriate */
e6143c
+    if ((!(flags & _O_TEXT)) && (_fmode == _O_BINARY))
e6143c
+      _setmode(retval, _O_BINARY);
e6143c
+    else if ((flags & _O_TEXT) || (_fmode == _O_TEXT))
e6143c
+      _setmode(retval, _O_TEXT);
e6143c
+    else
e6143c
+      _setmode(retval, _O_BINARY);
e6143c
+  }
e6143c
 
e6143c
+  save_errno = errno;
e6143c
+  g_free (wfilename);
e6143c
   errno = save_errno;
e6143c
+
e6143c
   return retval;
e6143c
 #else
e6143c
   int fd;
e6143c
@@ -1108,6 +1215,8 @@ g_creat (const gchar *filename,
e6143c
 	 int          mode)
e6143c
 {
e6143c
 #ifdef G_OS_WIN32
e6143c
+  HANDLE hFile;
e6143c
+  DWORD  dwFlagsAndAttributes  = FILE_ATTRIBUTE_NORMAL;
e6143c
   wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
e6143c
   int retval;
e6143c
   int save_errno;
e6143c
@@ -1118,12 +1227,41 @@ g_creat (const gchar *filename,
e6143c
       return -1;
e6143c
     }
e6143c
 
e6143c
-  retval = _wcreat (wfilename, mode);
e6143c
-  save_errno = errno;
e6143c
+  if (mode & _S_IREAD)
e6143c
+  {
e6143c
+    if (! (mode & _S_IWRITE))
e6143c
+      dwFlagsAndAttributes  = FILE_ATTRIBUTE_READONLY; /* Sets file to 'read only' after the file gets closed */
e6143c
+  }
e6143c
+
e6143c
+  hFile = CreateFileW(wfilename, (GENERIC_READ | GENERIC_WRITE), (FILE_SHARE_READ | FILE_SHARE_DELETE),
e6143c
+                                  NULL, CREATE_ALWAYS, dwFlagsAndAttributes, NULL);
e6143c
+
e6143c
+  if (INVALID_HANDLE_VALUE == hFile)
e6143c
+  {
e6143c
+    retval = (-1);
e6143c
+
e6143c
+    switch (GetLastError ())
e6143c
+    {
e6143c
+#define CASE(a,b) case ERROR_##a: errno = b; break
e6143c
+      CASE (FILE_NOT_FOUND, ENOENT);
e6143c
+      CASE (PATH_NOT_FOUND, ENOENT);
e6143c
+      CASE (ACCESS_DENIED, EACCES);
e6143c
+      CASE (NOT_SAME_DEVICE, EXDEV);
e6143c
+      CASE (LOCK_VIOLATION, EACCES);
e6143c
+      CASE (SHARING_VIOLATION, EACCES);
e6143c
+      CASE (FILE_EXISTS, EEXIST);
e6143c
+      CASE (ALREADY_EXISTS, EEXIST);
e6143c
+#undef CASE
e6143c
+      default: errno = EIO;
e6143c
+    }
e6143c
+  }
e6143c
+  else
e6143c
+    retval = _open_osfhandle((long)hFile, _O_RDWR);
e6143c
 
e6143c
+  save_errno = errno;
e6143c
   g_free (wfilename);
e6143c
-
e6143c
   errno = save_errno;
e6143c
+
e6143c
   return retval;
e6143c
 #else
e6143c
   return creat (filename, mode);
e6143c
@@ -1565,34 +1703,102 @@ g_fopen (const gchar *filename,
e6143c
 	 const gchar *mode)
e6143c
 {
e6143c
 #ifdef G_OS_WIN32
e6143c
-  wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
e6143c
-  wchar_t *wmode;
e6143c
-  FILE *retval;
e6143c
-  int save_errno;
e6143c
-
e6143c
-  if (wfilename == NULL)
e6143c
-    {
e6143c
-      errno = EINVAL;
e6143c
-      return NULL;
e6143c
-    }
e6143c
-
e6143c
-  wmode = g_utf8_to_utf16 (mode, -1, NULL, NULL, NULL);
e6143c
-
e6143c
-  if (wmode == NULL)
e6143c
-    {
e6143c
-      g_free (wfilename);
e6143c
-      errno = EINVAL;
e6143c
-      return NULL;
e6143c
-    }
e6143c
-
e6143c
-  _g_win32_fix_mode (wmode);
e6143c
-  retval = _wfopen (wfilename, wmode);
e6143c
-  save_errno = errno;
e6143c
-
e6143c
-  g_free (wfilename);
e6143c
-  g_free (wmode);
e6143c
-
e6143c
-  errno = save_errno;
e6143c
+  int   hFile;
e6143c
+  int   flags  = 0;
e6143c
+  gchar priv_mode[4];
e6143c
+  FILE *retval = NULL;
e6143c
+
e6143c
+  if ((NULL == filename) || (NULL == mode))
e6143c
+  {
e6143c
+    errno = EINVAL;
e6143c
+    goto out;
e6143c
+  }
e6143c
+  if ((strlen(mode) < 1) || (strlen(mode) > 3))
e6143c
+  {
e6143c
+    errno - EINVAL;
e6143c
+    goto out;
e6143c
+  }
e6143c
+
e6143c
+  strncpy(priv_mode, mode, 3);
e6143c
+  priv_mode[3] = '\0';
e6143c
+
e6143c
+  /* Set up any flags to pass to 'g_open()' */
e6143c
+  if (3 == strlen(priv_mode))
e6143c
+  {
e6143c
+    if (('c' == priv_mode[2]) || ('n' == priv_mode[2]))
e6143c
+      priv_mode[2] = '\0';
e6143c
+    else
e6143c
+    {
e6143c
+      if (0 == strcmp(priv_mode, "a+b"))
e6143c
+        flags = _O_RDWR | _O_CREAT | _O_APPEND | _O_BINARY;
e6143c
+      else if (0 == strcmp(priv_mode, "a+t"))
e6143c
+        flags = _O_RDWR | _O_CREAT | _O_APPEND | _O_TEXT;
e6143c
+      else if (0 == strcmp(priv_mode, "r+b"))
e6143c
+        flags = _O_RDWR | _O_BINARY;
e6143c
+      else if (0 == strcmp(priv_mode, "r+t"))
e6143c
+        flags = _O_RDWR | _O_TEXT;
e6143c
+      else if (0 == strcmp(priv_mode, "w+b"))
e6143c
+        flags = _O_RDWR | _O_CREAT |_O_TRUNC | _O_BINARY;
e6143c
+      else if (0 == strcmp(priv_mode, "w+t"))
e6143c
+        flags = _O_RDWR | _O_CREAT |_O_TRUNC | _O_TEXT;
e6143c
+      else
e6143c
+	  {
e6143c
+	    errno = EINVAL;
e6143c
+        goto out;
e6143c
+	  }
e6143c
+    }
e6143c
+  }
e6143c
+  if (2 == strlen(priv_mode))
e6143c
+  {
e6143c
+    if (('c' == priv_mode[1]) || ('n' == priv_mode[1]))
e6143c
+      priv_mode[1] = '\0';
e6143c
+    else
e6143c
+    {
e6143c
+      if (0 == strcmp(priv_mode, "a+"))
e6143c
+        flags = _O_RDWR | _O_CREAT | _O_APPEND;
e6143c
+      else if (0 == strcmp(priv_mode, "ab"))
e6143c
+        flags = _O_WRONLY | _O_CREAT | _O_APPEND | _O_BINARY;
e6143c
+      else if (0 == strcmp(priv_mode, "at"))
e6143c
+        flags = _O_WRONLY | _O_CREAT | _O_APPEND | _O_TEXT;
e6143c
+      else if (0 == strcmp(priv_mode, "rb"))
e6143c
+        flags = _O_RDONLY | _O_BINARY;
e6143c
+      else if (0 == strcmp(priv_mode, "rt"))
e6143c
+        flags = _O_RDONLY | _O_TEXT;
e6143c
+      else if (0 == strcmp(priv_mode, "wb"))
e6143c
+        flags = _O_WRONLY | _O_CREAT | _O_TRUNC | _O_BINARY;
e6143c
+      else if (0 == strcmp(priv_mode, "wt"))
e6143c
+        flags = _O_WRONLY | _O_CREAT | _O_TRUNC | _O_TEXT;
e6143c
+      else
e6143c
+	  {
e6143c
+	    errno = EINVAL;
e6143c
+        goto out;
e6143c
+	  }
e6143c
+    }
e6143c
+  }
e6143c
+  if (1 == strlen(priv_mode))
e6143c
+  {
e6143c
+    if (0 == strcmp(priv_mode, "a"))
e6143c
+      flags = _O_WRONLY | _O_CREAT | _O_APPEND;
e6143c
+    else if (0 == strcmp(priv_mode, "r"))
e6143c
+      flags = _O_RDONLY;
e6143c
+    else if (0 == strcmp(priv_mode, "w"))
e6143c
+      flags = _O_WRONLY | _O_CREAT | _O_TRUNC;
e6143c
+    else if ( !((0 == strcmp(priv_mode, "c")) || (0 == strcmp(priv_mode, "n"))))
e6143c
+	{
e6143c
+	  errno = EINVAL;
e6143c
+      goto out;
e6143c
+	}
e6143c
+  }
e6143c
+ 
e6143c
+  hFile = g_open (filename, flags, (_S_IREAD | _S_IWRITE));
e6143c
+ 
e6143c
+  if (INVALID_HANDLE_VALUE == (HANDLE)hFile)
e6143c
+    /* 'errno' will have already been set by 'g_open()' */
e6143c
+    retval = NULL;
e6143c
+  else
e6143c
+    retval = _fdopen(hFile, mode);
e6143c
+ 
e6143c
+out:
e6143c
   return retval;
e6143c
 #else
e6143c
   return fopen (filename, mode);