From 2a5df8ad2a6b23d61d03d1ab990e70385ca69a23 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 22 Aug 2019 17:05:35 -0600 Subject: [PATCH] rktio: fix Windows network error reporting Convert wide-character error message to UTF-8. Closes #2794 --- racket/src/rktio/rktio_error.c | 2 +- racket/src/rktio/rktio_network.c | 15 +++++++++++---- racket/src/rktio/rktio_private.h | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/racket/src/rktio/rktio_error.c b/racket/src/rktio/rktio_error.c index 3133775159..5f037c6599 100644 --- a/racket/src/rktio/rktio_error.c +++ b/racket/src/rktio/rktio_error.c @@ -141,7 +141,7 @@ const char *rktio_get_error_string(rktio_t *rktio, int kind, int errid) s = strerror(errid); #endif } else if (kind == RKTIO_ERROR_KIND_GAI) - s = rktio_gai_strerror(errid); + s = rktio_gai_strerror(rktio, errid); /* may use `last_err_str` */ #ifdef RKTIO_SYSTEM_WINDOWS else if (kind == RKTIO_ERROR_KIND_WINDOWS) { wchar_t mbuf[256]; diff --git a/racket/src/rktio/rktio_network.c b/racket/src/rktio/rktio_network.c index 74bd9f331a..b7dbeaa97a 100644 --- a/racket/src/rktio/rktio_network.c +++ b/racket/src/rktio/rktio_network.c @@ -210,9 +210,7 @@ struct rktio_addrinfo_t { # define rktio_AI_PASSIVE AI_PASSIVE # define do_getaddrinfo(n, s, h, res) getaddrinfo(n, s, RKTIO_AS_ADDRINFO(h), RKTIO_AS_ADDRINFO_PTR(res)) # define do_freeaddrinfo freeaddrinfo -# ifdef RKTIO_SYSTEM_WINDOWS -# define do_gai_strerror gai_strerrorA -# else +# ifndef RKTIO_SYSTEM_WINDOWS # define do_gai_strerror gai_strerror # endif #else @@ -749,9 +747,18 @@ void rktio_addrinfo_free(rktio_t *rktio, rktio_addrinfo_t *a) do_freeaddrinfo(RKTIO_AS_ADDRINFO(a)); } -const char *rktio_gai_strerror(int errnum) +const char *rktio_gai_strerror(rktio_t *rktio, int errnum) { +#ifdef RKTIO_SYSTEM_WINDOWS + char *s; + s = NARROW_PATH_copy(gai_strerrorW(errnum)); + if (rktio->last_err_str) + free(rktio->last_err_str); + rktio->last_err_str = s; + return s; +#else return do_gai_strerror(errnum); +#endif } /*========================================================================*/ diff --git a/racket/src/rktio/rktio_private.h b/racket/src/rktio/rktio_private.h index 25d3ffd7f8..fec026ec3e 100644 --- a/racket/src/rktio/rktio_private.h +++ b/racket/src/rktio/rktio_private.h @@ -233,7 +233,7 @@ intptr_t rktio_socket_read(rktio_t *rktio, rktio_fd_t *rfd, char *buffer, intptr void rktio_free_ghbn(rktio_t *rktio); -const char *rktio_gai_strerror(int errnum); +const char *rktio_gai_strerror(rktio_t *rktio, int errnum); /*========================================================================*/ /* Processes */