nginx-0.1.8-RELEASE import
*) Bugfix: in the ngx_http_autoindex_module if the long file names were
in the listing.
*) Feature: the "^~" modifier in the location directive.
*) Feature: the proxy_max_temp_file_size directive.
diff --git a/src/core/nginx.h b/src/core/nginx.h
index 529c43d..5f2339b 100644
--- a/src/core/nginx.h
+++ b/src/core/nginx.h
@@ -8,7 +8,7 @@
#define _NGINX_H_INCLUDED_
-#define NGINX_VER "nginx/0.1.7"
+#define NGINX_VER "nginx/0.1.8"
#define NGINX_VAR "NGINX"
#define NGX_NEWPID_EXT ".newbin"
diff --git a/src/core/ngx_array.h b/src/core/ngx_array.h
index 826395d..931c7fb 100644
--- a/src/core/ngx_array.h
+++ b/src/core/ngx_array.h
@@ -26,7 +26,7 @@
void *ngx_push_array(ngx_array_t *a);
-ngx_inline static ngx_int_t ngx_array_init(ngx_array_t *array, ngx_pool_t *pool,
+static ngx_inline ngx_int_t ngx_array_init(ngx_array_t *array, ngx_pool_t *pool,
ngx_uint_t n, size_t size)
{
if (!(array->elts = ngx_palloc(pool, n * size))) {
diff --git a/src/core/ngx_config.h b/src/core/ngx_config.h
index 9faf00a..43fd985 100644
--- a/src/core/ngx_config.h
+++ b/src/core/ngx_config.h
@@ -109,7 +109,7 @@
/* TODO: auto_conf: ngx_inline inline __inline __inline__ */
#ifndef ngx_inline
-#define ngx_inline inline
+#define ngx_inline __inline
#endif
#define NGX_ACCEPT_THRESHOLD 100
diff --git a/src/core/ngx_connection.c b/src/core/ngx_connection.c
index 06fd85c..631cd4f 100644
--- a/src/core/ngx_connection.c
+++ b/src/core/ngx_connection.c
@@ -299,7 +299,7 @@
}
}
- if (ngx_close_socket(ls[i].fd) == -1) {
+ if (ngx_close_socket(fd) == -1) {
ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,
ngx_close_socket_n " %V failed", &ls[i].addr_text);
}
diff --git a/src/core/ngx_crc.h b/src/core/ngx_crc.h
index b78f479..73f4cdd 100644
--- a/src/core/ngx_crc.h
+++ b/src/core/ngx_crc.h
@@ -10,7 +10,7 @@
/* 32-bit crc16 */
-ngx_inline static uint32_t ngx_crc(char *data, size_t len)
+static ngx_inline uint32_t ngx_crc(char *data, size_t len)
{
uint32_t sum;
diff --git a/src/core/ngx_cycle.c b/src/core/ngx_cycle.c
index 85d9458..d91ba85 100644
--- a/src/core/ngx_cycle.c
+++ b/src/core/ngx_cycle.c
@@ -49,6 +49,8 @@
ngx_list_part_t *part;
ngx_open_file_t *file;
ngx_listening_t *ls, *nls;
+ ngx_core_conf_t *ccf;
+ ngx_event_conf_t *ecf;
ngx_core_module_t *module;
log = old_cycle->log;
@@ -204,6 +206,16 @@
if (!failed) {
+ ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx,
+ ngx_core_module);
+
+ if (ngx_create_pathes(cycle, ccf->user) == NGX_ERROR) {
+ failed = 1;
+ }
+ }
+
+
+ if (!failed) {
/* open the new files */
@@ -421,6 +433,13 @@
}
}
+
+ ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module);
+
+ ngx_log_error(NGX_LOG_INFO, cycle->log, 0,
+ "using the \"%s\" event method", ecf->name);
+
+
/* close and delete stuff that lefts from an old cycle */
/* close the unneeded listening sockets */
@@ -697,16 +716,6 @@
}
#else
if (user != (ngx_uid_t) -1) {
- if (chown((const char *) file[i].name.data, user, -1) == -1) {
- ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
- "chown \"%s\" failed", file[i].name.data);
-
- if (ngx_close_file(fd) == NGX_FILE_ERROR) {
- ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
- ngx_close_file_n " \"%s\" failed",
- file[i].name.data);
- }
- }
if (ngx_file_info((const char *) file[i].name.data, &fi) == -1) {
ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
@@ -720,14 +729,27 @@
}
}
+ if (fi.st_uid != user) {
+ if (chown((const char *) file[i].name.data, user, -1) == -1) {
+ ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
+ "chown(\"%s\", %d) failed",
+ file[i].name.data, user);
+
+ if (ngx_close_file(fd) == NGX_FILE_ERROR) {
+ ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
+ ngx_close_file_n " \"%s\" failed",
+ file[i].name.data);
+ }
+ }
+ }
+
if ((fi.st_mode & (S_IRUSR|S_IWUSR)) != (S_IRUSR|S_IWUSR)) {
fi.st_mode |= (S_IRUSR|S_IWUSR);
if (chmod((const char *) file[i].name.data, fi.st_mode) == -1) {
ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
- "chmod \"%s\" failed",
- file[i].name.data);
+ "chmod() \"%s\" failed", file[i].name.data);
if (ngx_close_file(fd) == NGX_FILE_ERROR) {
ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
diff --git a/src/core/ngx_file.c b/src/core/ngx_file.c
index 8e1edbd..08d9aba 100644
--- a/src/core/ngx_file.c
+++ b/src/core/ngx_file.c
@@ -12,9 +12,9 @@
static ngx_uint_t ngx_random;
-int ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain)
+ssize_t ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain)
{
- int rc;
+ ngx_int_t rc;
if (tf->file.fd == NGX_INVALID_FILE) {
rc = ngx_create_temp_file(&tf->file, tf->path, tf->pool,
@@ -33,16 +33,17 @@
}
-int ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path,
- ngx_pool_t *pool, int persistent)
+ngx_int_t ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path,
+ ngx_pool_t *pool, int persistent)
{
- int num;
- ngx_err_t err;
+ ngx_err_t err;
+ uint32_t num;
file->name.len = path->name.len + 1 + path->len + 10;
- ngx_test_null(file->name.data, ngx_palloc(pool, file->name.len + 1),
- NGX_ERROR);
+ if (!(file->name.data = ngx_palloc(pool, file->name.len + 1))) {
+ return NGX_ERROR;
+ }
#if 0
for (i = 0; i < file->name.len; i++) {
@@ -52,11 +53,11 @@
ngx_memcpy(file->name.data, path->name.data, path->name.len);
- num = ngx_next_temp_number(0);
+ num = (uint32_t) ngx_next_temp_number(0);
for ( ;; ) {
ngx_sprintf(file->name.data + path->name.len + 1 + path->len,
- "%010ud%Z", num);
+ "%010ui%Z", num);
ngx_create_hashed_filename(file, path);
@@ -85,7 +86,8 @@
#if (NGX_WIN32)
&& err != NGX_ENOTDIR
#endif
- )) {
+ ))
+ {
ngx_log_error(NGX_LOG_CRIT, file->log, err,
ngx_open_tempfile_n " \"%s\" failed",
file->name.data);
@@ -101,8 +103,7 @@
void ngx_create_hashed_filename(ngx_file_t *file, ngx_path_t *path)
{
- int i, name, pos;
- size_t level;
+ ngx_uint_t i, name, pos, level;
name = file->name.len;
pos = path->name.len + 1;
@@ -127,7 +128,7 @@
}
-int ngx_create_path(ngx_file_t *file, ngx_path_t *path)
+ngx_int_t ngx_create_path(ngx_file_t *file, ngx_path_t *path)
{
int i, pos;
ngx_err_t err;
@@ -189,32 +190,28 @@
{
char *p = conf;
- ngx_int_t level;
+ ssize_t level;
ngx_uint_t i, n;
ngx_str_t *value;
- ngx_path_t *path, **pp;
+ ngx_path_t *path, **pp, **slot;
- pp = (ngx_path_t **) (p + cmd->offset);
+ slot = (ngx_path_t **) (p + cmd->offset);
- if (*pp) {
+ if (*slot) {
return "is duplicate";
}
- /* TODO: check duplicate in cf->cycle->pathes */
+ if (!(path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t)))) {
+ return NGX_CONF_ERROR;
+ }
- ngx_test_null(path, ngx_pcalloc(cf->pool, sizeof(ngx_path_t)),
- NGX_CONF_ERROR);
-
- *pp = path;
-
- ngx_test_null(pp, ngx_push_array(&cf->cycle->pathes), NGX_CONF_ERROR);
- *pp = path;
-
- value = (ngx_str_t *) cf->args->elts;
+ value = cf->args->elts;
path->name = value[1];
-
path->len = 0;
+ path->gc_handler = (ngx_gc_handler_pt) cmd->post;
+ path->conf_file = cf->conf_file->file.name.data;
+ path->line = cf->conf_file->line;
for (i = 0, n = 2; n < cf->args->nelts; i++, n++) {
level = ngx_atoi(value[n].data, value[n].len);
@@ -230,7 +227,102 @@
path->level[i++] = 0;
}
- path->gc_handler = (ngx_gc_handler_pt) cmd->post;
+
+ pp = cf->cycle->pathes.elts;
+ for (i = 0; i < cf->cycle->pathes.nelts; i++) {
+ if (pp[i]->name.len == path->name.len
+ && ngx_strcmp(pp[i]->name.data, path->name.data) == 0)
+ {
+ for (n = 0; n < 3; n++) {
+ if (pp[i]->level[n] != path->level[n]) {
+ ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+ "the same \"%V\" path name in %s:%ui "
+ "has the different levels than",
+ &pp[i]->name, pp[i]->conf_file, pp[i]->line);
+ return NGX_CONF_ERROR;
+ }
+
+ if (pp[i]->level[n] == 0) {
+ break;
+ }
+ }
+
+ *slot = pp[i];
+
+ return NGX_CONF_OK;
+ }
+ }
+
+ *slot = path;
+
+
+ if (!(pp = ngx_array_push(&cf->cycle->pathes))) {
+ return NGX_CONF_ERROR;
+ }
+
+ *pp = path;
return NGX_CONF_OK;
}
+
+
+ngx_int_t ngx_create_pathes(ngx_cycle_t *cycle, ngx_uid_t user)
+{
+ ngx_err_t err;
+ ngx_uint_t i;
+ ngx_path_t **path;
+#if !(NGX_WIN32)
+ ngx_file_info_t fi;
+#endif
+
+ path = cycle->pathes.elts;
+ for (i = 0; i < cycle->pathes.nelts; i++) {
+
+ if (ngx_create_dir(path[i]->name.data) == NGX_FILE_ERROR) {
+ err = ngx_errno;
+ if (err != NGX_EEXIST) {
+ ngx_log_error(NGX_LOG_EMERG, cycle->log, err,
+ ngx_create_dir_n " \"%s\" failed",
+ path[i]->name.data);
+ return NGX_ERROR;
+ }
+ }
+
+ if (user == (ngx_uid_t) -1) {
+ continue;
+ }
+
+#if !(NGX_WIN32)
+
+ if (ngx_file_info((const char *) path[i]->name.data, &fi) == -1) {
+ ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
+ ngx_file_info_n " \"%s\" failed", path[i]->name.data);
+ return NGX_ERROR;
+ }
+
+ if (fi.st_uid != user) {
+ if (chown((const char *) path[i]->name.data, user, -1) == -1) {
+ ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
+ "chown(\"%s\", %d) failed",
+ path[i]->name.data, user);
+ return NGX_ERROR;
+ }
+ }
+
+ if ((fi.st_mode & (S_IRUSR|S_IWUSR|S_IXUSR))
+ != (S_IRUSR|S_IWUSR|S_IXUSR))
+ {
+ fi.st_mode |= (S_IRUSR|S_IWUSR|S_IXUSR);
+
+ if (chmod((const char *) path[i]->name.data, fi.st_mode) == -1) {
+ ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
+ "chmod() \"%s\" failed", path[i]->name.data);
+ return NGX_ERROR;
+ }
+ }
+
+#endif
+ }
+
+ return NGX_OK;
+}
diff --git a/src/core/ngx_file.h b/src/core/ngx_file.h
index d05b6d7..94fd8c7 100644
--- a/src/core/ngx_file.h
+++ b/src/core/ngx_file.h
@@ -17,44 +17,48 @@
struct ngx_file_s {
- ngx_fd_t fd;
- ngx_str_t name;
- ngx_file_info_t info;
+ ngx_fd_t fd;
+ ngx_str_t name;
+ ngx_file_info_t info;
- off_t offset;
- off_t sys_offset;
+ off_t offset;
+ off_t sys_offset;
- ngx_log_t *log;
+ ngx_log_t *log;
- ngx_uint_t valid_info:1; /* unsigned valid_info:1; */
+ ngx_uint_t valid_info:1; /* unsigned valid_info:1; */
};
#define NGX_MAX_PATH_LEVEL 3
struct ngx_path_s {
ngx_str_t name;
- u_int len;
- u_int level[3];
+ ngx_uint_t len;
+ ngx_uint_t level[3];
ngx_gc_handler_pt gc_handler;
+
+ u_char *conf_file;
+ ngx_uint_t line;
};
typedef struct {
- ngx_file_t file;
- off_t offset;
- ngx_path_t *path;
- ngx_pool_t *pool;
- char *warn;
+ ngx_file_t file;
+ off_t offset;
+ ngx_path_t *path;
+ ngx_pool_t *pool;
+ char *warn;
- unsigned persistent:1;
+ unsigned persistent:1;
} ngx_temp_file_t;
-int ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain);
-int ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path,
- ngx_pool_t *pool, int persistent);
+ssize_t ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain);
+ngx_int_t ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path,
+ ngx_pool_t *pool, int persistent);
void ngx_create_hashed_filename(ngx_file_t *file, ngx_path_t *path);
-int ngx_create_path(ngx_file_t *file, ngx_path_t *path);
+ngx_int_t ngx_create_path(ngx_file_t *file, ngx_path_t *path);
+ngx_int_t ngx_create_pathes(ngx_cycle_t *cycle, ngx_uid_t user);
void ngx_init_temp_number();
ngx_uint_t ngx_next_temp_number(ngx_uint_t collision);
diff --git a/src/core/ngx_garbage_collector.c b/src/core/ngx_garbage_collector.c
index 73f9cc1..fb6ad77 100644
--- a/src/core/ngx_garbage_collector.c
+++ b/src/core/ngx_garbage_collector.c
@@ -9,71 +9,8 @@
#include <ngx_garbage_collector.h>
-int ngx_garbage_collector_temp_handler(ngx_gc_t *ctx, ngx_str_t *name,
- ngx_dir_t *dir);
-
-static int ngx_collect_garbage(ngx_gc_t *ctx, ngx_str_t *dname, int level);
-
-
-
-#if 0
-
-{
- ngx_test_null(cycle->timer_events,
- ngx_alloc(sizeof(ngx_event_t) * TIMERS, cycle->log),
- NGX_ERROR);
-
- ngx_event_timer_init(cycle);
-}
-
-
-void garbage_collector()
-{
- ngx_msec_t timer;
- struct timeval tv;
- ngx_epoch_msec_t delta;
-
- for ( ;; ) {
- timer = ngx_event_find_timer();
-
- ngx_gettimeofday(&tv);
- delta = tv.tv_sec * 1000 + tv.tv_usec / 1000;
-
- msleep(timer);
-
- ngx_gettimeofday(&tv);
-
- ngx_cached_time = tv.tv_sec;
- ngx_time_update();
-
- delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta;
-
- ngx_event_expire_timers((ngx_msec_t) delta);
- }
-}
-
-#endif
-
-
-void stub_init(ngx_cycle_t *cycle)
-{
- ngx_uint_t i;
- ngx_gc_t ctx;
- ngx_path_t **path;
-
- path = cycle->pathes.elts;
- for (i = 0; i < cycle->pathes.nelts; i++) {
- ctx.path = path[i];
- ctx.log = cycle->log;
- ctx.handler = path[i]->gc_handler;
-
- ngx_collect_garbage(&ctx, &path[i]->name, 0);
- }
-}
-
-
-static int ngx_collect_garbage(ngx_gc_t *ctx, ngx_str_t *dname, int level)
+ngx_int_t ngx_collect_garbage(ngx_gc_t *ctx, ngx_str_t *dname, int level)
{
int rc;
u_char *last;
@@ -224,7 +161,8 @@
} else {
ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,
- "\"%s\" has unknown file type, deleting", fname.data);
+ "the file \"%s\" has unknown type, deleting",
+ fname.data);
if (ngx_delete_file(fname.data) == NGX_FILE_ERROR) {
ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,
@@ -249,8 +187,8 @@
}
-int ngx_garbage_collector_temp_handler(ngx_gc_t *ctx, ngx_str_t *name,
- ngx_dir_t *dir)
+ngx_int_t ngx_garbage_collector_temp_handler(ngx_gc_t *ctx, ngx_str_t *name,
+ ngx_dir_t *dir)
{
/*
* We use mtime only and do not use atime because:
@@ -264,7 +202,7 @@
}
ngx_log_error(NGX_LOG_NOTICE, ctx->log, 0,
- "delete stale temporary \"%s\"", name->data);
+ "delete the stale temporary file \"%s\"", name->data);
if (ngx_delete_file(name->data) == NGX_FILE_ERROR) {
ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,
diff --git a/src/core/ngx_garbage_collector.h b/src/core/ngx_garbage_collector.h
index 72f9760..cec3a87 100644
--- a/src/core/ngx_garbage_collector.h
+++ b/src/core/ngx_garbage_collector.h
@@ -23,8 +23,9 @@
};
-int ngx_garbage_collector_temp_handler(ngx_gc_t *ctx, ngx_str_t *name,
- ngx_dir_t *dir);
+ngx_int_t ngx_collect_garbage(ngx_gc_t *ctx, ngx_str_t *dname, int level);
+ngx_int_t ngx_garbage_collector_temp_handler(ngx_gc_t *ctx, ngx_str_t *name,
+ ngx_dir_t *dir);
#endif /* _NGX_GARBAGE_COLLECTOR_H_INCLUDED_ */
diff --git a/src/core/ngx_inet.c b/src/core/ngx_inet.c
index 5cabb49..22a5334 100644
--- a/src/core/ngx_inet.c
+++ b/src/core/ngx_inet.c
@@ -20,7 +20,7 @@
*/
-ngx_inline static size_t ngx_sprint_uchar(u_char *text, u_char c, size_t len)
+static ngx_inline size_t ngx_sprint_uchar(u_char *text, u_char c, size_t len)
{
size_t n;
ngx_uint_t c1, c2;
diff --git a/src/core/ngx_list.h b/src/core/ngx_list.h
index 046bdee..2dd8ab3 100644
--- a/src/core/ngx_list.h
+++ b/src/core/ngx_list.h
@@ -30,7 +30,7 @@
} ngx_list_t;
-ngx_inline static ngx_int_t ngx_list_init(ngx_list_t *list, ngx_pool_t *pool,
+static ngx_inline ngx_int_t ngx_list_init(ngx_list_t *list, ngx_pool_t *pool,
ngx_uint_t n, size_t size)
{
if (!(list->part.elts = ngx_palloc(pool, n * size))) {
diff --git a/src/core/ngx_log.c b/src/core/ngx_log.c
index 521ba7a..b7198cd 100644
--- a/src/core/ngx_log.c
+++ b/src/core/ngx_log.c
@@ -155,8 +155,15 @@
errstr[len++] = CR;
errstr[len++] = LF;
+
WriteFile(log->file->fd, errstr, len, &written, NULL);
+#if 0
+ if (WriteFile(log->file->fd, errstr, len, &written, NULL) == 0) {
+ ngx_message_box("nginx", MB_OK, ngx_errno, "WriteFile() failed");
+ }
+#endif
+
#else
if (len == NGX_MAX_ERROR_STR) {
@@ -164,6 +171,7 @@
}
errstr[len++] = LF;
+
write(log->file->fd, errstr, len);
#endif
diff --git a/src/core/ngx_output_chain.c b/src/core/ngx_output_chain.c
index 30dda35..d2fbf12 100644
--- a/src/core/ngx_output_chain.c
+++ b/src/core/ngx_output_chain.c
@@ -12,7 +12,7 @@
#define NGX_NONE 1
-ngx_inline static ngx_int_t
+static ngx_inline ngx_int_t
ngx_output_chain_need_to_copy(ngx_output_chain_ctx_t *ctx, ngx_buf_t *buf);
static ngx_int_t ngx_output_chain_copy_buf(ngx_buf_t *dst, ngx_buf_t *src,
ngx_uint_t sendfile);
@@ -188,7 +188,7 @@
}
-ngx_inline static ngx_int_t
+static ngx_inline ngx_int_t
ngx_output_chain_need_to_copy(ngx_output_chain_ctx_t *ctx, ngx_buf_t *buf)
{
if (ngx_buf_special(buf)) {
diff --git a/src/core/ngx_rbtree.c b/src/core/ngx_rbtree.c
index c94db13..ef57289 100644
--- a/src/core/ngx_rbtree.c
+++ b/src/core/ngx_rbtree.c
@@ -20,12 +20,12 @@
#define ngx_rbt_copy_color(n1, n2) (n1->color = n2->color)
-ngx_inline void ngx_rbtree_left_rotate(ngx_rbtree_t **root,
- ngx_rbtree_t *sentinel,
- ngx_rbtree_t *node);
-ngx_inline void ngx_rbtree_right_rotate(ngx_rbtree_t **root,
- ngx_rbtree_t *sentinel,
- ngx_rbtree_t *node);
+static ngx_inline void ngx_rbtree_left_rotate(ngx_rbtree_t **root,
+ ngx_rbtree_t *sentinel,
+ ngx_rbtree_t *node);
+static ngx_inline void ngx_rbtree_right_rotate(ngx_rbtree_t **root,
+ ngx_rbtree_t *sentinel,
+ ngx_rbtree_t *node);
void ngx_rbtree_insert(ngx_rbtree_t **root, ngx_rbtree_t *sentinel,
@@ -289,9 +289,9 @@
}
-ngx_inline void ngx_rbtree_left_rotate(ngx_rbtree_t **root,
- ngx_rbtree_t *sentinel,
- ngx_rbtree_t *node)
+static ngx_inline void ngx_rbtree_left_rotate(ngx_rbtree_t **root,
+ ngx_rbtree_t *sentinel,
+ ngx_rbtree_t *node)
{
ngx_rbtree_t *temp;
@@ -319,9 +319,9 @@
}
-ngx_inline void ngx_rbtree_right_rotate(ngx_rbtree_t **root,
- ngx_rbtree_t *sentinel,
- ngx_rbtree_t *node)
+static ngx_inline void ngx_rbtree_right_rotate(ngx_rbtree_t **root,
+ ngx_rbtree_t *sentinel,
+ ngx_rbtree_t *node)
{
ngx_rbtree_t *temp;
diff --git a/src/core/ngx_rbtree.h b/src/core/ngx_rbtree.h
index aa69556..d876ec0 100644
--- a/src/core/ngx_rbtree.h
+++ b/src/core/ngx_rbtree.h
@@ -29,7 +29,7 @@
ngx_rbtree_t *node);
-ngx_inline static ngx_rbtree_t *ngx_rbtree_min(ngx_rbtree_t *node,
+static ngx_inline ngx_rbtree_t *ngx_rbtree_min(ngx_rbtree_t *node,
ngx_rbtree_t *sentinel)
{
while (node->left != sentinel) {
diff --git a/src/core/ngx_string.c b/src/core/ngx_string.c
index 94eadfb..4e5d273 100644
--- a/src/core/ngx_string.c
+++ b/src/core/ngx_string.c
@@ -135,6 +135,11 @@
fmt++;
continue;
+ case 'm':
+ width = NGX_INT_T_LEN;
+ fmt++;
+ continue;
+
case 'X':
hexadecimal = 2;
sign = 0;