# HG changeset patch # User Igor Sysoev # Date 1265035945 0 # Node ID 6b8284fc958da4035ad0a6a9811802abbb3732a8 # Parent 20871c5e1d5d405ecc369debcb489d3a2f561290 merge r3201, r3204, r3411: ngx_http_autoindex_module fixes: *) reset cached dirent.d_type after stat() this fixes slash after link to a directory in ngx_http_autoindex_module; *) use cached dirent.d_type as hint on all systems the issues has been introduced in r2235 *) fix ngx_utf8_cpystrn(): it did not fully copy utf-8 string diff -r 20871c5e1d5d -r 6b8284fc958d src/core/ngx_string.c --- a/src/core/ngx_string.c Mon Feb 01 14:44:43 2010 +0000 +++ b/src/core/ngx_string.c Mon Feb 01 14:52:25 2010 +0000 @@ -1238,10 +1238,8 @@ break; } - len--; - while (src < next) { - *++dst = *++src; + *dst++ = *src++; len--; } } diff -r 20871c5e1d5d -r 6b8284fc958d src/http/modules/ngx_http_random_index_module.c --- a/src/http/modules/ngx_http_random_index_module.c Mon Feb 01 14:44:43 2010 +0000 +++ b/src/http/modules/ngx_http_random_index_module.c Mon Feb 01 14:52:25 2010 +0000 @@ -175,7 +175,7 @@ len = ngx_de_namelen(&dir); - if (!dir.valid_type) { + if (dir.type == 0 || ngx_de_is_link(&dir)) { /* 1 byte for '/' and 1 byte for terminating '\0' */ diff -r 20871c5e1d5d -r 6b8284fc958d src/os/unix/ngx_files.c --- a/src/os/unix/ngx_files.c Mon Feb 01 14:44:43 2010 +0000 +++ b/src/os/unix/ngx_files.c Mon Feb 01 14:52:25 2010 +0000 @@ -262,9 +262,8 @@ if (dir->de) { #if (NGX_HAVE_D_TYPE) dir->type = dir->de->d_type; - dir->valid_type = dir->type ? 1 : 0; #else - dir->valid_type = 0; + dir->type = 0; #endif return NGX_OK; } diff -r 20871c5e1d5d -r 6b8284fc958d src/os/unix/ngx_files.h --- a/src/os/unix/ngx_files.h Mon Feb 01 14:44:43 2010 +0000 +++ b/src/os/unix/ngx_files.h Mon Feb 01 14:52:25 2010 +0000 @@ -24,7 +24,6 @@ unsigned type:8; unsigned valid_info:1; - unsigned valid_type:1; } ngx_dir_t; @@ -200,31 +199,31 @@ #else #define ngx_de_namelen(dir) ngx_strlen((dir)->de->d_name) #endif -#define ngx_de_info(name, dir) stat((const char *) name, &(dir)->info) + +static ngx_inline ngx_int_t +ngx_de_info(u_char *name, ngx_dir_t *dir) +{ + dir->type = 0; + return stat((const char *) name, &dir->info); +} + #define ngx_de_info_n "stat()" #define ngx_de_link_info(name, dir) lstat((const char *) name, &(dir)->info) #define ngx_de_link_info_n "lstat()" #if (NGX_HAVE_D_TYPE) -#if (NGX_LINUX) - -/* XFS on Linux does not set dirent.d_type */ +/* + * some file systems (e.g. XFS on Linux and CD9660 on FreeBSD) + * do not set dirent.d_type + */ #define ngx_de_is_dir(dir) \ (((dir)->type) ? ((dir)->type == DT_DIR) : (S_ISDIR((dir)->info.st_mode))) #define ngx_de_is_file(dir) \ (((dir)->type) ? ((dir)->type == DT_REG) : (S_ISREG((dir)->info.st_mode))) #define ngx_de_is_link(dir) \ - (((dir)->type) ? ((dir)->type == DT_LINK) : (S_ISLNK((dir)->info.st_mode))) - -#else - -#define ngx_de_is_dir(dir) ((dir)->type == DT_DIR) -#define ngx_de_is_file(dir) ((dir)->type == DT_REG) -#define ngx_de_is_link(dir) ((dir)->type == DT_LINK) - -#endif /* NGX_LINUX */ + (((dir)->type) ? ((dir)->type == DT_LNK) : (S_ISLNK((dir)->info.st_mode))) #else diff -r 20871c5e1d5d -r 6b8284fc958d src/os/win32/ngx_files.c --- a/src/os/win32/ngx_files.c Mon Feb 01 14:44:43 2010 +0000 +++ b/src/os/win32/ngx_files.c Mon Feb 01 14:52:25 2010 +0000 @@ -376,7 +376,6 @@ } dir->valid_info = 1; - dir->valid_type = 1; dir->ready = 1; return NGX_OK; @@ -392,6 +391,7 @@ } if (FindNextFile(dir->dir, &dir->finddata) != 0) { + dir->type = 1; return NGX_OK; } diff -r 20871c5e1d5d -r 6b8284fc958d src/os/win32/ngx_files.h --- a/src/os/win32/ngx_files.h Mon Feb 01 14:44:43 2010 +0000 +++ b/src/os/win32/ngx_files.h Mon Feb 01 14:52:25 2010 +0000 @@ -21,7 +21,7 @@ WIN32_FIND_DATA finddata; unsigned valid_info:1; - unsigned valid_type:1; + unsigned type:1; unsigned ready:1; } ngx_dir_t;