commit d7b4489c6d0322677d5974ed73edfc782ace0ef3
Author: Erik van Pienbroek <[email protected]>
Date:   Mon Aug 27 23:38:51 2012 +0200

    Applied patch to make g_unlink more reliable on Win32
    
    - Use CreateFile on Win32 to make sure g_unlink always works (GNOME BZ 
#674214)
    - Fixed typo's in description
    - Revised 0001-Don-t-start-a-DBus-server-when-built-as-static-lib.patch

 ...rt-a-DBus-server-when-built-as-static-lib.patch |   27 ++-
 ...ile-on-Win32-to-make-sure-g_unlink-always.patch |  334 ++++++++++++++++++++
 mingw-glib2.spec                                   |   14 +-
 3 files changed, 364 insertions(+), 11 deletions(-)
---
diff --git a/0001-Don-t-start-a-DBus-server-when-built-as-static-lib.patch 
b/0001-Don-t-start-a-DBus-server-when-built-as-static-lib.patch
index a44de7d..3ca424a 100644
--- a/0001-Don-t-start-a-DBus-server-when-built-as-static-lib.patch
+++ b/0001-Don-t-start-a-DBus-server-when-built-as-static-lib.patch
@@ -1,6 +1,6 @@
-From f40b1bdb92a2a1d77bc7b451add6a587cc270100 Mon Sep 17 00:00:00 2001
+From b3ffcafba67b01f6dcecb2525dca1c51bf218efa Mon Sep 17 00:00:00 2001
 From: Erik van Pienbroek <[email protected]>
-Date: Sat, 5 May 2012 18:10:47 +0200
+Date: Mon, 27 Aug 2012 22:57:01 +0200
 Subject: [PATCH] Don't start a DBus server when built as static lib
 
 The new Win32 DBus server code which was recently introduced works
@@ -17,14 +17,22 @@ using a static compiled GLib and that a proper error 
message is automatically
 returned to the caller. This also fixes a compilation failure which occurs
 when GLib is compiled as static library
 ---
- gio/gdbusaddress.c |    4 ++++
- 1 file changed, 4 insertions(+)
+ gio/gdbusaddress.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
 
 diff --git a/gio/gdbusaddress.c b/gio/gdbusaddress.c
-index 4aa13b9..5fba139 100644
+index fac22b7..8f57997 100644
 --- a/gio/gdbusaddress.c
 +++ b/gio/gdbusaddress.c
-@@ -1390,6 +1390,8 @@ get_session_address_dbus_launch (GError **error)
+@@ -1354,7 +1354,6 @@ get_session_address_dbus_launch (GError **error)
+ {
+   HANDLE autolaunch_mutex, init_mutex;
+   char *address = NULL;
+-  wchar_t gio_path[MAX_PATH+1+200];
+ 
+   autolaunch_mutex = acquire_mutex (DBUS_AUTOLAUNCH_MUTEX);
+ 
+@@ -1365,8 +1364,11 @@ get_session_address_dbus_launch (GError **error)
  
    release_mutex (init_mutex);
  
@@ -32,8 +40,11 @@ index 4aa13b9..5fba139 100644
 +
    if (address == NULL)
      {
++      wchar_t gio_path[MAX_PATH+1+200];
        gio_path[MAX_PATH] = 0;
-@@ -1428,6 +1430,8 @@ get_session_address_dbus_launch (GError **error)
+       if (GetModuleFileNameW (_g_io_win32_get_module (), gio_path, MAX_PATH))
+       {
+@@ -1403,6 +1405,8 @@ get_session_address_dbus_launch (GError **error)
        }
      }
  
@@ -43,5 +54,5 @@ index 4aa13b9..5fba139 100644
  
    if (address == NULL)
 -- 
-1.7.10.1
+1.7.11.4
 
diff --git a/0001-Use-CreateFile-on-Win32-to-make-sure-g_unlink-always.patch 
b/0001-Use-CreateFile-on-Win32-to-make-sure-g_unlink-always.patch
new file mode 100644
index 0000000..62b19f2
--- /dev/null
+++ b/0001-Use-CreateFile-on-Win32-to-make-sure-g_unlink-always.patch
@@ -0,0 +1,334 @@
+From 7f4f4354540440c0a8a37beaccbec8bc7fc15ec7 Mon Sep 17 00:00:00 2001
+From: Erik van Pienbroek <[email protected]>
+Date: Mon, 27 Aug 2012 23:28:54 +0200
+Subject: [PATCH] Use CreateFile on Win32 to make sure g_unlink always works
+
+The functions g_open(), g_creat() and g_fopen() defer to _wopen(),
+_wcreat() and _wfopen() respectively. This is very similar to
+the corresponding arrangement for Linux. However, those Windows
+functions do not support renaming a file whilst it's open. As a
+result, g_rename() behaves differently on the Windows platform
+compared to its Linux behaviour, where files can be renamed even
+while there are file handles still open. Resolved this by using
+the Win32 API function CreateFile() instead of _wopen(), _wcreat()
+and _wfopen()
+
+Patch initially created by John Emmas
+---
+ glib/gstdio.c | 259 ++++++++++++++++++++++++++++++++++++++++++++++++++++------
+ 1 file changed, 233 insertions(+), 26 deletions(-)
+
+diff --git a/glib/gstdio.c b/glib/gstdio.c
+index 6d763e1..c1d072f 100644
+--- a/glib/gstdio.c
++++ b/glib/gstdio.c
+@@ -191,6 +191,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;
+@@ -201,12 +206,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;
++      }
+ 
+-  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
+   return open (filename, flags, mode);
+@@ -248,6 +355,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;
+@@ -258,12 +367,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 */
++  }
+ 
+-  g_free (wfilename);
++  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);
+@@ -699,33 +837,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)
++  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
+     {
+-      errno = EINVAL;
+-      return NULL;
++      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;
++        }
+     }
+-
+-  wmode = g_utf8_to_utf16 (mode, -1, NULL, NULL, NULL);
+-
+-  if (wmode == NULL)
++  }
++  if (2 == strlen(priv_mode))
++  {
++    if (('c' == priv_mode[1]) || ('n' == priv_mode[1]))
++      priv_mode[1] = '\0';
++    else
+     {
+-      g_free (wfilename);
+-      errno = EINVAL;
+-      return NULL;
++      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;
++      }
++  }
+ 
+-  retval = _wfopen (wfilename, wmode);
+-  save_errno = errno;
++  hFile = g_open (filename, flags, (_S_IREAD | _S_IWRITE));
+ 
+-  g_free (wfilename);
+-  g_free (wmode);
++  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);
+-- 
+1.7.11.4
+
diff --git a/mingw-glib2.spec b/mingw-glib2.spec
index 86ebdd0..06b15ff 100644
--- a/mingw-glib2.spec
+++ b/mingw-glib2.spec
@@ -2,7 +2,7 @@
 
 Name:           mingw-glib2
 Version:        2.33.10
