*) 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
Igor Sysoev
12 years ago
23 | 23 |
|
24 | 24 |
unsigned type:8;
|
25 | 25 |
unsigned valid_info:1;
|
26 | |
unsigned valid_type:1;
|
27 | 26 |
} ngx_dir_t;
|
28 | 27 |
|
29 | 28 |
|
|
199 | 198 |
#else
|
200 | 199 |
#define ngx_de_namelen(dir) ngx_strlen((dir)->de->d_name)
|
201 | 200 |
#endif
|
202 | |
#define ngx_de_info(name, dir) stat((const char *) name, &(dir)->info)
|
|
201 |
|
|
202 |
static ngx_inline ngx_int_t
|
|
203 |
ngx_de_info(u_char *name, ngx_dir_t *dir)
|
|
204 |
{
|
|
205 |
dir->type = 0;
|
|
206 |
return stat((const char *) name, &dir->info);
|
|
207 |
}
|
|
208 |
|
203 | 209 |
#define ngx_de_info_n "stat()"
|
204 | 210 |
#define ngx_de_link_info(name, dir) lstat((const char *) name, &(dir)->info)
|
205 | 211 |
#define ngx_de_link_info_n "lstat()"
|
206 | 212 |
|
207 | 213 |
#if (NGX_HAVE_D_TYPE)
|
208 | 214 |
|
209 | |
#if (NGX_LINUX)
|
210 | |
|
211 | |
/* XFS on Linux does not set dirent.d_type */
|
|
215 |
/*
|
|
216 |
* some file systems (e.g. XFS on Linux and CD9660 on FreeBSD)
|
|
217 |
* do not set dirent.d_type
|
|
218 |
*/
|
212 | 219 |
|
213 | 220 |
#define ngx_de_is_dir(dir) \
|
214 | 221 |
(((dir)->type) ? ((dir)->type == DT_DIR) : (S_ISDIR((dir)->info.st_mode)))
|
215 | 222 |
#define ngx_de_is_file(dir) \
|
216 | 223 |
(((dir)->type) ? ((dir)->type == DT_REG) : (S_ISREG((dir)->info.st_mode)))
|
217 | 224 |
#define ngx_de_is_link(dir) \
|
218 | |
(((dir)->type) ? ((dir)->type == DT_LINK) : (S_ISLNK((dir)->info.st_mode)))
|
219 | |
|
220 | |
#else
|
221 | |
|
222 | |
#define ngx_de_is_dir(dir) ((dir)->type == DT_DIR)
|
223 | |
#define ngx_de_is_file(dir) ((dir)->type == DT_REG)
|
224 | |
#define ngx_de_is_link(dir) ((dir)->type == DT_LINK)
|
225 | |
|
226 | |
#endif /* NGX_LINUX */
|
|
225 |
(((dir)->type) ? ((dir)->type == DT_LNK) : (S_ISLNK((dir)->info.st_mode)))
|
227 | 226 |
|
228 | 227 |
#else
|
229 | 228 |
|
20 | 20 |
WIN32_FIND_DATA finddata;
|
21 | 21 |
|
22 | 22 |
unsigned valid_info:1;
|
23 | |
unsigned valid_type:1;
|
|
23 |
unsigned type:1;
|
24 | 24 |
unsigned ready:1;
|
25 | 25 |
} ngx_dir_t;
|
26 | 26 |
|