1e18a033bSKonstantin Ananyev
2e18a033bSKonstantin Ananyev/*
3e18a033bSKonstantin Ananyev * Copyright (C) Igor Sysoev
4e18a033bSKonstantin Ananyev * Copyright (C) Nginx, Inc.
5e18a033bSKonstantin Ananyev */
6e18a033bSKonstantin Ananyev
7e18a033bSKonstantin Ananyev
8e18a033bSKonstantin Ananyev#include <ngx_config.h>
9e18a033bSKonstantin Ananyev#include <ngx_core.h>
10e18a033bSKonstantin Ananyev
11e18a033bSKonstantin Ananyev
12e18a033bSKonstantin Ananyev#ifndef _NGX_OPEN_FILE_CACHE_H_INCLUDED_
13e18a033bSKonstantin Ananyev#define _NGX_OPEN_FILE_CACHE_H_INCLUDED_
14e18a033bSKonstantin Ananyev
15e18a033bSKonstantin Ananyev
16e18a033bSKonstantin Ananyev#define NGX_OPEN_FILE_DIRECTIO_OFF  NGX_MAX_OFF_T_VALUE
17e18a033bSKonstantin Ananyev
18e18a033bSKonstantin Ananyev
19e18a033bSKonstantin Ananyevtypedef struct {
20e18a033bSKonstantin Ananyev    ngx_fd_t                 fd;
21e18a033bSKonstantin Ananyev    ngx_file_uniq_t          uniq;
22e18a033bSKonstantin Ananyev    time_t                   mtime;
23e18a033bSKonstantin Ananyev    off_t                    size;
24e18a033bSKonstantin Ananyev    off_t                    fs_size;
25e18a033bSKonstantin Ananyev    off_t                    directio;
26e18a033bSKonstantin Ananyev    size_t                   read_ahead;
27e18a033bSKonstantin Ananyev
28e18a033bSKonstantin Ananyev    ngx_err_t                err;
29e18a033bSKonstantin Ananyev    char                    *failed;
30e18a033bSKonstantin Ananyev
31e18a033bSKonstantin Ananyev    time_t                   valid;
32e18a033bSKonstantin Ananyev
33e18a033bSKonstantin Ananyev    ngx_uint_t               min_uses;
34e18a033bSKonstantin Ananyev
35e18a033bSKonstantin Ananyev#if (NGX_HAVE_OPENAT)
36e18a033bSKonstantin Ananyev    size_t                   disable_symlinks_from;
37e18a033bSKonstantin Ananyev    unsigned                 disable_symlinks:2;
38e18a033bSKonstantin Ananyev#endif
39e18a033bSKonstantin Ananyev
40e18a033bSKonstantin Ananyev    unsigned                 test_dir:1;
41e18a033bSKonstantin Ananyev    unsigned                 test_only:1;
42e18a033bSKonstantin Ananyev    unsigned                 log:1;
43e18a033bSKonstantin Ananyev    unsigned                 errors:1;
44e18a033bSKonstantin Ananyev    unsigned                 events:1;
45e18a033bSKonstantin Ananyev
46e18a033bSKonstantin Ananyev    unsigned                 is_dir:1;
47e18a033bSKonstantin Ananyev    unsigned                 is_file:1;
48e18a033bSKonstantin Ananyev    unsigned                 is_link:1;
49e18a033bSKonstantin Ananyev    unsigned                 is_exec:1;
50e18a033bSKonstantin Ananyev    unsigned                 is_directio:1;
51e18a033bSKonstantin Ananyev} ngx_open_file_info_t;
52e18a033bSKonstantin Ananyev
53e18a033bSKonstantin Ananyev
54e18a033bSKonstantin Ananyevtypedef struct ngx_cached_open_file_s  ngx_cached_open_file_t;
55e18a033bSKonstantin Ananyev
56e18a033bSKonstantin Ananyevstruct ngx_cached_open_file_s {
57e18a033bSKonstantin Ananyev    ngx_rbtree_node_t        node;
58e18a033bSKonstantin Ananyev    ngx_queue_t              queue;
59e18a033bSKonstantin Ananyev
60e18a033bSKonstantin Ananyev    u_char                  *name;
61e18a033bSKonstantin Ananyev    time_t                   created;
62e18a033bSKonstantin Ananyev    time_t                   accessed;
63e18a033bSKonstantin Ananyev
64e18a033bSKonstantin Ananyev    ngx_fd_t                 fd;
65e18a033bSKonstantin Ananyev    ngx_file_uniq_t          uniq;
66e18a033bSKonstantin Ananyev    time_t                   mtime;
67e18a033bSKonstantin Ananyev    off_t                    size;
68e18a033bSKonstantin Ananyev    ngx_err_t                err;
69e18a033bSKonstantin Ananyev
70e18a033bSKonstantin Ananyev    uint32_t                 uses;
71e18a033bSKonstantin Ananyev
72e18a033bSKonstantin Ananyev#if (NGX_HAVE_OPENAT)
73e18a033bSKonstantin Ananyev    size_t                   disable_symlinks_from;
74e18a033bSKonstantin Ananyev    unsigned                 disable_symlinks:2;
75e18a033bSKonstantin Ananyev#endif
76e18a033bSKonstantin Ananyev
77e18a033bSKonstantin Ananyev    unsigned                 count:24;
78e18a033bSKonstantin Ananyev    unsigned                 close:1;
79e18a033bSKonstantin Ananyev    unsigned                 use_event:1;
80e18a033bSKonstantin Ananyev
81e18a033bSKonstantin Ananyev    unsigned                 is_dir:1;
82e18a033bSKonstantin Ananyev    unsigned                 is_file:1;
83e18a033bSKonstantin Ananyev    unsigned                 is_link:1;
84e18a033bSKonstantin Ananyev    unsigned                 is_exec:1;
85e18a033bSKonstantin Ananyev    unsigned                 is_directio:1;
86e18a033bSKonstantin Ananyev
87e18a033bSKonstantin Ananyev    ngx_event_t             *event;
88e18a033bSKonstantin Ananyev};
89e18a033bSKonstantin Ananyev
90e18a033bSKonstantin Ananyev
91e18a033bSKonstantin Ananyevtypedef struct {
92e18a033bSKonstantin Ananyev    ngx_rbtree_t             rbtree;
93e18a033bSKonstantin Ananyev    ngx_rbtree_node_t        sentinel;
94e18a033bSKonstantin Ananyev    ngx_queue_t              expire_queue;
95e18a033bSKonstantin Ananyev
96e18a033bSKonstantin Ananyev    ngx_uint_t               current;
97e18a033bSKonstantin Ananyev    ngx_uint_t               max;
98e18a033bSKonstantin Ananyev    time_t                   inactive;
99e18a033bSKonstantin Ananyev} ngx_open_file_cache_t;
100e18a033bSKonstantin Ananyev
101e18a033bSKonstantin Ananyev
102e18a033bSKonstantin Ananyevtypedef struct {
103e18a033bSKonstantin Ananyev    ngx_open_file_cache_t   *cache;
104e18a033bSKonstantin Ananyev    ngx_cached_open_file_t  *file;
105e18a033bSKonstantin Ananyev    ngx_uint_t               min_uses;
106e18a033bSKonstantin Ananyev    ngx_log_t               *log;
107e18a033bSKonstantin Ananyev} ngx_open_file_cache_cleanup_t;
108e18a033bSKonstantin Ananyev
109e18a033bSKonstantin Ananyev
110e18a033bSKonstantin Ananyevtypedef struct {
111e18a033bSKonstantin Ananyev
112e18a033bSKonstantin Ananyev    /* ngx_connection_t stub to allow use c->fd as event ident */
113e18a033bSKonstantin Ananyev    void                    *data;
114e18a033bSKonstantin Ananyev    ngx_event_t             *read;
115e18a033bSKonstantin Ananyev    ngx_event_t             *write;
116e18a033bSKonstantin Ananyev    ngx_fd_t                 fd;
117e18a033bSKonstantin Ananyev
118e18a033bSKonstantin Ananyev    ngx_cached_open_file_t  *file;
119e18a033bSKonstantin Ananyev    ngx_open_file_cache_t   *cache;
120e18a033bSKonstantin Ananyev} ngx_open_file_cache_event_t;
121e18a033bSKonstantin Ananyev
122e18a033bSKonstantin Ananyev
123e18a033bSKonstantin Ananyevngx_open_file_cache_t *ngx_open_file_cache_init(ngx_pool_t *pool,
124e18a033bSKonstantin Ananyev    ngx_uint_t max, time_t inactive);
125e18a033bSKonstantin Ananyevngx_int_t ngx_open_cached_file(ngx_open_file_cache_t *cache, ngx_str_t *name,
126e18a033bSKonstantin Ananyev    ngx_open_file_info_t *of, ngx_pool_t *pool);
127e18a033bSKonstantin Ananyev
128e18a033bSKonstantin Ananyev
129e18a033bSKonstantin Ananyev#endif /* _NGX_OPEN_FILE_CACHE_H_INCLUDED_ */
130