From 264b8bdd5a418668ac81e82b5521f366d20f2304 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= Date: Wed, 30 Jul 2014 16:02:03 +0200 Subject: [PATCH] New patch for nginx Worked around the maximum errno issue with a specific implementation. --- www-servers/nginx/patches/nginx-1.7.4_hg.diff | 338 ++++++++++++++++++ 1 file changed, 338 insertions(+) create mode 100644 www-servers/nginx/patches/nginx-1.7.4_hg.diff diff --git a/www-servers/nginx/patches/nginx-1.7.4_hg.diff b/www-servers/nginx/patches/nginx-1.7.4_hg.diff new file mode 100644 index 000000000..6ae361579 --- /dev/null +++ b/www-servers/nginx/patches/nginx-1.7.4_hg.diff @@ -0,0 +1,338 @@ +diff -r 4d092aa2f463 auto/os/conf +--- a/auto/os/conf lun. juil. 28 12:27:57 2014 -0700 ++++ b/auto/os/conf mer. juil. 30 15:59:06 2014 +0200 +@@ -60,6 +60,24 @@ + CORE_SRCS="$UNIX_SRCS" + ;; + ++ Haiku:*) ++ # Haiku ++ have=NGX_HAIKU . auto/have_headers ++ CORE_INCS="$UNIX_INCS" ++ CORE_DEPS="$UNIX_DEPS $POSIX_DEPS" ++ CORE_SRCS="$UNIX_SRCS $HAIKU_SRCS" ++ CORE_LIBS="$CORE_LIBS -lnetwork" ++ NGX_PREFIX="${NGX_PREFIX:-`finddir B_SYSTEM_NONPACKAGED_DIRECTORY`}" ++ NGX_SBIN_PATH="${NGX_SBIN_PATH:-`finddir B_SYSTEM_NONPACKAGED_BIN_DIRECTORY`/nginx}" ++ # XXX: move those to auto/options? ++ NGX_CONF_PREFIX="`finddir B_SYSTEM_SETTINGS_DIRECTORY`" ++ NGX_CONF_PATH="$NGX_CONF_PREFIX/nginx.conf" ++ NGX_PID_PATH="`finddir B_COMMON_VAR_DIRECTORY`/nginx.pid" ++ NGX_LOCK_PATH="`finddir B_COMMON_VAR_DIRECTORY`/nginx.lock" ++ NGX_ERROR_LOG_PATH="`finddir B_SYSTEM_LOG_DIRECTORY`/error.log" ++ NGX_HTTP_LOG_PATH="`finddir B_SYSTEM_LOG_DIRECTORY`/access.log" ++ ;; ++ + *) + CORE_INCS="$UNIX_INCS" + CORE_DEPS="$UNIX_DEPS $POSIX_DEPS" +@@ -71,7 +89,7 @@ + + case "$NGX_MACHINE" in + +- i386 | i686 | i86pc) ++ i386 | i686 | i86pc | BePC) + have=NGX_HAVE_NONALIGNED . auto/have + NGX_MACH_CACHE_LINE=32 + ;; +diff -r 4d092aa2f463 auto/sources +--- a/auto/sources lun. juil. 28 12:27:57 2014 -0700 ++++ b/auto/sources mer. juil. 30 15:59:06 2014 +0200 +@@ -217,6 +217,9 @@ + DARWIN_SENDFILE_SRCS=src/os/unix/ngx_darwin_sendfile_chain.c + + ++HAIKU_SRCS=src/os/unix/ngx_haiku_errno.c ++ ++ + WIN32_INCS="$CORE_INCS $EVENT_INCS src/os/win32" + + WIN32_DEPS="$CORE_DEPS $EVENT_DEPS \ +diff -r 4d092aa2f463 auto/unix +--- a/auto/unix lun. juil. 28 12:27:57 2014 -0700 ++++ b/auto/unix mer. juil. 30 15:59:06 2014 +0200 +@@ -276,6 +276,18 @@ + fi + + ++ngx_feature="setpriority()" ++ngx_feature_name="NGX_HAVE_SETPRIORITY" ++ngx_feature_run=no ++ngx_feature_incs="#include ++ #include ++ #include " ++ngx_feature_path= ++ngx_feature_libs= ++ngx_feature_test="setpriority(PRIO_PROCESS, getpid(), 0)" ++. auto/feature ++ ++ + ngx_feature="sched_yield()" + ngx_feature_name="NGX_HAVE_SCHED_YIELD" + ngx_feature_run=no +diff -r 4d092aa2f463 src/os/unix/ngx_errno.c +--- a/src/os/unix/ngx_errno.c lun. juil. 28 12:27:57 2014 -0700 ++++ b/src/os/unix/ngx_errno.c mer. juil. 30 15:59:06 2014 +0200 +@@ -9,6 +9,7 @@ + #include + + ++#if !(NGX_HAIKU) + /* + * The strerror() messages are copied because: + * +@@ -85,3 +86,5 @@ + + return NGX_ERROR; + } ++ ++#endif +diff -r 4d092aa2f463 src/os/unix/ngx_haiku_errno.c +--- /dev/null jeu. janv. 01 00:00:00 1970 +0000 ++++ b/src/os/unix/ngx_haiku_errno.c mer. juil. 30 15:59:06 2014 +0200 +@@ -0,0 +1,158 @@ ++ ++/* ++ * Copyright (C) Igor Sysoev ++ * Copyright (C) Nginx, Inc. ++ */ ++ ++ ++#include ++#include ++ ++ ++/* ++ * The strerror() messages are copied because: ++ * ++ * 1) strerror() and strerror_r() functions are not Async-Signal-Safe, ++ * therefore, they cannot be used in signal handlers; ++ * ++ * 2) a direct sys_errlist[] array may be used instead of these functions, ++ * but Linux linker warns about its usage: ++ * ++ * warning: `sys_errlist' is deprecated; use `strerror' or `strerror_r' instead ++ * warning: `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead ++ * ++ * causing false bug reports. ++ * ++ * We avoid using an indexed array because: ++ * ++ * 1) on Haiku at least, errors are declared as negative numbers. ++ * ++ * 2) even though there is a posix_error_mapper static library ++ * on Haiku that works around this, the converted errors are ++ * around 0x7fff0000 anyway. ++ * ++ * 3) the POSIX error codes are not all defined as B_POSIX_ERROR_BASE + n ++ * on Haiku anyway. ++ */ ++ ++ ++typedef struct { ++ int error; ++ ngx_str_t str; ++} ngx_errmap_t; ++ ++static ngx_errmap_t ngx_sys_errmap[] = { ++/* ++ * This list should be kept in sync with src/os/unix/ngx_errno.h and ++ * is generated by: ++ ++awk 'BEGIN {d=0} ++/define NGX_/ {print "{ " $2 ", ngx_null_string },"} ++/#if .*_HAVE_/ {d=1;print $0} ++/#endif/ && d {d=0;print} ++' src/os/unix/ngx_errno.h | uniq ++ ++ */ ++{ NGX_EPERM, ngx_null_string }, ++{ NGX_ENOENT, ngx_null_string }, ++{ NGX_ENOPATH, ngx_null_string }, ++{ NGX_ESRCH, ngx_null_string }, ++{ NGX_EINTR, ngx_null_string }, ++{ NGX_ECHILD, ngx_null_string }, ++{ NGX_ENOMEM, ngx_null_string }, ++{ NGX_EACCES, ngx_null_string }, ++{ NGX_EBUSY, ngx_null_string }, ++{ NGX_EEXIST, ngx_null_string }, ++{ NGX_EXDEV, ngx_null_string }, ++{ NGX_ENOTDIR, ngx_null_string }, ++{ NGX_EISDIR, ngx_null_string }, ++{ NGX_EINVAL, ngx_null_string }, ++{ NGX_ENFILE, ngx_null_string }, ++{ NGX_EMFILE, ngx_null_string }, ++{ NGX_ENOSPC, ngx_null_string }, ++{ NGX_EPIPE, ngx_null_string }, ++{ NGX_EINPROGRESS, ngx_null_string }, ++{ NGX_ENOPROTOOPT, ngx_null_string }, ++{ NGX_EOPNOTSUPP, ngx_null_string }, ++{ NGX_EADDRINUSE, ngx_null_string }, ++{ NGX_ECONNABORTED, ngx_null_string }, ++{ NGX_ECONNRESET, ngx_null_string }, ++{ NGX_ENOTCONN, ngx_null_string }, ++{ NGX_ETIMEDOUT, ngx_null_string }, ++{ NGX_ECONNREFUSED, ngx_null_string }, ++{ NGX_ENAMETOOLONG, ngx_null_string }, ++{ NGX_ENETDOWN, ngx_null_string }, ++{ NGX_ENETUNREACH, ngx_null_string }, ++{ NGX_EHOSTDOWN, ngx_null_string }, ++{ NGX_EHOSTUNREACH, ngx_null_string }, ++{ NGX_ENOSYS, ngx_null_string }, ++{ NGX_ECANCELED, ngx_null_string }, ++{ NGX_EILSEQ, ngx_null_string }, ++{ NGX_ENOMOREFILES, ngx_null_string }, ++{ NGX_ELOOP, ngx_null_string }, ++{ NGX_EBADF, ngx_null_string }, ++#if (NGX_HAVE_OPENAT) ++{ NGX_EMLINK, ngx_null_string }, ++#endif ++{ NGX_EAGAIN, ngx_null_string }, ++{ 0, ngx_null_string } ++}; ++static ngx_str_t ngx_unknown_error = ngx_string("Unknown error"); ++ ++ ++u_char * ++ngx_strerror(ngx_err_t err, u_char *errstr, size_t size) ++{ ++ ngx_str_t *msg = &ngx_unknown_error; ++ int i; ++ ++ for (i = 0; ngx_sys_errmap[i].error != 0; i++) { ++ if (ngx_sys_errmap[i].error == err) { ++ msg = &ngx_sys_errmap[i].str; ++ break; ++ } ++ } ++ ++ size = ngx_min(size, msg->len); ++ ++ return ngx_cpymem(errstr, msg->data, size); ++} ++ ++ ++ngx_int_t ++ngx_strerror_init(void) ++{ ++ char *msg; ++ u_char *p; ++ size_t len; ++ ngx_err_t err; ++ int i; ++ ++ /* ++ * ngx_strerror() is not ready to work at this stage, therefore, ++ * malloc() is used and possible errors are logged using strerror(). ++ */ ++ ++ for (i = 0; ngx_sys_errmap[i].error != 0; i++) { ++ msg = strerror(ngx_sys_errmap[i].error); ++ len = ngx_strlen(msg); ++ ++ p = malloc(len); ++ if (p == NULL) { ++ goto failed; ++ } ++ ++ ngx_memcpy(p, msg, len); ++ ngx_sys_errmap[i].str.len = len; ++ ngx_sys_errmap[i].str.data = p; ++ } ++ ++ return NGX_OK; ++ ++failed: ++ ++ err = errno; ++ ngx_log_stderr(0, "malloc(%uz) failed (%d: %s)", len, err, strerror(err)); ++ ++ return NGX_ERROR; ++} +diff -r 4d092aa2f463 src/os/unix/ngx_process.c +--- a/src/os/unix/ngx_process.c lun. juil. 28 12:27:57 2014 -0700 ++++ b/src/os/unix/ngx_process.c mer. juil. 30 15:59:06 2014 +0200 +@@ -71,7 +71,9 @@ + + { SIGINT, "SIGINT", "", ngx_signal_handler }, + ++#ifdef SIGIO + { SIGIO, "SIGIO", "", ngx_signal_handler }, ++#endif + + { SIGCHLD, "SIGCHLD", "", ngx_signal_handler }, + +@@ -143,19 +145,23 @@ + } + + on = 1; ++#ifdef FIOASYNC + if (ioctl(ngx_processes[s].channel[0], FIOASYNC, &on) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "ioctl(FIOASYNC) failed while spawning \"%s\"", name); + ngx_close_channel(ngx_processes[s].channel, cycle->log); + return NGX_INVALID_PID; + } ++#endif + ++#ifdef F_SETOWN + if (fcntl(ngx_processes[s].channel[0], F_SETOWN, ngx_pid) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "fcntl(F_SETOWN) failed while spawning \"%s\"", name); + ngx_close_channel(ngx_processes[s].channel, cycle->log); + return NGX_INVALID_PID; + } ++#endif + + if (fcntl(ngx_processes[s].channel[0], F_SETFD, FD_CLOEXEC) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, +@@ -385,9 +391,11 @@ + ngx_sigalrm = 1; + break; + ++#ifdef SIGIO + case SIGIO: + ngx_sigio = 1; + break; ++#endif + + case SIGCHLD: + ngx_reap = 1; +@@ -423,7 +431,9 @@ + + case ngx_signal_value(NGX_RECONFIGURE_SIGNAL): + case ngx_signal_value(NGX_CHANGEBIN_SIGNAL): ++#ifdef SIGIO + case SIGIO: ++#endif + action = ", ignoring"; + break; + } +diff -r 4d092aa2f463 src/os/unix/ngx_process_cycle.c +--- a/src/os/unix/ngx_process_cycle.c lun. juil. 28 12:27:57 2014 -0700 ++++ b/src/os/unix/ngx_process_cycle.c mer. juil. 30 15:59:06 2014 +0200 +@@ -97,7 +97,9 @@ + sigemptyset(&set); + sigaddset(&set, SIGCHLD); + sigaddset(&set, SIGALRM); ++#ifdef SIGIO + sigaddset(&set, SIGIO); ++#endif + sigaddset(&set, SIGINT); + sigaddset(&set, ngx_signal_value(NGX_RECONFIGURE_SIGNAL)); + sigaddset(&set, ngx_signal_value(NGX_REOPEN_SIGNAL)); +@@ -862,12 +864,14 @@ + + ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); + ++#if (NGX_HAVE_SETPRIORITY) + if (worker >= 0 && ccf->priority != 0) { + if (setpriority(PRIO_PROCESS, 0, ccf->priority) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "setpriority(%d) failed", ccf->priority); + } + } ++#endif + + if (ccf->rlimit_nofile != NGX_CONF_UNSET) { + rlmt.rlim_cur = (rlim_t) ccf->rlimit_nofile;