# HG changeset patch # User Piotr Sikora <[email protected]> # Date 1467064814 25200 # Mon Jun 27 15:00:14 2016 -0700 # Node ID be7eadea3d089f18c5ea685c09824ddcd99c3fe5 # Parent d452cb27639f714bc43b7f3ede417e3e7f8efdd6 Core: detect valid error numbers at run-time.
Strings for some error numbers might be omitted, at least on Linux, so stop after 3 unknown errors in a row and not after the first one. Signed-off-by: Piotr Sikora <[email protected]> diff -r d452cb27639f -r be7eadea3d08 auto/unix --- a/auto/unix +++ b/auto/unix @@ -697,60 +697,6 @@ ngx_feature_test="char buf[1]; struct io . auto/feature -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 - - -if [ $ngx_found = no ]; then - - # Cygiwn defines _sys_nerr - 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 - - # Solaris has no sys_nerr - ngx_feature='maximum errno' - ngx_feature_name=NGX_SYS_NERR - ngx_feature_run=value - ngx_feature_incs='#include <errno.h> - #include <string.h> - #include <stdio.h>' - ngx_feature_path= - ngx_feature_libs= - ngx_feature_test='int n; - char *p; - for (n = 1; n < 1000; n++) { - errno = 0; - p = strerror(n); - if (errno == EINVAL - || p == NULL - || strncmp(p, "Unknown error", 13) == 0) - { - break; - } - } - printf("%d", n);' - . auto/feature -fi - - ngx_feature="localtime_r()" ngx_feature_name="NGX_HAVE_LOCALTIME_R" ngx_feature_run=no diff -r d452cb27639f -r be7eadea3d08 src/os/unix/ngx_errno.c --- a/src/os/unix/ngx_errno.c +++ b/src/os/unix/ngx_errno.c @@ -26,6 +26,7 @@ static ngx_str_t *ngx_sys_errlist; +static ngx_err_t ngx_sys_errlist_n; static ngx_str_t ngx_unknown_error = ngx_string("Unknown error"); @@ -34,8 +35,8 @@ ngx_strerror(ngx_err_t err, u_char *errs { ngx_str_t *msg; - msg = ((ngx_uint_t) err < NGX_SYS_NERR) ? &ngx_sys_errlist[err]: - &ngx_unknown_error; + msg = (err < ngx_sys_errlist_n) ? &ngx_sys_errlist[err] + : &ngx_unknown_error; size = ngx_min(size, msg->len); return ngx_cpymem(errstr, msg->data, size); @@ -45,25 +46,58 @@ ngx_strerror(ngx_err_t err, u_char *errs ngx_int_t ngx_strerror_init(void) { - char *msg; - u_char *p; - size_t len; - ngx_err_t err; + char *msg; + u_char *p; + size_t len; + ngx_err_t err; + ngx_uint_t count; /* * ngx_strerror() is not ready to work at this stage, therefore, * malloc() is used and possible errors are logged using strerror(). */ - len = NGX_SYS_NERR * sizeof(ngx_str_t); + count = 0; + ngx_sys_errlist_n = 1000; + + for (err = 0; err < ngx_sys_errlist_n; err++) { + + errno = 0; + msg = strerror(err); + if (errno == EINVAL + || msg == NULL + || ngx_strncmp(msg, "Unknown error", 13) == 0) + { + if (++count > 2) { + ngx_sys_errlist_n = err - 2; + break; + } + + continue; + } + + count = 0; + } + + len = ngx_sys_errlist_n * sizeof(ngx_str_t); ngx_sys_errlist = malloc(len); if (ngx_sys_errlist == NULL) { goto failed; } - for (err = 0; err < NGX_SYS_NERR; err++) { + for (err = 0; err < ngx_sys_errlist_n; err++) { + + errno = 0; msg = strerror(err); + if (errno == EINVAL + || msg == NULL + || ngx_strncmp(msg, "Unknown error", 13) == 0) + { + ngx_sys_errlist[err] = ngx_unknown_error; + continue; + } + len = ngx_strlen(msg); p = malloc(len); _______________________________________________ nginx-devel mailing list [email protected] http://mailman.nginx.org/mailman/listinfo/nginx-devel