-Release:        1%{?dist}
+Release:        2%{?dist}
 Summary:        MinGW Windows GLib2 library
 
 License:        LGPLv2+
@@ -38,13 +38,16 @@ BuildRequires:  glib2-devel >= 2.31.20
 # https://bugzilla.gnome.org/show_bug.cgi?id=675516
 Patch0:         0001-Don-t-start-a-DBus-server-when-built-as-static-lib.patch
 
+# https://bugzilla.gnome.org/show_bug.cgi?id=674214
+Patch1:         0001-Use-CreateFile-on-Win32-to-make-sure-g_unlink-always.patch
+
 
 %description
 MinGW Windows Glib2 library.
 
 # Win32
 %package -n mingw32-glib2
-Summary:         MinGW Windows zlib compression library for the win32 target
+Summary:         MinGW Windows Glib2 library for the win32 target
 
 %description -n mingw32-glib2
 MinGW Windows Glib2 library.
@@ -59,7 +62,7 @@ Static version of the MinGW Windows GLib2 library.
 
 # Win64
 %package -n mingw64-glib2
-Summary:         MinGW Windows zlib compression library for the win32 target
+Summary:         MinGW Windows Glib2 library for the win64 target
 
 %description -n mingw64-glib2
 MinGW Windows Glib2 library.
@@ -79,6 +82,7 @@ Static version of the MinGW Windows GLib2 library.
 %prep
 %setup -q -n glib-%{version}
 %patch0 -p1
+%patch1 -p1
 
 
 %build
@@ -257,6 +261,10 @@ find $RPM_BUILD_ROOT -name "*.la" -delete
 
 
 %changelog
+* Mon Aug 27 2012 Erik van Pienbroek <[email protected]> - 2.33.10-2
+- Use CreateFile on Win32 to make sure g_unlink always works (GNOME BZ #674214)
+- Fixed typo's in description
+
 * Sat Aug 25 2012 Erik van Pienbroek <[email protected]> - 2.33.10-1
 - Update to 2.33.10
 
_______________________________________________
mingw mailing list
[email protected]
https://admin.fedoraproject.org/mailman/listinfo/mingw

Reply via email to