1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
#ifndef _FILE_CACHE_H_
#define _FILE_CACHE_H_
#include "first.h"
#include <sys/stat.h>
#include "sys-time.h"
#include "base_decls.h"
#include "buffer.h"
#include "array.h"
typedef struct stat stat_cache_st;
typedef struct stat_cache_entry {
buffer name;
unix_time64_t stat_ts;
int fd;
int refcnt;
#if defined(HAVE_FAM_H) || defined(HAVE_SYS_INOTIFY_H) || defined(HAVE_SYS_EVENT_H)
void *fam_dir;
#endif
buffer etag;
buffer content_type;
struct stat st;
} stat_cache_entry;
__attribute_cold__
int stat_cache_choose_engine (const buffer *stat_cache_string, log_error_st *errh);
struct fdevents; /* declaration */
__attribute_cold__
int stat_cache_init(struct fdevents *ev, log_error_st *errh);
__attribute_cold__
void stat_cache_free(void);
void stat_cache_entry_refchg(void *data, int mod);
__attribute_cold__
void stat_cache_xattrname (const char *name);
__attribute_pure__
const buffer * stat_cache_mimetype_by_ext(const array *mimetypes, const char *name, uint32_t nlen);
#if defined(HAVE_XATTR) || defined(HAVE_EXTATTR)
const buffer * stat_cache_mimetype_by_xattr(const char *name);
const buffer * stat_cache_content_type_get_by_xattr(stat_cache_entry *sce, const array *mimetypes, int use_xattr);
#define stat_cache_content_type_get(con, r) stat_cache_content_type_get_by_xattr((sce), (r)->conf.mimetypes, (r)->conf.use_xattr)
#else
const buffer * stat_cache_content_type_get_by_ext(stat_cache_entry *sce, const array *mimetypes);
#define stat_cache_content_type_get(con, r) stat_cache_content_type_get_by_ext((sce), (r)->conf.mimetypes)
#endif
const buffer * stat_cache_etag_get(stat_cache_entry *sce, int flags);
void stat_cache_update_entry(const char *name, uint32_t len, const struct stat *st, const buffer *etagb);
void stat_cache_delete_entry(const char *name, uint32_t len);
void stat_cache_delete_dir(const char *name, uint32_t len);
void stat_cache_invalidate_entry(const char *name, uint32_t len);
stat_cache_entry * stat_cache_get_entry(const buffer *name);
stat_cache_entry * stat_cache_get_entry_open(const buffer *name, int symlinks);
const stat_cache_st * stat_cache_path_stat(const buffer *name);
int stat_cache_path_isdir(const buffer *name);
__attribute_cold__
int stat_cache_path_contains_symlink(const buffer *name, log_error_st *errh);
int stat_cache_open_rdonly_fstat (const buffer *name, struct stat *st, int symlinks);
void stat_cache_trigger_cleanup(void);
#endif
|