changeset 232:d8f5c91a5c07 NGINX_0_4_1

nginx 0.4.1 *) Bugfix: the DragonFlyBSD compatibility. Thanks to Pavel Nazarov. *) Workaround: of bug in 64-bit Linux sendfile(), when file is more than 2G. *) Feature: now on Linux nginx uses O_NOATIME flag for static requests. Thanks to Yusuf Goolamabbas.
author Igor Sysoev <http://sysoev.ru>
date Thu, 14 Sep 2006 00:00:00 +0400
parents 8024b0d52263
children 56741fe3ea3b
files CHANGES CHANGES.ru auto/os/conf auto/os/freebsd src/core/nginx.h src/http/modules/ngx_http_index_module.c src/http/modules/ngx_http_static_module.c src/http/ngx_http_parse_time.c src/http/ngx_http_special_response.c-C src/http/ngx_http_special_response.c.rej src/os/unix/ngx_files.h src/os/unix/ngx_linux_sendfile_chain.c
diffstat 12 files changed, 63 insertions(+), 581 deletions(-) [+]
line wrap: on
line diff
--- a/CHANGES
+++ b/CHANGES
@@ -1,4 +1,17 @@
 
+Changes with nginx 0.4.1                                         14 Sep 2006
+
+    *) Bugfix: the DragonFlyBSD compatibility.
+       Thanks to Pavel Nazarov.
+
+    *) Workaround: of bug in 64-bit Linux sendfile(), when file is more 
+       than 2G.
+
+    *) Feature: now on Linux nginx uses O_NOATIME flag for static 
+       requests.
+       Thanks to Yusuf Goolamabbas.
+
+
 Changes with nginx 0.4.0                                         30 Aug 2006
 
     *) Change in internal API: the HTTP modules initialization was moved 
--- a/CHANGES.ru
+++ b/CHANGES.ru
@@ -1,4 +1,17 @@
 
+Изменения в nginx 0.4.1                                           14.09.2006
+
+    *) Исправление: совместимость с DragonFlyBSD.
+       Спасибо Павлу Назарову.
+
+    *) Изменение: обход ошибки в sendfile() в 64-битном Linux при передаче 
+       файлов больше 2G.
+
+    *) Добавление: теперь на Linux nginx для статических запросов 
+       использует флаг O_NOATIME.
+       Спасибо Yusuf Goolamabbas.
+
+
 Изменения в nginx 0.4.0                                           30.08.2006
 
     *) Изменение во внутреннем API: инициализация модулей HTTP перенесена 
--- a/auto/os/conf
+++ b/auto/os/conf
@@ -6,7 +6,7 @@ echo "checking for $NGX_SYSTEM specific 
 
 case "$NGX_PLATFORM" in
 
-    FreeBSD:* | DragonFly:*)
+    FreeBSD:*)
         . auto/os/freebsd
     ;;
 
@@ -22,6 +22,20 @@ case "$NGX_PLATFORM" in
         . auto/os/win32
     ;;
 
+    DragonFly:*)
+        have=NGX_FREEBSD . auto/have_headers
+        CORE_INCS="$UNIX_INCS"
+        CORE_DEPS="$UNIX_DEPS $FREEBSD_DEPS"
+        CORE_SRCS="$UNIX_SRCS $FREEBSD_SRCS"
+
+        echo " + sendfile() found"
+        have=NGX_HAVE_SENDFILE . auto/have
+        CORE_SRCS="$CORE_SRCS $FREEBSD_SENDFILE_SRCS"
+
+        ngx_spacer='
+'
+    ;;
+
     Darwin:*)
         have=NGX_DARWIN . auto/have_headers
         have=NGX_HAVE_INHERITED_NONBLOCK . auto/have
--- a/auto/os/freebsd
+++ b/auto/os/freebsd
@@ -14,7 +14,7 @@ ngx_spacer='
 
 # __FreeBSD_version and sysctl kern.osreldate are the best ways
 # to determine whether some capability exists and is safe to use.
