Fix g_stat() for 64bit windows/mingw64
This commit is contained in:
parent
0c59ba649e
commit
5c6e2b5802
@ -25,4 +25,45 @@ pbd_g_stat(const gchar *filename, GStatBufW32 *buf)
|
|||||||
# define g_lstat pbd_g_stat
|
# define g_lstat pbd_g_stat
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* 64bit mingw -- use _mingw_stat64.h
|
||||||
|
*
|
||||||
|
* glib-2.42.0 wrongly uses _wstat() with 'struct stat' (only MSVC is special cased),
|
||||||
|
* while the windows API is
|
||||||
|
* int _wstat(const wchar_t*, struct _stat*)
|
||||||
|
* note that struct _stat != struct stat;
|
||||||
|
*/
|
||||||
|
#if defined(_WIN32) && !defined(_MSC_VER) && defined(_WIN64)
|
||||||
|
#include <windows.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
|
||||||
|
typedef struct _stat GStatBufW64;
|
||||||
|
static inline int
|
||||||
|
pbd_g_stat(const gchar* filename, GStatBufW64* buf)
|
||||||
|
{
|
||||||
|
gunichar2* wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
|
||||||
|
if (wfilename == NULL) {
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int len = wcslen ((wchar_t*)wfilename);
|
||||||
|
while (len > 0 && G_IS_DIR_SEPARATOR (wfilename[len-1])) {
|
||||||
|
--len;
|
||||||
|
}
|
||||||
|
if (len > 0 && (!g_path_is_absolute (filename) || len > g_path_skip_root (filename) - filename)) {
|
||||||
|
wfilename[len] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
int retval = _wstat ((wchar_t*)wfilename, buf);
|
||||||
|
int save_errno = errno;
|
||||||
|
g_free (wfilename);
|
||||||
|
errno = save_errno;
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
# define GStatBuf GStatBufW64
|
||||||
|
# define g_stat pbd_g_stat
|
||||||
|
# define g_lstat pbd_g_stat
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* __pbd_gstdio_compat_h__ */
|
#endif /* __pbd_gstdio_compat_h__ */
|
||||||
|
Loading…
Reference in New Issue
Block a user