diff --git a/lib/core-net/adopt.c b/lib/core-net/adopt.c index 0f9f5cc69..9f0c26caa 100644 --- a/lib/core-net/adopt.c +++ b/lib/core-net/adopt.c @@ -841,11 +841,13 @@ lws_create_adopt_udp(struct lws_vhost *vhost, const char *ads, int port, n = getaddrinfo(ads, buf, &h, &r); if (n) { #if !defined(LWS_PLAT_FREERTOS) - lwsl_info("%s: getaddrinfo error: %s\n", __func__, - gai_strerror(n)); + lwsl_cx_info(vhost->context, "getaddrinfo error: %d", n); #else - lwsl_info("%s: getaddrinfo error: %s\n", __func__, - strerror(n)); +#if !defined(LWS_WITH_NO_LOGS) + char t16[16]; + lwsl_cx_info(vhost->context, "getaddrinfo error: %s", + lws_errno_describe(LWS_ERRNO, t16, sizeof(t16))); +#endif #endif //freeaddrinfo(r); goto bail1; diff --git a/lib/core-net/client/connect3.c b/lib/core-net/client/connect3.c index f0e60583b..adca633c8 100644 --- a/lib/core-net/client/connect3.c +++ b/lib/core-net/client/connect3.c @@ -1,7 +1,7 @@ /* * libwebsockets - small server side websockets and web server implementation * - * Copyright (C) 2010 - 2020 Andy Green + * Copyright (C) 2010 - 2021 Andy Green * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to @@ -73,6 +73,9 @@ typedef enum { static lcccr_t lws_client_connect_check(struct lws *wsi) { +#if !defined(LWS_WITH_NO_LOGS) + char t16[16]; +#endif int en = 0; #if !defined(WIN32) int e; @@ -88,15 +91,17 @@ lws_client_connect_check(struct lws *wsi) #if !defined(WIN32) if (!getsockopt(wsi->desc.sockfd, SOL_SOCKET, SO_ERROR, &e, &sl)) { + en = LWS_ERRNO; if (!e) { - lwsl_wsi_debug(wsi, "getsockopt: conn OK errno %d", en); + lwsl_wsi_debug(wsi, "getsockopt: conn OK errno %s", + lws_errno_describe(en, t16, sizeof(t16))); return LCCCR_CONNECTED; } - lwsl_wsi_notice(wsi, "getsockopt fd %d says e %d", - wsi->desc.sockfd, e); + lwsl_wsi_notice(wsi, "getsockopt fd %d says %s", wsi->desc.sockfd, + lws_errno_describe(e, t16, sizeof(t16))); return LCCCR_FAILED; } @@ -120,12 +125,15 @@ lws_client_connect_check(struct lws *wsi) if (!en || en == WSAEINVAL || en == WSAEWOULDBLOCK || en == WSAEALREADY) { - lwsl_wsi_debug(wsi, "errno %d", en); + lwsl_wsi_debug(wsi, "%s", + lws_errno_describe(en, t16, sizeof(t16))); + return LCCCR_CONTINUE; } #endif - lwsl_wsi_notice(wsi, "connect check take as FAILED: errno %d", en); + lwsl_wsi_notice(wsi, "connect check FAILED: %s", + lws_errno_describe(en, t16, sizeof(t16))); return LCCCR_FAILED; } @@ -148,14 +156,14 @@ lws_client_connect_3_connect(struct lws *wsi, const char *ads, const char *cce = "Unable to connect", *iface; const struct sockaddr *psa = NULL; uint16_t port = wsi->conn_port; + char dcce[48], t16[16]; lws_dns_sort_t *curr; ssize_t plen = 0; lws_dll2_t *d; - char dcce[48]; #if defined(LWS_WITH_SYS_FAULT_INJECTION) int cfail; #endif - int m, af = 0; + int m, af = 0, en; /* * If we come here with result set, we need to convert getaddrinfo @@ -221,7 +229,6 @@ lws_client_connect_3_connect(struct lws *wsi, const char *ads, if (lwsi_state(wsi) == LRS_WAITING_CONNECT && lws_socket_is_valid(wsi->desc.sockfd)) { - if (!wsi->dns_sorted_list.count && !wsi->sul_connect_timeout.list.owner) /* no dns results and no ongoing timeout for one */ @@ -236,8 +243,9 @@ lws_client_connect_3_connect(struct lws *wsi, const char *ads, case LCCCR_CONTINUE: return NULL; default: - lws_snprintf(dcce, sizeof(dcce), "conn fail: errno %d", - LWS_ERRNO); + en = LWS_ERRNO; + lws_snprintf(dcce, sizeof(dcce), "conn fail: %s", + lws_errno_describe(en, t16, sizeof(t16))); cce = dcce; lwsl_wsi_debug(wsi, "%s", dcce); lws_metrics_caliper_report(wsi->cal_conn, METRES_NOGO); @@ -343,9 +351,11 @@ ads_known: } if (!lws_socket_is_valid(wsi->desc.sockfd)) { + en = LWS_ERRNO; + lws_snprintf(dcce, sizeof(dcce), - "conn fail: skt creation: errno %d", - LWS_ERRNO); + "conn fail: skt creation: %s", + lws_errno_describe(en, t16, sizeof(t16))); cce = dcce; lwsl_wsi_warn(wsi, "%s", dcce); goto try_next_dns_result; @@ -357,9 +367,11 @@ ads_known: #else 0)) { #endif + en = LWS_ERRNO; + lws_snprintf(dcce, sizeof(dcce), - "conn fail: skt options: errno %d", - LWS_ERRNO); + "conn fail: skt options: %s", + lws_errno_describe(en, t16, sizeof(t16))); cce = dcce; lwsl_wsi_warn(wsi, "%s", dcce); goto try_next_dns_result_closesock; @@ -517,8 +529,9 @@ ads_known: errno_copy = 999; #endif - lwsl_wsi_debug(wsi, "connect: fd %d errno: %d", - wsi->desc.sockfd, errno_copy); + lwsl_wsi_debug(wsi, "connect: fd %d, %s", + wsi->desc.sockfd, + lws_errno_describe(errno_copy, t16, sizeof(t16))); if (errno_copy && errno_copy != LWS_EALREADY && @@ -551,8 +564,9 @@ ads_known: sizeof(nads)); lws_snprintf(dcce, sizeof(dcce), - "conn fail: errno %d: %s:%d", - errno_copy, nads, port); + "conn fail: %s: %s:%d", + lws_errno_describe(errno_copy, t16, sizeof(t16)), + nads, port); cce = dcce; wsi->sa46_peer.sa4.sin_family = 0; @@ -560,8 +574,8 @@ ads_known: #if defined(LWS_WITH_UNIX_SOCK) } else { lws_snprintf(dcce, sizeof(dcce), - "conn fail: errno %d: UDS %s", - errno_copy, ads); + "conn fail: %s: UDS %s", + lws_errno_describe(errno_copy, t16, sizeof(t16)), ads); cce = dcce; } #endif @@ -618,8 +632,10 @@ conn_good: #endif if (getsockname((int)wsi->desc.sockfd, (struct sockaddr *)&wsi->sa46_local, - &salen) == -1) - lwsl_warn("getsockname: %s\n", strerror(LWS_ERRNO)); + &salen) == -1) { + en = LWS_ERRNO; + lwsl_warn("getsockname: %s\n", lws_errno_describe(en, t16, sizeof(t16))); + } #if defined(_DEBUG) #if defined(LWS_WITH_UNIX_SOCK) if (wsi->unix_skt) diff --git a/lib/core-net/network.c b/lib/core-net/network.c index 6c155302b..26d17015c 100644 --- a/lib/core-net/network.c +++ b/lib/core-net/network.c @@ -25,6 +25,62 @@ #include "private-lib-core.h" #include +const char * +lws_errno_describe(int en, char *result, size_t len) +{ +#if !defined(WIN32) + switch (en) { + case EAGAIN: + return "EAGAIN"; + case EALREADY: + return "EALREADY"; + case EINPROGRESS: + return "EINPROGRESS"; + case EINTR: + return "EINTR"; + case EISCONN: + return "EISCONN"; + case ENOTCONN: + return "ENOTCONN"; + case EADDRINUSE: + return "EADDRINUSE"; + case EHOSTUNREACH: + return "EHOSTUNREACH"; + case ECONNREFUSED: + return "ECONNREFUSED"; + default: + break; + } + lws_snprintf(result, len, "errno %d", en); + + return result; +#else + switch (en) { + case WSAEISCONN: + return "WSAEISCONN"; + case WSAEALREADY: + return "WSAEALREADY"; + case WSAEINVAL: + return "WSAEINVAL"; + case WSAENETUNREACH: + return "WSAENETUNREACH"; + case WSAECONNABORTED: + return "WSAECONNABORTED"; + case WSAECONNRESET: + return "WSAECONNRESET"; + case WSAETIMEDOUT: + return "WSAETIMEDOUT"; + case WSAECONNREFUSED: + return "WSAECONNREFUSED"; + default: + break; + } + lws_snprintf(result, len, "wsaerrno %d", en); + + return result; +#endif +} + #if !defined(LWS_PLAT_FREERTOS) && !defined(LWS_PLAT_OPTEE) static int interface_to_sa(struct lws_vhost *vh, const char *ifname, @@ -58,7 +114,11 @@ lws_get_addresses(struct lws_vhost *vh, void *ads, char *name, if (!lws_plat_inet_ntop(AF_INET6, &((struct sockaddr_in6 *)ads)->sin6_addr, rip, (socklen_t)rip_len)) { - lwsl_vhost_err(vh, "inet_ntop: %s", strerror(LWS_ERRNO)); +#if !defined(LWS_WITH_NO_LOGS) + char t16[16]; + lwsl_vhost_err(vh, "inet_ntop: %s", + lws_errno_describe(LWS_ERRNO, t16, sizeof(t16))); +#endif return -1; } @@ -132,8 +192,10 @@ lws_get_peer_simple_fd(lws_sockfd_type fd, char *name, size_t namelen) socklen_t len = sizeof(sa46); if (getpeername(fd, (struct sockaddr *)&sa46, &len) < 0) { + char t16[16]; + lws_snprintf(name, namelen, "getpeername: %s", - strerror(LWS_ERRNO)); + lws_errno_describe(LWS_ERRNO, t16, sizeof(t16))); return name; } @@ -177,7 +239,12 @@ lws_get_peer_addresses(struct lws *wsi, lws_sockfd_type fd, char *name, } if (getpeername(fd, p, &len) < 0) { - lwsl_wsi_warn(wsi, "getpeername: %s", strerror(LWS_ERRNO)); +#if !defined(LWS_WITH_NO_LOGS) + char t16[16]; + + lwsl_wsi_warn(wsi, "getpeername: %s", + lws_errno_describe(LWS_ERRNO, t16, sizeof(t16))); +#endif goto bail; } @@ -318,17 +385,24 @@ lws_socket_bind(struct lws_vhost *vhost, struct lws *wsi, n = bind(sockfd, v, (socklen_t)n); #ifdef LWS_WITH_UNIX_SOCK if (n < 0 && af == AF_UNIX) { - lwsl_wsi_err(wsi, "ERROR on binding fd %d to \"%s\" (%d %d)", - sockfd, iface, n, LWS_ERRNO); - +#if !defined(LWS_WITH_NO_LOGS) + char t16[16]; + lwsl_wsi_err(wsi, "ERROR on binding fd %d to \"%s\" (%s)", + sockfd, iface, + lws_errno_describe(LWS_ERRNO, t16, sizeof(t16))); +#endif return LWS_ITOSA_NOT_EXIST; } else #endif if (n < 0) { int _lws_errno = LWS_ERRNO; +#if !defined(LWS_WITH_NO_LOGS) + char t16[16]; - lwsl_wsi_err(wsi, "ERROR on binding fd %d to port %d (%d %d)", - sockfd, port, n, _lws_errno); + lwsl_wsi_err(wsi, "ERROR on binding fd %d to port %d (%s)", + sockfd, port, + lws_errno_describe(_lws_errno, t16, sizeof(t16))); +#endif /* if something already listening, tell caller to fail permanently */ @@ -376,9 +450,14 @@ lws_socket_bind(struct lws_vhost *vhost, struct lws *wsi, #endif #ifndef LWS_PLAT_OPTEE - if (getsockname(sockfd, (struct sockaddr *)psin, &len) == -1) - lwsl_wsi_warn(wsi, "getsockname: %s", strerror(LWS_ERRNO)); - else + if (getsockname(sockfd, (struct sockaddr *)psin, &len) == -1) { +#if !defined(LWS_WITH_NO_LOGS) + char t16[16]; + + lwsl_wsi_warn(wsi, "getsockname: %s", + lws_errno_describe(LWS_ERRNO, t16, sizeof(t16))); +#endif + } else #endif #if defined(LWS_WITH_IPV6) port = (sin.ss_family == AF_INET6) ? diff --git a/lib/core-net/private-lib-core-net.h b/lib/core-net/private-lib-core-net.h index 6c9276baa..02c261058 100644 --- a/lib/core-net/private-lib-core-net.h +++ b/lib/core-net/private-lib-core-net.h @@ -1399,6 +1399,9 @@ lws_sort_dns(struct lws *wsi, const struct addrinfo *result); int lws_broadcast(struct lws_context_per_thread *pt, int reason, void *in, size_t len); +const char * +lws_errno_describe(int en, char *result, size_t len); + #if defined(LWS_WITH_PEER_LIMITS) void diff --git a/lib/plat/freertos/private-lib-plat-freertos.h b/lib/plat/freertos/private-lib-plat-freertos.h index d544e2b11..909859f31 100644 --- a/lib/plat/freertos/private-lib-plat-freertos.h +++ b/lib/plat/freertos/private-lib-plat-freertos.h @@ -46,10 +46,7 @@ #include #endif #include -#if defined(LWS_AMAZON_RTOS) -const char * -gai_strerror(int); -#else +#if !defined(LWS_AMAZON_RTOS) #include #endif diff --git a/lib/tls/openssl/openssl-tls.c b/lib/tls/openssl/openssl-tls.c index bdefd12c2..1a5c08da6 100644 --- a/lib/tls/openssl/openssl-tls.c +++ b/lib/tls/openssl/openssl-tls.c @@ -31,7 +31,11 @@ extern int openssl_websocket_private_data_index, static char openssl_ex_indexes_acquired; #endif -char* lws_ssl_get_error_string(int status, int ret, char *buf, size_t len) { +char * +lws_ssl_get_error_string(int status, int ret, char *buf, size_t len) +{ + char t16[16]; + switch (status) { case SSL_ERROR_NONE: return lws_strncpy(buf, "SSL_ERROR_NONE", len); @@ -53,12 +57,8 @@ char* lws_ssl_get_error_string(int status, int ret, char *buf, size_t len) { lws_snprintf(buf, len, "SSL_ERROR_SYSCALL: EOF"); return buf; case -1: -#ifndef LWS_PLAT_OPTEE lws_snprintf(buf, len, "SSL_ERROR_SYSCALL: %s", - strerror(errno)); -#else - lws_snprintf(buf, len, "SSL_ERROR_SYSCALL: %d", errno); -#endif + lws_errno_describe(LWS_ERRNO, t16, sizeof(t16))); return buf; default: return strncpy(buf, "SSL_ERROR_SYSCALL", len);