summaryrefslogtreecommitdiff
path: root/src/stat_cache.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/stat_cache.c')
-rw-r--r--src/stat_cache.c42
1 files changed, 25 insertions, 17 deletions
diff --git a/src/stat_cache.c b/src/stat_cache.c
index fa94eed..2657143 100644
--- a/src/stat_cache.c
+++ b/src/stat_cache.c
@@ -489,6 +489,12 @@ handler_t stat_cache_get_entry(server *srv, connection *con, buffer *name, stat_
if (S_ISREG(st.st_mode)) {
+ /* fix broken stat/open for symlinks to reg files with appended slash on freebsd,osx */
+ if (name->ptr[name->used-2] == '/') {
+ errno = ENOTDIR;
+ return HANDLER_ERROR;
+ }
+
/* try to open the file to check if we can read it */
if (-1 == (fd = open(name->ptr, O_RDONLY))) {
return HANDLER_ERROR;
@@ -595,29 +601,31 @@ handler_t stat_cache_get_entry(server *srv, connection *con, buffer *name, stat_
if (S_ISREG(st.st_mode)) {
/* determine mimetype */
buffer_reset(sce->content_type);
+#ifdef HAVE_XATTR
+ if (con->conf.use_xattr) {
+ stat_cache_attr_get(sce->content_type, name->ptr);
+ }
+#endif
+ /* xattr did not set a content-type. ask the config */
+ if (buffer_is_empty(sce->content_type)) {
+ for (k = 0; k < con->conf.mimetypes->used; k++) {
+ data_string *ds = (data_string *)con->conf.mimetypes->data[k];
+ buffer *type = ds->key;
- for (k = 0; k < con->conf.mimetypes->used; k++) {
- data_string *ds = (data_string *)con->conf.mimetypes->data[k];
- buffer *type = ds->key;
-
- if (type->used == 0) continue;
+ if (type->used == 0) continue;
- /* check if the right side is the same */
- if (type->used > name->used) continue;
+ /* check if the right side is the same */
+ if (type->used > name->used) continue;
- if (0 == strncasecmp(name->ptr + name->used - type->used, type->ptr, type->used - 1)) {
- buffer_copy_string_buffer(sce->content_type, ds->value);
- break;
+ if (0 == strncasecmp(name->ptr + name->used - type->used, type->ptr, type->used - 1)) {
+ buffer_copy_string_buffer(sce->content_type, ds->value);
+ break;
+ }
}
}
- etag_create(sce->etag, &(sce->st), con->etag_flags);
-#ifdef HAVE_XATTR
- if (con->conf.use_xattr && buffer_is_empty(sce->content_type)) {
- stat_cache_attr_get(sce->content_type, name->ptr);
- }
-#endif
+ etag_create(sce->etag, &(sce->st), con->etag_flags);
} else if (S_ISDIR(st.st_mode)) {
- etag_create(sce->etag, &(sce->st), con->etag_flags);
+ etag_create(sce->etag, &(sce->st), con->etag_flags);
}
#ifdef HAVE_FAM_H