mirror of
https://github.com/nginx/nginx.git
synced 2025-07-25 22:56:59 +08:00
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.
This commit is contained in:
parent
71eb19da43
commit
4c5a49ce4c
28
auto/unix
28
auto/unix
@ -727,17 +727,33 @@ ngx_feature_test="char buf[1]; struct iovec vec[1]; ssize_t n;
|
|||||||
. auto/feature
|
. auto/feature
|
||||||
|
|
||||||
|
|
||||||
ngx_feature="sys_nerr"
|
# strerrordesc_np(), introduced in glibc 2.32
|
||||||
ngx_feature_name="NGX_SYS_NERR"
|
|
||||||
ngx_feature_run=value
|
ngx_feature="strerrordesc_np()"
|
||||||
ngx_feature_incs='#include <errno.h>
|
ngx_feature_name="NGX_HAVE_STRERRORDESC_NP"
|
||||||
#include <stdio.h>'
|
ngx_feature_run=no
|
||||||
|
ngx_feature_incs='#include <string.h>'
|
||||||
ngx_feature_path=
|
ngx_feature_path=
|
||||||
ngx_feature_libs=
|
ngx_feature_libs=
|
||||||
ngx_feature_test='printf("%d", sys_nerr);'
|
ngx_feature_test="char *p; p = strerrordesc_np(0);
|
||||||
|
if (p == NULL) return 1"
|
||||||
. auto/feature
|
. auto/feature
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
ngx_feature="sys_nerr"
|
||||||
|
ngx_feature_name="NGX_SYS_NERR"
|
||||||
|
ngx_feature_run=value
|
||||||
|
ngx_feature_incs='#include <errno.h>
|
||||||
|
#include <stdio.h>'
|
||||||
|
ngx_feature_path=
|
||||||
|
ngx_feature_libs=
|
||||||
|
ngx_feature_test='printf("%d", sys_nerr);'
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
if [ $ngx_found = no ]; then
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
# Cygiwn defines _sys_nerr
|
# Cygiwn defines _sys_nerr
|
||||||
|
@ -9,6 +9,49 @@
|
|||||||
#include <ngx_core.h>
|
#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:
|
* The strerror() messages are copied because:
|
||||||
*
|
*
|
||||||
@ -26,7 +69,6 @@
|
|||||||
|
|
||||||
|
|
||||||
static ngx_str_t *ngx_sys_errlist;
|
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_first_error;
|
||||||
static ngx_err_t ngx_last_error;
|
static ngx_err_t ngx_last_error;
|
||||||
|
|
||||||
@ -164,3 +206,5 @@ failed:
|
|||||||
|
|
||||||
return NGX_ERROR;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user