From 3f4800b88f7f7265104812e6b2ace3705130f913 Mon Sep 17 00:00:00 2001 From: Andy Green Date: Fri, 29 Oct 2021 14:59:36 +0100 Subject: [PATCH] log: cherrypick common errno to be strings Pick some common errno constants for the platform and provide strings for them. Replace numeric errno logging with the new api for client. Replace any usage of strerror() in network code with the new api. For constrained devices, this should give a small saving on .rodata. Leave some usages in daemonize.c and unix plat where the size isn't going to matter. --- lib/core-net/adopt.c | 10 +- lib/core-net/client/connect3.c | 62 +++++++---- lib/core-net/network.c | 101 ++++++++++++++++-- lib/core-net/private-lib-core-net.h | 3 + lib/plat/freertos/private-lib-plat-freertos.h | 5 +- lib/tls/openssl/openssl-tls.c | 12 +-- 6 files changed, 145 insertions(+), 48 deletions(-) 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);