Replace _wcserror_s for Windows XP compatibility
authorEric Biggers <ebiggers3@gmail.com>
Thu, 28 Mar 2013 01:23:00 +0000 (20:23 -0500)
committerEric Biggers <ebiggers3@gmail.com>
Thu, 28 Mar 2013 01:23:00 +0000 (20:23 -0500)
src/win32.c
src/win32.h
wimlib_tchar.h

index 3dc20a9422e74bfae46881dda8c553c9c648d906..7636c5fe9d9b05d9b2d293890626cfdc4d801d17 100644 (file)
@@ -39,6 +39,7 @@
 #include "lookup_table.h"
 #include "security.h"
 #include "endianness.h"
 #include "lookup_table.h"
 #include "security.h"
 #include "endianness.h"
+#include <pthread.h>
 
 #include <errno.h>
 
 
 #include <errno.h>
 
@@ -1534,4 +1535,20 @@ fail:
        return -1;
 }
 
        return -1;
 }
 
+
+/* This really could be replaced with _wcserror_s, but this doesn't seem to
+ * actually be available in MSVCRT.DLL on Windows XP (perhaps it's statically
+ * linked in by Visual Studio...?). */
+extern int
+win32_strerror_r_replacement(int errnum, wchar_t *buf, size_t buflen)
+{
+       static pthread_mutex_t strerror_lock = PTHREAD_MUTEX_INITIALIZER;
+
+       pthread_mutex_lock(&strerror_lock);
+       mbstowcs(buf, strerror(errnum), buflen);
+       buf[buflen - 1] = '\0';
+       pthread_mutex_unlock(&strerror_lock);
+       return 0;
+}
+
 #endif /* __WIN32__ */
 #endif /* __WIN32__ */
index 82cdeef3b72b84cd91161bb51741e9b50a2d0e77..45909768e49a9c76e42d4240339bb1c13b0d9aa8 100644 (file)
@@ -76,4 +76,7 @@ win32_global_init();
 extern void
 win32_global_cleanup();
 
 extern void
 win32_global_cleanup();
 
+extern int
+win32_strerror_r_replacement(int errnum, tchar *buf, size_t buflen);
+
 #endif /* _WIMLIB_WIN32_H */
 #endif /* _WIMLIB_WIN32_H */
index 4d722379a6e85c90b441c53ad33bcfd48d73381b..b27fbeabf8bb994116e1fe2759f669c5411d2ef7 100644 (file)
@@ -53,7 +53,7 @@ typedef wchar_t tchar;
  * function defined ourselves. */
 #  define TSTRDUP      WSTRDUP
 #  define tmkdir(path, mode) _wmkdir(path)
  * function defined ourselves. */
 #  define TSTRDUP      WSTRDUP
 #  define tmkdir(path, mode) _wmkdir(path)
-#  define tstrerror_r(errnum, buf, bufsize) _wcserror_s(buf, bufsize, errnum)
+#  define tstrerror_r   win32_strerror_r_replacement
 #  define trename      win32_rename_replacement
 #  define ttruncate    win32_truncate_replacement
 #else /* __WIN32__ */
 #  define trename      win32_rename_replacement
 #  define ttruncate    win32_truncate_replacement
 #else /* __WIN32__ */