-# __FreeBSD_version is used for the testing of the build enviroment.
+# __FreeBSD_version is used for the testing of the build environment.
 # sysctl kern.osreldate is used for the testing of the kernel capabilities.
 
 version=`grep "#define __FreeBSD_version" /usr/include/osreldate.h \
--- a/src/core/nginx.h
+++ b/src/core/nginx.h
@@ -8,7 +8,7 @@
 #define _NGINX_H_INCLUDED_
 
 
-#define NGINX_VER          "nginx/0.4.0"
+#define NGINX_VER          "nginx/0.4.1"
 
 #define NGINX_VAR          "NGINX"
 #define NGX_OLDPID_EXT     ".oldbin"
--- a/src/http/modules/ngx_http_index_module.c
+++ b/src/http/modules/ngx_http_index_module.c
@@ -239,7 +239,8 @@ ngx_http_index_handler(ngx_http_request_
             return NGX_HTTP_INTERNAL_SERVER_ERROR;
         }
 
-        fd = ngx_open_file(ctx->path.data, NGX_FILE_RDONLY, NGX_FILE_OPEN);
+        fd = ngx_open_file(ctx->path.data, NGX_FILE_RDONLY|NGX_FILE_NOATIME,
+                           NGX_FILE_OPEN);
 
         if (fd == (ngx_fd_t) NGX_AGAIN) {
             ctx->current = i;
--- a/src/http/modules/ngx_http_static_module.c
+++ b/src/http/modules/ngx_http_static_module.c
@@ -125,7 +125,8 @@ ngx_http_static_handler(ngx_http_request
         return NGX_HTTP_INTERNAL_SERVER_ERROR;
     }
 
-    fd = ngx_open_file(path.data, NGX_FILE_RDONLY, NGX_FILE_OPEN);
+    fd = ngx_open_file(path.data, NGX_FILE_RDONLY|NGX_FILE_NOATIME,
+                       NGX_FILE_OPEN);
 
     if (fd == NGX_INVALID_FILE) {
         err = ngx_errno;
--- a/src/http/ngx_http_parse_time.c
+++ b/src/http/ngx_http_parse_time.c
@@ -17,7 +17,7 @@ time_t ngx_http_parse_time(u_char *value
     int      day, month, year, hour, min, sec;
     enum {
         no = 0,
-        rfc822,   /* Tue 10 Nov 2002 23:50:13    */
+        rfc822,   /* Tue, 10 Nov 2002 23:50:13   */
         rfc850,   /* Tuesday, 10-Dec-02 23:50:13 */
         isoc      /* Tue Dec 10 23:50:13 2002    */
     } fmt;
deleted file mode 100644
--- a/src/http/ngx_http_special_response.c-C
+++ /dev/null
@@ -1,548 +0,0 @@
-
-/*
- * Copyright (C) Igor Sysoev
- */
-
-
-#include <ngx_config.h>
-#include <ngx_core.h>
-#include <ngx_http.h>
-#include <nginx.h>
-
-
-static u_char error_tail[] =
-"<hr><center>" NGINX_VER "</center>" CRLF
-"</body>" CRLF
-"</html>" CRLF
-;
-
-
-static u_char ngx_http_msie_stub[] =
-"<!-- The padding to disable MSIE's friendly error page -->" CRLF
-"<!-- The padding to disable MSIE's friendly error page -->" CRLF
-"<!-- The padding to disable MSIE's friendly error page -->" CRLF
-"<!-- The padding to disable MSIE's friendly error page -->" CRLF
-"<!-- The padding to disable MSIE's friendly error page -->" CRLF
-"<!-- The padding to disable MSIE's friendly error page -->" CRLF
-;
-
-
-static char error_301_page[] =
-"<html>" CRLF
-"<head><title>301 Moved Permanently</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>301 Moved Permanently</h1></center>" CRLF
-;
-
-
-static char error_302_page[] =
-"<html>" CRLF
-"<head><title>302 Found</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>302 Found</h1></center>" CRLF
-;
-
-
-static char error_400_page[] =
-"<html>" CRLF
-"<head><title>400 Bad Request</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>400 Bad Request</h1></center>" CRLF
-;
-
-
-static char error_401_page[] =
-"<html>" CRLF
-"<head><title>401 Authorization Required</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>401 Authorization Required</h1></center>" CRLF
-;
-
-
-static char error_402_page[] =
-"<html>" CRLF
-"<head><title>402 Payment Required</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>402 Payment Required</h1></center>" CRLF
-;
-
-
-static char error_403_page[] =
-"<html>" CRLF
-"<head><title>403 Forbidden</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>403 Forbidden</h1></center>" CRLF
-;
-
-
-static char error_404_page[] =
-"<html>" CRLF
-"<head><title>404 Not Found</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>404 Not Found</h1></center>" CRLF
-;
-
-
-static char error_405_page[] =
-"<html>" CRLF
-"<head><title>405 Not Allowed</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>405 Not Allowed</h1></center>" CRLF
-;
-
-
-static char error_406_page[] =
-"<html>" CRLF
-"<head><title>406 Not Acceptable</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>406 Not Acceptable</h1></center>" CRLF
-;
-
-
-static char error_408_page[] =
-"<html>" CRLF
-"<head><title>408 Request Time-out</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>408 Request Time-out</h1></center>" CRLF
-;
-
-
-static char error_409_page[] =
-"<html>" CRLF
-"<head><title>409 Conflict</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>409 Conflict</h1></center>" CRLF
-;
-
-
-static char error_410_page[] =
-"<html>" CRLF
-"<head><title>410 Gone</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>410 Gone</h1></center>" CRLF
-;
-
-
-static char error_411_page[] =
-"<html>" CRLF
-"<head><title>411 Length Required</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>411 Length Required</h1></center>" CRLF
-;
-
-
-static char error_413_page[] =
-"<html>" CRLF
-"<head><title>413 Request Entity Too Large</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>413 Request Entity Too Large</h1></center>" CRLF
-;
-
-
-static char error_414_page[] =
-"<html>" CRLF
-"<head><title>414 Request-URI Too Large</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>414 Request-URI Too Large</h1></center>" CRLF
-;
-
-
-static char error_415_page[] =
-"<html>" CRLF
-"<head><title>415 Unsupported Media Type</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>415 Unsupported Media Type</h1></center>" CRLF
-;
-
-
-static char error_416_page[] =
-"<html>" CRLF
-"<head><title>416 Requested Range Not Satisfiable</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>416 Requested Range Not Satisfiable</h1></center>" CRLF
-;
-
-
-static char error_495_page[] =
-"<html>" CRLF
-"<head><title>400 The SSL certificate error</title></head>"
-CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>400 Bad Request</h1></center>" CRLF
-"<center>The SSL certificate error</center>" CRLF
-;
-
-
-static char error_496_page[] =
-"<html>" CRLF
-"<head><title>400 No required SSL certificate was sent</title></head>"
-CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>400 Bad Request</h1></center>" CRLF
-"<center>No required SSL certificate was sent</center>" CRLF
-;
-
-
-static char error_497_page[] =
-"<html>" CRLF
-"<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>"
-CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>400 Bad Request</h1></center>" CRLF
-"<center>The plain HTTP request was sent to HTTPS port</center>" CRLF
-;
-
-
-static char error_500_page[] =
-"<html>" CRLF
-"<head><title>500 Internal Server Error</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>500 Internal Server Error</h1></center>" CRLF
-;
-
-
-static char error_501_page[] =
-"<html>" CRLF
-"<head><title>501 Method Not Implemented</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>501 Method Not Implemented</h1></center>" CRLF
-;
-
-
-static char error_502_page[] =
-"<html>" CRLF
-"<head><title>502 Bad Gateway</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>502 Bad Gateway</h1></center>" CRLF
-;
-
-
-static char error_503_page[] =
-"<html>" CRLF
-"<head><title>503 Service Temporarily Unavailable</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>503 Service Temporarily Unavailable</h1></center>" CRLF
-;
-
-
-static char error_504_page[] =
-"<html>" CRLF
-"<head><title>504 Gateway Time-out</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>504 Gateway Time-out</h1></center>" CRLF
-;
-
-
-static char error_507_page[] =
-"<html>" CRLF
-"<head><title>507 Insufficient Storage</title></head>" CRLF
-"<body bgcolor=\"white\">" CRLF
-"<center><h1>507 Insufficient Storage</h1></center>" CRLF
-;
-
-
-static ngx_str_t error_pages[] = {
-
-    ngx_null_string,             /* 201, 204 */
-
-#define NGX_HTTP_LEVEL_200  1
-
-    /* ngx_null_string, */       /* 300 */
-    ngx_string(error_301_page),
-    ngx_string(error_302_page),
-    ngx_null_string,             /* 303 */
-
-#define NGX_HTTP_LEVEL_300  3
-
-    ngx_string(error_400_page),
-    ngx_string(error_401_page),
-    ngx_string(error_402_page),
-    ngx_string(error_403_page),
-    ngx_string(error_404_page),
-    ngx_string(error_405_page),
-    ngx_string(error_406_page),
-    ngx_null_string,             /* 407 */
-    ngx_string(error_408_page),
-    ngx_string(error_409_page),
-    ngx_string(error_410_page),
-    ngx_string(error_411_page),
-    ngx_null_string,             /* 412 */
-    ngx_string(error_413_page),
-    ngx_string(error_414_page),
-    ngx_string(error_415_page),
-    ngx_string(error_416_page),
-
-#define NGX_HTTP_LEVEL_400  17
-
-    ngx_string(error_495_page),  /* 495, https certificate error */
-    ngx_string(error_496_page),  /* 496, https no certificate */
-    ngx_string(error_497_page),  /* 497, http to https */
-    ngx_string(error_404_page),  /* 498, invalid host name */
-    ngx_null_string,             /* 499, client had closed connection */
-
-    ngx_string(error_500_page),
-    ngx_string(error_501_page),
-    ngx_string(error_502_page),
-    ngx_string(error_503_page),
-    ngx_string(error_504_page),
-    ngx_null_string,             /* 505 */
-    ngx_null_string,             /* 506 */
-    ngx_string(error_507_page)
-};
-
-
-ngx_int_t
-ngx_http_special_response_handler(ngx_http_request_t *r, ngx_int_t error)
-{
-    ngx_int_t                  rc;
-    ngx_buf_t                 *b;
-    ngx_str_t                 *uri;
-    ngx_uint_t                 i, n, err, msie_padding;
-    ngx_chain_t               *out, *cl;
-    ngx_http_err_page_t       *err_page;
-    ngx_http_core_loc_conf_t  *clcf;
-
-    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                   "http special response: %d, \"%V\"", error, &r->uri);
-
-    rc = ngx_http_discard_body(r);
-
-    if (rc == NGX_HTTP_INTERNAL_SERVER_ERROR) {
-        error = NGX_HTTP_INTERNAL_SERVER_ERROR;
-    }
-
-    r->headers_out.status = error;
-    r->err_status = error;
-
-    if (r->keepalive != 0) {
-        switch (error) {
-            case NGX_HTTP_BAD_REQUEST:
-            case NGX_HTTP_REQUEST_ENTITY_TOO_LARGE:
-            case NGX_HTTP_REQUEST_URI_TOO_LARGE:
-            case NGX_HTTP_TO_HTTPS:
-            case NGX_HTTPS_CERT_ERROR:
-            case NGX_HTTPS_NO_CERT:
-            case NGX_HTTP_INTERNAL_SERVER_ERROR:
-                r->keepalive = 0;
-        }
-    }
-
-    if (r->lingering_close == 1) {
-        switch (error) {
-            case NGX_HTTP_BAD_REQUEST:
-            case NGX_HTTP_TO_HTTPS:
-            case NGX_HTTPS_CERT_ERROR:
-            case NGX_HTTPS_NO_CERT:
-                r->lingering_close = 0;
-        }
-    }
-
-    r->headers_out.content_type.len = 0;
-
-    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
-
-    if (!r->error_page && clcf->error_pages) {
-
-        if (clcf->recursive_error_pages == 0) {
-            r->error_page = 1;
-        }
-
-        err_page = clcf->error_pages->elts;
-
-        for (i = 0; i < clcf->error_pages->nelts; i++) {
-
-            if (err_page[i].status == error) {
-                r->err_status = err_page[i].overwrite;
-
-                r->method = NGX_HTTP_GET;
-
-                uri = &err_page[i].uri;
-
-                if (err_page[i].uri_lengths) {
-                    if (ngx_http_script_run(r, uri,
-                                            err_page[i].uri_lengths->elts, 0,
-                                            err_page[i].uri_values->elts)
-                        == NULL)
-                    {
-                        return NGX_ERROR;
-                    }
-
-                    if (r->zero_in_uri) {
-                        for (n = 0; n < uri->len; n++) {
-                            if (uri->data[n] == '\0') {
-                                goto zero;
-                            }
-                        }
-
-                        r->zero_in_uri = 0;
-                    }
-
-                } else {
-                    r->zero_in_uri = 0;
-                }
-
-            zero:
-
-                if (uri->data[0] == '/') {
-                    return ngx_http_internal_redirect(r, uri, NULL);
-                }
-
-                r->headers_out.location =
-                                        ngx_list_push(&r->headers_out.headers);
-
-                if (r->headers_out.location) {
-                    error = NGX_HTTP_MOVED_TEMPORARILY;
-
-                    r->err_status = NGX_HTTP_MOVED_TEMPORARILY;
-
-                    r->headers_out.location->hash = 1;
-                    r->headers_out.location->key.len = sizeof("Location") - 1;
-                    r->headers_out.location->key.data = (u_char *) "Location";
-                    r->headers_out.location->value = *uri;
-
-                } else {
-                    return NGX_ERROR;
-                }
-            }
-        }
-    }
-
-    if (error == NGX_HTTP_CREATED) {
-        /* 201 */
-        err = 0;
-        r->header_only = 1;
-
-    } else if (error == NGX_HTTP_NO_CONTENT) {
-        /* 204 */
-        err = 0;
-
-    } else if (error < NGX_HTTP_BAD_REQUEST) {
-        /* 3XX */
-        err = error - NGX_HTTP_MOVED_PERMANENTLY + NGX_HTTP_LEVEL_200;
-
-    } else if (error < NGX_HTTP_OWN_CODES) {
-        /* 4XX */
-        err = error - NGX_HTTP_BAD_REQUEST + NGX_HTTP_LEVEL_200
-                                           + NGX_HTTP_LEVEL_300;
-
-    } else {
-        /* 49X, 5XX */
-        err = error - NGX_HTTP_OWN_CODES + NGX_HTTP_LEVEL_200
-                                         + NGX_HTTP_LEVEL_300
-                                         + NGX_HTTP_LEVEL_400;
-        switch (error) {
-            case NGX_HTTP_TO_HTTPS:
-            case NGX_HTTPS_CERT_ERROR:
-            case NGX_HTTPS_NO_CERT:
-                r->headers_out.status = NGX_HTTP_BAD_REQUEST;
-                error = NGX_HTTP_BAD_REQUEST;
-                break;
-        }
-    }
-
-    msie_padding = 0;
-
-    if (error_pages[err].len) {
-        r->headers_out.content_length_n = error_pages[err].len
-                                          + sizeof(error_tail) - 1;
-
-        if (clcf->msie_padding
-            && r->headers_in.msie
-            && r->http_version >= NGX_HTTP_VERSION_10
-            && error >= NGX_HTTP_BAD_REQUEST
-            && error != NGX_HTTP_REQUEST_URI_TOO_LARGE)
-        {
-            r->headers_out.content_length_n += sizeof(ngx_http_msie_stub) - 1;
-            msie_padding = 1;
-        }
-
-        r->headers_out.content_type.len = sizeof("text/html") - 1;
-        r->headers_out.content_type.data = (u_char *) "text/html";
-
-    } else {
-        r->headers_out.content_length_n = -1;
-    }
-
-    if (r->headers_out.content_length) {
-        r->headers_out.content_length->hash = 0;
-        r->headers_out.content_length = NULL;
-    }
-
-    ngx_http_clear_accept_ranges(r);
-    ngx_http_clear_last_modified(r);
-
-    rc = ngx_http_send_header(r);
-
-    if (rc == NGX_ERROR || r->header_only) {
-        return rc;
-    }
-
-    if (error_pages[err].len == 0) {
-        return NGX_OK;
-    }
-
-
-    b = ngx_calloc_buf(r->pool);
-    if (b == NULL) {
-        return NGX_ERROR;
-    }
-
-    b->memory = 1;
-    b->pos = error_pages[err].data;
-    b->last = error_pages[err].data + error_pages[err].len;
-
-    cl = ngx_alloc_chain_link(r->pool);
-    if (cl == NULL) {
-        return NGX_ERROR;
-    }
-
-    cl->buf = b;
-    out = cl;
-
-
-    b = ngx_calloc_buf(r->pool);
-    if (b == NULL) {
-        return NGX_ERROR;
-    }
-
-    b->memory = 1;
-    b->pos = error_tail;
-    b->last = error_tail + sizeof(error_tail) - 1;
-
-    cl->next = ngx_alloc_chain_link(r->pool);
-    if (cl->next == NULL) {
-        return NGX_ERROR;
-    }
-
-    cl = cl->next;
-    cl->buf = b;
-
-    if (msie_padding) {
-        b = ngx_calloc_buf(r->pool);
-        if (b == NULL) {
-            return NGX_ERROR;
-        }
-
-        b->memory = 1;
-        b->pos = ngx_http_msie_stub;
-        b->last = ngx_http_msie_stub + sizeof(ngx_http_msie_stub) - 1;
-
-        cl->next = ngx_alloc_chain_link(r->pool);
-        if (cl->next == NULL) {
-            return NGX_ERROR;
-        }
-
-        cl = cl->next;
-        cl->buf = b;
-    }
-
-    if (r == r->main) {
-        b->last_buf = 1;
-    }
-
-    b->last_in_chain = 1;
-
-    cl->next = NULL;
-
-    return ngx_http_output_filter(r, out);
-}
deleted file mode 100644
--- a/src/http/ngx_http_special_response.c.rej
+++ /dev/null
@@ -1,23 +0,0 @@
-***************
-*** 294,302 ****
-  ngx_int_t
-  ngx_http_special_response_handler(ngx_http_request_t *r, ngx_int_t error)
-  {
-      ngx_int_t                  rc;
-      ngx_buf_t                 *b;
--     ngx_str_t                 *uri;
-      ngx_uint_t                 i, err, msie_padding;
-      ngx_chain_t               *out, *cl;
-      ngx_http_err_page_t       *err_page;
---- 302,312 ----
-  ngx_int_t
-  ngx_http_special_response_handler(ngx_http_request_t *r, ngx_int_t error)
-  {
-+     u_char                    *p;
-+     size_t                     msie_refresh;
-      ngx_int_t                  rc;
-      ngx_buf_t                 *b;
-+     ngx_str_t                 *uri, *location;
-      ngx_uint_t                 i, err, msie_padding;
-      ngx_chain_t               *out, *cl;
-      ngx_http_err_page_t       *err_page;
--- a/src/os/unix/ngx_files.h
+++ b/src/os/unix/ngx_files.h
@@ -28,6 +28,11 @@
 #define NGX_FILE_TRUNCATE        O_TRUNC
 #define NGX_FILE_APPEND          O_APPEND
 
+#ifdef O_NOATIME
+#define NGX_FILE_NOATIME         O_NOATIME
+#else
+#define NGX_FILE_NOATIME         0
+#endif
 
 #define ngx_close_file           close
 #define ngx_close_file_n         "close()"
--- a/src/os/unix/ngx_linux_sendfile_chain.c
+++ b/src/os/unix/ngx_linux_sendfile_chain.c
@@ -16,9 +16,15 @@
  * parameter is int32_t, and use sendfile() for the file parts below 2G only,
  * see src/os/unix/ngx_linux_config.h
  *
- * Linux 2.4.21 has a new sendfile64() syscall #239.
+ * Linux 2.4.21 has the new sendfile64() syscall #239.
+ *
+ * On Linux up to 2.6.16 sendfile() does not allow to pass the count parameter
+ * more than 2G-1 bytes even on 64-bit platforms: it returns EINVAL,
+ * so we limit it to 2G-1 bytes.
  */
 
+#define NGX_SENDFILE_LIMIT  2147483647L
+
 
 #if (IOV_MAX > 64)
 #define NGX_HEADERS  64
@@ -54,10 +60,10 @@ ngx_linux_sendfile_chain(ngx_connection_
     }
 
 
-    /* the maximum limit size is the maximum size_t value - the page size */
+    /* the maximum limit size is 2G-1 - the page size */
 
-    if (limit == 0 || limit > NGX_MAX_SIZE_T_VALUE - ngx_pagesize) {
-        limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize;
+    if (limit == 0 || limit > NGX_SENDFILE_LIMIT - ngx_pagesize) {
+        limit = NGX_SENDFILE_LIMIT - ngx_pagesize;
     }