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 3dc20a9..7636c5f 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 82cdeef..4590976 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 4d72237..b27fbea 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__ */