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