comparison src/os/unix/ngx_files.h @ 3200:26784c34e8be

*) 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
author Igor Sysoev <igor@sysoev.ru>
date Wed, 14 Oct 2009 11:33:35 +0000
parents 975f0558aab3
children c5af9f73c664
comparison
equal deleted inserted replaced
3199:b242aaf1dcfa 3200:26784c34e8be
22 struct dirent *de; 22 struct dirent *de;
23 struct stat info; 23 struct stat info;
24 24
25 unsigned type:8; 25 unsigned type:8;
26 unsigned valid_info:1; 26 unsigned valid_info:1;
27 unsigned valid_type:1;
28 } ngx_dir_t; 27 } ngx_dir_t;
29 28
30 29
31 typedef struct { 30 typedef struct {
32 size_t n; 31 size_t n;
198 #if (NGX_HAVE_D_NAMLEN) 197 #if (NGX_HAVE_D_NAMLEN)
199 #define ngx_de_namelen(dir) (dir)->de->d_namlen 198 #define ngx_de_namelen(dir) (dir)->de->d_namlen
200 #else 199 #else
201 #define ngx_de_namelen(dir) ngx_strlen((dir)->de->d_name) 200 #define ngx_de_namelen(dir) ngx_strlen((dir)->de->d_name)
202 #endif 201 #endif
203 #define ngx_de_info(name, dir) stat((const char *) name, &(dir)->info) 202
203 static ngx_inline ngx_int_t
204 ngx_de_info(u_char *name, ngx_dir_t *dir)
205 {
206 dir->type = 0;
207 return stat((const char *) name, &dir->info);
208 }
209
204 #define ngx_de_info_n "stat()" 210 #define ngx_de_info_n "stat()"
205 #define ngx_de_link_info(name, dir) lstat((const char *) name, &(dir)->info) 211 #define ngx_de_link_info(name, dir) lstat((const char *) name, &(dir)->info)
206 #define ngx_de_link_info_n "lstat()" 212 #define ngx_de_link_info_n "lstat()"
207 213
208 #if (NGX_HAVE_D_TYPE) 214 #if (NGX_HAVE_D_TYPE)
209 215
210 #if (NGX_LINUX) 216 /*
211 217 * some file systems (e.g. XFS on Linux and CD9660 on FreeBSD)
212 /* XFS on Linux does not set dirent.d_type */ 218 * do not set dirent.d_type
219 */
213 220
214 #define ngx_de_is_dir(dir) \ 221 #define ngx_de_is_dir(dir) \
215 (((dir)->type) ? ((dir)->type == DT_DIR) : (S_ISDIR((dir)->info.st_mode))) 222 (((dir)->type) ? ((dir)->type == DT_DIR) : (S_ISDIR((dir)->info.st_mode)))
216 #define ngx_de_is_file(dir) \ 223 #define ngx_de_is_file(dir) \
217 (((dir)->type) ? ((dir)->type == DT_REG) : (S_ISREG((dir)->info.st_mode))) 224 (((dir)->type) ? ((dir)->type == DT_REG) : (S_ISREG((dir)->info.st_mode)))
218 #define ngx_de_is_link(dir) \ 225 #define ngx_de_is_link(dir) \
219 (((dir)->type) ? ((dir)->type == DT_LINK) : (S_ISLNK((dir)->info.st_mode))) 226 (((dir)->type) ? ((dir)->type == DT_LNK) : (S_ISLNK((dir)->info.st_mode)))
220
221 #else
222
223 #define ngx_de_is_dir(dir) ((dir)->type == DT_DIR)
224 #define ngx_de_is_file(dir) ((dir)->type == DT_REG)
225 #define ngx_de_is_link(dir) ((dir)->type == DT_LINK)
226
227 #endif /* NGX_LINUX */
228 227
229 #else 228 #else
230 229
231 #define ngx_de_is_dir(dir) (S_ISDIR((dir)->info.st_mode)) 230 #define ngx_de_is_dir(dir) (S_ISDIR((dir)->info.st_mode))
232 #define ngx_de_is_file(dir) (S_ISREG((dir)->info.st_mode)) 231 #define ngx_de_is_file(dir) (S_ISREG((dir)->info.st_mode))