xref: /lighttpd1.4/src/plugin_config.h (revision 2a7d3a27)
15977ce2bSGlenn Strauss #ifndef INCLUDE_PLUGIN_CONFIG_H
25977ce2bSGlenn Strauss #define INCLUDE_PLUGIN_CONFIG_H
35977ce2bSGlenn Strauss #include "first.h"
45977ce2bSGlenn Strauss 
55977ce2bSGlenn Strauss #include "base_decls.h"
65977ce2bSGlenn Strauss #include "array.h"
75977ce2bSGlenn Strauss #include "buffer.h"
85977ce2bSGlenn Strauss 
95977ce2bSGlenn Strauss /**
105977ce2bSGlenn Strauss  * possible compare ops in the configfile parser
115977ce2bSGlenn Strauss  */
125977ce2bSGlenn Strauss typedef enum {
135977ce2bSGlenn Strauss 	CONFIG_COND_UNSET,
145977ce2bSGlenn Strauss 	CONFIG_COND_EQ,      /** == */
155977ce2bSGlenn Strauss 	CONFIG_COND_MATCH,   /** =~ */
165977ce2bSGlenn Strauss 	CONFIG_COND_NE,      /** != */
175977ce2bSGlenn Strauss 	CONFIG_COND_NOMATCH, /** !~ */
1839c31278SGlenn Strauss 	CONFIG_COND_PREFIX,  /** =^ */ /*(use ELSE for not-prefix)*/
1939c31278SGlenn Strauss 	CONFIG_COND_SUFFIX,  /** =$ */ /*(use ELSE for not-suffix)*/
205977ce2bSGlenn Strauss 	CONFIG_COND_ELSE     /** (always true if reached) */
215977ce2bSGlenn Strauss } config_cond_t;
225977ce2bSGlenn Strauss 
235977ce2bSGlenn Strauss /**
245977ce2bSGlenn Strauss  * possible fields to match against
255977ce2bSGlenn Strauss  */
265977ce2bSGlenn Strauss typedef enum {
275977ce2bSGlenn Strauss 	COMP_UNSET,
285977ce2bSGlenn Strauss 	COMP_SERVER_SOCKET,
295977ce2bSGlenn Strauss 	COMP_HTTP_URL,
305977ce2bSGlenn Strauss 	COMP_HTTP_HOST,
315977ce2bSGlenn Strauss 	COMP_HTTP_REFERER,        /*(subsumed by COMP_HTTP_REQUEST_HEADER)*/
325977ce2bSGlenn Strauss 	COMP_HTTP_USER_AGENT,     /*(subsumed by COMP_HTTP_REQUEST_HEADER)*/
335977ce2bSGlenn Strauss 	COMP_HTTP_LANGUAGE,       /*(subsumed by COMP_HTTP_REQUEST_HEADER)*/
345977ce2bSGlenn Strauss 	COMP_HTTP_COOKIE,         /*(subsumed by COMP_HTTP_REQUEST_HEADER)*/
355977ce2bSGlenn Strauss 	COMP_HTTP_REMOTE_IP,
365977ce2bSGlenn Strauss 	COMP_HTTP_QUERY_STRING,
375977ce2bSGlenn Strauss 	COMP_HTTP_SCHEME,
385977ce2bSGlenn Strauss 	COMP_HTTP_REQUEST_METHOD,
395977ce2bSGlenn Strauss 	COMP_HTTP_REQUEST_HEADER,
405977ce2bSGlenn Strauss 
415977ce2bSGlenn Strauss 	COMP_LAST_ELEMENT
425977ce2bSGlenn Strauss } comp_key_t;
435977ce2bSGlenn Strauss 
445977ce2bSGlenn Strauss typedef struct {
455977ce2bSGlenn Strauss 	comp_key_t comp;
465977ce2bSGlenn Strauss 	config_cond_t cond;
475977ce2bSGlenn Strauss 	const buffer *string;
48cf3e3012SGlenn Strauss 	const char *comp_key;
495977ce2bSGlenn Strauss } config_cond_info;
505977ce2bSGlenn Strauss 
515977ce2bSGlenn Strauss __attribute_cold__
527c7f8c46SGlenn Strauss void config_get_config_cond_info(config_cond_info *cfginfo, uint32_t idx);
535977ce2bSGlenn Strauss 
545977ce2bSGlenn Strauss __attribute_cold__
557ea2d407SGlenn Strauss int config_capture(server *srv, int idx);
567ea2d407SGlenn Strauss 
577ea2d407SGlenn Strauss __attribute_cold__
585977ce2bSGlenn Strauss void config_init(server *srv);
595977ce2bSGlenn Strauss 
605977ce2bSGlenn Strauss __attribute_cold__
615977ce2bSGlenn Strauss void config_print(server *srv);
625977ce2bSGlenn Strauss 
635977ce2bSGlenn Strauss __attribute_cold__
645977ce2bSGlenn Strauss int config_read(server *srv, const char *fn);
655977ce2bSGlenn Strauss 
665977ce2bSGlenn Strauss __attribute_cold__
675977ce2bSGlenn Strauss int config_set_defaults(server *srv);
685977ce2bSGlenn Strauss 
695977ce2bSGlenn Strauss __attribute_cold__
705977ce2bSGlenn Strauss int config_finalize(server *srv, const buffer *default_server_tag);
715977ce2bSGlenn Strauss 
725977ce2bSGlenn Strauss __attribute_cold__
735977ce2bSGlenn Strauss void config_free(server *srv);
745977ce2bSGlenn Strauss 
75fda01e33SGlenn Strauss __attribute_cold__
76fda01e33SGlenn Strauss int config_log_error_open(server *srv);
77fda01e33SGlenn Strauss 
78fda01e33SGlenn Strauss __attribute_cold__
79fda01e33SGlenn Strauss void config_log_error_close(server *srv);
80fda01e33SGlenn Strauss 
815977ce2bSGlenn Strauss void config_reset_config_bytes_sec(void *p);
825977ce2bSGlenn Strauss 
83d5366c0aSGlenn Strauss /*void config_reset_config(request_st *r);*//* moved to request_config_reset()*/
847c7f8c46SGlenn Strauss void config_patch_config(request_st *r);
855977ce2bSGlenn Strauss 
867c7f8c46SGlenn Strauss void config_cond_cache_reset(request_st *r);
877c7f8c46SGlenn Strauss void config_cond_cache_reset_item(request_st *r, comp_key_t item);
885977ce2bSGlenn Strauss 
895977ce2bSGlenn Strauss typedef enum { T_CONFIG_UNSET,
905977ce2bSGlenn Strauss 		T_CONFIG_STRING,
915977ce2bSGlenn Strauss 		T_CONFIG_SHORT,
925977ce2bSGlenn Strauss 		T_CONFIG_INT,
935977ce2bSGlenn Strauss 		T_CONFIG_BOOL,
945977ce2bSGlenn Strauss 		T_CONFIG_ARRAY,
9503b4c993SGlenn Strauss 		T_CONFIG_ARRAY_KVANY,
9603b4c993SGlenn Strauss 		T_CONFIG_ARRAY_KVARRAY,
9703b4c993SGlenn Strauss 		T_CONFIG_ARRAY_KVSTRING,
9803b4c993SGlenn Strauss 		T_CONFIG_ARRAY_VLIST,
995977ce2bSGlenn Strauss 		T_CONFIG_LOCAL,
1005977ce2bSGlenn Strauss 		T_CONFIG_DEPRECATED,
1015977ce2bSGlenn Strauss 		T_CONFIG_UNSUPPORTED
1025977ce2bSGlenn Strauss } config_values_type_t;
1035977ce2bSGlenn Strauss 
1045977ce2bSGlenn Strauss typedef enum { T_CONFIG_SCOPE_UNSET,
1055977ce2bSGlenn Strauss 		T_CONFIG_SCOPE_SERVER,
106b1f7ccd7SGlenn Strauss 		T_CONFIG_SCOPE_CONNECTION,
107b1f7ccd7SGlenn Strauss 		T_CONFIG_SCOPE_SOCKET
1085977ce2bSGlenn Strauss } config_scope_type_t;
1095977ce2bSGlenn Strauss 
1105977ce2bSGlenn Strauss typedef struct config_plugin_value {
1115977ce2bSGlenn Strauss     int k_id;
1125977ce2bSGlenn Strauss     config_values_type_t vtype;
1135977ce2bSGlenn Strauss     union v_u {
1145977ce2bSGlenn Strauss       void *v;
1155977ce2bSGlenn Strauss       const array *a;
1165977ce2bSGlenn Strauss       const buffer *b;
1175977ce2bSGlenn Strauss       const char *s;
1185977ce2bSGlenn Strauss       unsigned int u;
1195977ce2bSGlenn Strauss       unsigned short int shrt;
1205977ce2bSGlenn Strauss       double d;
1215977ce2bSGlenn Strauss       off_t o;
1225977ce2bSGlenn Strauss       uint32_t u2[2];
1235977ce2bSGlenn Strauss     } v;
1245977ce2bSGlenn Strauss } config_plugin_value_t;
1255977ce2bSGlenn Strauss 
1265977ce2bSGlenn Strauss typedef struct {
1275977ce2bSGlenn Strauss     const char *k;
128e50aa1b0SGlenn Strauss     uint8_t klen;    /* directives must be <= 255 chars */
129e50aa1b0SGlenn Strauss     /*uint8_t k_id;*//*(array index is used for k_id)*/
130e50aa1b0SGlenn Strauss     uint8_t ktype;   /* config_values_type_t */
131e50aa1b0SGlenn Strauss     uint8_t scope;   /* config_scope_type_t */
1325977ce2bSGlenn Strauss } config_plugin_keys_t;
1335977ce2bSGlenn Strauss 
1345977ce2bSGlenn Strauss __attribute_cold__
13519bc8885SGlenn Strauss __attribute_pure__
1360045b9aaSGlenn Strauss int config_plugin_value_tobool(const data_unset *du, int default_value);
1375f7bf472SGlenn Strauss 
1385f7bf472SGlenn Strauss __attribute_cold__
13919bc8885SGlenn Strauss __attribute_pure__
1400045b9aaSGlenn Strauss int32_t config_plugin_value_to_int32 (const data_unset *du, int32_t default_value);
141d6f692f1SGlenn Strauss 
142d6f692f1SGlenn Strauss __attribute_cold__
1435977ce2bSGlenn Strauss int config_plugin_values_init_block(server * const srv, const array * const ca, const config_plugin_keys_t * const cpk, const char * const mname, config_plugin_value_t *cpv);
1445977ce2bSGlenn Strauss 
1455977ce2bSGlenn Strauss __attribute_cold__
1465977ce2bSGlenn Strauss int config_plugin_values_init(server *srv, void *p_d, const config_plugin_keys_t *cpk, const char *mname);
1475977ce2bSGlenn Strauss 
148c193da34SGlenn Strauss typedef enum {
149c193da34SGlenn Strauss     /* condition not active at the moment because itself or some
150c193da34SGlenn Strauss      * pre-condition depends on data not available yet
151c193da34SGlenn Strauss      */
152c193da34SGlenn Strauss     COND_RESULT_UNSET,
153c193da34SGlenn Strauss 
154c193da34SGlenn Strauss     /* special "unset" for branches not selected due to pre-conditions
155c193da34SGlenn Strauss      * not met (but pre-conditions are not "unset" anymore)
156c193da34SGlenn Strauss      */
157c193da34SGlenn Strauss     COND_RESULT_SKIP,
158c193da34SGlenn Strauss 
159c193da34SGlenn Strauss     /* actually evaluated the condition itself */
160c193da34SGlenn Strauss     COND_RESULT_FALSE, /* not active */
161c193da34SGlenn Strauss     COND_RESULT_TRUE   /* active */
162c193da34SGlenn Strauss } cond_result_t;
163c193da34SGlenn Strauss 
164c193da34SGlenn Strauss typedef struct cond_cache_t {
165c193da34SGlenn Strauss     /* current result (with preconditions) */
166c193da34SGlenn Strauss     int8_t result;        /*(cond_result_t)*/
167c193da34SGlenn Strauss     /* result without preconditions (must never be "skip") */
168c193da34SGlenn Strauss     int8_t local_result;  /*(cond_result_t)*/
1696d47d4c6SGlenn Strauss } cond_cache_t; /* 2 bytes (2^1) */
170c193da34SGlenn Strauss 
1717512d82cSGlenn Strauss #ifdef HAVE_PCRE2_H
1727512d82cSGlenn Strauss struct pcre2_real_match_data_8; /* declaration */
1737512d82cSGlenn Strauss #endif
1747512d82cSGlenn Strauss 
175c193da34SGlenn Strauss typedef struct cond_match_t {
176c193da34SGlenn Strauss     const buffer *comp_value; /* just a pointer */
1777512d82cSGlenn Strauss  #ifdef HAVE_PCRE2_H
1787512d82cSGlenn Strauss     struct pcre2_real_match_data_8 *match_data;
1797512d82cSGlenn Strauss  #endif
180c378e3adSGlenn Strauss     int captures;
181c378e3adSGlenn Strauss     void *matches; /* pcre2:(PCRE2_SIZE *), pcre:(int *) */
1826d47d4c6SGlenn Strauss } cond_match_t;
183c193da34SGlenn Strauss 
1847c7f8c46SGlenn Strauss int config_check_cond(request_st *r, int context_ndx);
1855977ce2bSGlenn Strauss 
1864d99d9b7SGlenn Strauss __attribute_cold__
1874d99d9b7SGlenn Strauss __attribute_pure__
1884d99d9b7SGlenn Strauss int config_feature_bool (const server *srv, const char *feature, int default_value);
1894d99d9b7SGlenn Strauss 
1904d99d9b7SGlenn Strauss __attribute_cold__
1914d99d9b7SGlenn Strauss __attribute_pure__
1924d99d9b7SGlenn Strauss int32_t config_feature_int (const server *srv, const char *feature, int32_t default_value);
1934d99d9b7SGlenn Strauss 
19496557115SGlenn Strauss 
19596557115SGlenn Strauss /**
196*2a7d3a27SGlenn Strauss  * plugin statistics
197*2a7d3a27SGlenn Strauss  * convention: key is <module-prefix>.<name>, value is counter
19896557115SGlenn Strauss  *
19996557115SGlenn Strauss  * example:
20096557115SGlenn Strauss  *   fastcgi.backends        = 10
20196557115SGlenn Strauss  *   fastcgi.active-backends = 6
20296557115SGlenn Strauss  *   fastcgi.backend.<key>.load = 24
20396557115SGlenn Strauss  *   fastcgi.backend.<key>....
20496557115SGlenn Strauss  *
20596557115SGlenn Strauss  *   fastcgi.backend.<key>.disconnects = ...
20696557115SGlenn Strauss  */
20796557115SGlenn Strauss extern array plugin_stats;
20896557115SGlenn Strauss 
209*2a7d3a27SGlenn Strauss #define plugin_stats_get_ptr(s, len) \
210*2a7d3a27SGlenn Strauss         array_get_int_ptr(&plugin_stats, (s), (len))
211*2a7d3a27SGlenn Strauss 
212*2a7d3a27SGlenn Strauss #define plugin_stats_incr(s, len) \
213*2a7d3a27SGlenn Strauss         (++(*array_get_int_ptr(&plugin_stats, (s), (len))))
214*2a7d3a27SGlenn Strauss 
215*2a7d3a27SGlenn Strauss #define plugin_stats_inc(s) \
216*2a7d3a27SGlenn Strauss         plugin_stats_incr((s), sizeof(s)-1)
217*2a7d3a27SGlenn Strauss 
218*2a7d3a27SGlenn Strauss #define plugin_stats_decr(s, len) \
219*2a7d3a27SGlenn Strauss         (--(*array_get_int_ptr(&plugin_stats, (s), (len))))
220*2a7d3a27SGlenn Strauss 
221*2a7d3a27SGlenn Strauss #define plugin_stats_set(s, len, val) \
222*2a7d3a27SGlenn Strauss         (*array_get_int_ptr(&plugin_stats, (s), (len)) = (val))
223*2a7d3a27SGlenn Strauss 
22496557115SGlenn Strauss 
2255977ce2bSGlenn Strauss #endif
226