aboutsummaryrefslogtreecommitdiff
path: root/src/os/unix
diff options
context:
space:
mode:
authorMaxim Dounin <mdounin@mdounin.ru>2021-03-01 20:00:45 +0300
committerMaxim Dounin <mdounin@mdounin.ru>2021-03-01 20:00:45 +0300
commit4c5a49ce4c756cee85b27f9fe501f52adc7b9f1f (patch)
tree64462c1dfeac0d11a10eea217d9d71ce0383874a /src/os/unix
parent71eb19da43e3382ce97a14b6d3cd564881da37e7 (diff)
downloadnginx-4c5a49ce4c756cee85b27f9fe501f52adc7b9f1f.tar.gz
nginx-4c5a49ce4c756cee85b27f9fe501f52adc7b9f1f.zip
Introduced strerrordesc_np() support.
The strerrordesc_np() function, introduced in glibc 2.32, provides an async-signal-safe way to obtain error messages. This makes it possible to avoid copying error messages.
Diffstat (limited to 'src/os/unix')
-rw-r--r--src/os/unix/ngx_errno.c46
1 files changed, 45 insertions, 1 deletions
diff --git a/src/os/unix/ngx_errno.c b/src/os/unix/ngx_errno.c
index b3303bf6f..ca23b2d3f 100644
--- a/src/os/unix/ngx_errno.c
+++ b/src/os/unix/ngx_errno.c
@@ -9,6 +9,49 @@
#include <ngx_core.h>
+static ngx_str_t ngx_unknown_error = ngx_string("Unknown error");
+
+
+#if (NGX_HAVE_STRERRORDESC_NP)
+
+/*
+ * The strerrordesc_np() function, introduced in glibc 2.32, is
+ * async-signal-safe. This makes it possible to use it directly,
+ * without copying error messages.
+ */
+
+
+u_char *
+ngx_strerror(ngx_err_t err, u_char *errstr, size_t size)
+{
+ size_t len;
+ const char *msg;
+
+ msg = strerrordesc_np(err);
+
+ if (msg == NULL) {
+ msg = (char *) ngx_unknown_error.data;
+ len = ngx_unknown_error.len;
+
+ } else {
+ len = ngx_strlen(msg);
+ }
+
+ size = ngx_min(size, len);
+
+ return ngx_cpymem(errstr, msg, size);
+}
+
+
+ngx_int_t
+ngx_strerror_init(void)
+{
+ return NGX_OK;
+}
+
+
+#else
+
/*
* The strerror() messages are copied because:
*
@@ -26,7 +69,6 @@
static ngx_str_t *ngx_sys_errlist;
-static ngx_str_t ngx_unknown_error = ngx_string("Unknown error");
static ngx_err_t ngx_first_error;
static ngx_err_t ngx_last_error;
@@ -164,3 +206,5 @@ failed:
return NGX_ERROR;
}
+
+#endif