diff options
author | Igor Sysoev <igor@sysoev.ru> | 2009-10-14 15:33:35 +0400 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2009-10-14 15:33:35 +0400 |
commit | e58700d3b08bee27db7206c2eefe858ad0488b4a (patch) | |
tree | cf325092d4040941f6e028b41a4cc967573d6a23 /src/os | |
parent | e7138540d603336a0f2187d8cf20d24b54ed265e (diff) |
*) 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
Diffstat (limited to 'src/os')
-rw-r--r-- | src/os/unix/ngx_files.c | 3 | ||||
-rw-r--r-- | src/os/unix/ngx_files.h | 27 | ||||
-rw-r--r-- | src/os/win32/ngx_files.c | 2 | ||||
-rw-r--r-- | src/os/win32/ngx_files.h | 2 |
4 files changed, 16 insertions, 18 deletions
diff --git a/src/os/unix/ngx_files.c b/src/os/unix/ngx_files.c index 2154bed49..618d4e214 100644 --- a/src/os/unix/ngx_files.c +++ b/src/os/unix/ngx_files.c @@ -274,9 +274,8 @@ ngx_read_dir(ngx_dir_t *dir) 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 --git a/src/os/unix/ngx_files.h b/src/os/unix/ngx_files.h index 832dbbe0f..9cdfeabfe 100644 --- a/src/os/unix/ngx_files.h +++ b/src/os/unix/ngx_files.h @@ -24,7 +24,6 @@ typedef struct { unsigned type:8; unsigned valid_info:1; - unsigned valid_type:1; } ngx_dir_t; @@ -200,31 +199,31 @@ ngx_int_t ngx_read_dir(ngx_dir_t *dir); #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 --git a/src/os/win32/ngx_files.c b/src/os/win32/ngx_files.c index 3bb79b89e..fab74ae4d 100644 --- a/src/os/win32/ngx_files.c +++ b/src/os/win32/ngx_files.c @@ -322,7 +322,6 @@ ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir) } dir->valid_info = 1; - dir->valid_type = 1; dir->ready = 1; return NGX_OK; @@ -338,6 +337,7 @@ ngx_read_dir(ngx_dir_t *dir) } if (FindNextFile(dir->dir, &dir->finddata) != 0) { + dir->type = 1; return NGX_OK; } diff --git a/src/os/win32/ngx_files.h b/src/os/win32/ngx_files.h index 605eee85e..cc9fa8f1e 100644 --- a/src/os/win32/ngx_files.h +++ b/src/os/win32/ngx_files.h @@ -21,7 +21,7 @@ typedef struct { WIN32_FIND_DATA finddata; unsigned valid_info:1; - unsigned valid_type:1; + unsigned type:1; unsigned ready:1; } ngx_dir_t; |