summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/strerror.c31
1 files changed, 15 insertions, 16 deletions
diff --git a/lib/strerror.c b/lib/strerror.c
index 0a3b73844..b5808df2d 100644
--- a/lib/strerror.c
+++ b/lib/strerror.c
@@ -44,7 +44,6 @@
#endif
#include "strerror.h"
-#include "curl_multibyte.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
@@ -656,26 +655,26 @@ static const char *
get_winapi_error(int err, char *buf, size_t buflen)
{
char *p;
+ wchar_t wbuf[256];
if(!buflen)
return NULL;
*buf = '\0';
-
- {
- TCHAR wbuf[256];
- wbuf[0] = L'\0';
-
- if(FormatMessage((FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS), NULL, err,
- LANG_NEUTRAL, wbuf, sizeof(wbuf)/sizeof(TCHAR), NULL)) {
- char *msg = curlx_convert_tchar_to_UTF8(wbuf);
- if(msg) {
- strncpy(buf, msg, buflen - 1);
- buf[buflen-1] = '\0';
- curlx_unicodefree(msg);
- }
- }
+ *wbuf = L'\0';
+
+ /* We return the local codepage version of the error string because if it is
+ output to the user's terminal it will likely be with functions which
+ expect the local codepage (eg fprintf, failf, infof).
+ FormatMessageW -> wcstombs is used for Windows CE compatibility. */
+ if(FormatMessageW((FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS), NULL, err,
+ LANG_NEUTRAL, wbuf, sizeof(wbuf)/sizeof(wchar_t), NULL)) {
+ size_t written = wcstombs(buf, wbuf, buflen - 1);
+ if(written != (size_t)-1)
+ buf[written] = '\0';
+ else
+ *buf = '\0';
}
/* Truncate multiple lines */