1
0
Fork 0
mirror of https://github.com/warmcat/libwebsockets.git synced 2025-03-09 00:00:04 +01:00

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.
This commit is contained in:
Andy Green 2021-10-29 14:59:36 +01:00
parent c2ac541f43
commit 3f4800b88f
6 changed files with 145 additions and 48 deletions

View file

@ -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;

View file

@ -1,7 +1,7 @@
/*
* libwebsockets - small server side websockets and web server implementation
*
* Copyright (C) 2010 - 2020 Andy Green <andy@warmcat.com>
* Copyright (C) 2010 - 2021 Andy Green <andy@warmcat.com>
*
* 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)

View file

@ -25,6 +25,62 @@
#include "private-lib-core.h"
#include <errno.h>
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) ?

View file

@ -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

View file

@ -46,10 +46,7 @@
#include <errno.h>
#endif
#include <signal.h>
#if defined(LWS_AMAZON_RTOS)
const char *
gai_strerror(int);
#else
#if !defined(LWS_AMAZON_RTOS)
#include <sys/socket.h>
#endif

View file

@ -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);