1 #ifndef ARRAY_H 2 #define ARRAY_H 3 #include "first.h" 4 5 #ifdef HAVE_PCRE_H 6 # include <pcre.h> 7 #endif 8 9 #include "buffer.h" 10 #include "vector.h" 11 12 #include <stdlib.h> 13 14 #define DATA_IS_STRING(x) (x->type == TYPE_STRING) 15 16 typedef enum { TYPE_UNSET, TYPE_STRING, TYPE_OTHER, TYPE_ARRAY, TYPE_INTEGER, TYPE_FASTCGI, TYPE_CONFIG } data_type_t; 17 #define DATA_UNSET \ 18 data_type_t type; \ 19 buffer *key; \ 20 int is_index_key; /* 1 if key is a array index (autogenerated keys) */ \ 21 struct data_unset *(*copy)(const struct data_unset *src); \ 22 void (* free)(struct data_unset *p); \ 23 void (* reset)(struct data_unset *p); \ 24 int (*insert_dup)(struct data_unset *dst, struct data_unset *src); \ 25 void (*print)(const struct data_unset *p, int depth) 26 27 typedef struct data_unset { 28 DATA_UNSET; 29 } data_unset; 30 31 typedef struct { 32 data_unset **data; 33 34 size_t *sorted; 35 36 size_t used; /* <= SSIZE_MAX */ 37 size_t size; 38 39 size_t unique_ndx; 40 } array; 41 42 typedef struct { 43 DATA_UNSET; 44 45 buffer *value; 46 } data_string; 47 48 data_string *data_string_init(void); 49 data_string *data_response_init(void); 50 51 typedef struct { 52 DATA_UNSET; 53 54 array *value; 55 } data_array; 56 57 data_array *data_array_init(void); 58 59 /** 60 * possible compare ops in the configfile parser 61 */ 62 typedef enum { 63 CONFIG_COND_UNSET, 64 CONFIG_COND_EQ, /** == */ 65 CONFIG_COND_MATCH, /** =~ */ 66 CONFIG_COND_NE, /** != */ 67 CONFIG_COND_NOMATCH, /** !~ */ 68 CONFIG_COND_ELSE /** (always true if reached) */ 69 } config_cond_t; 70 71 /** 72 * possible fields to match against 73 */ 74 typedef enum { 75 COMP_UNSET, 76 COMP_SERVER_SOCKET, 77 COMP_HTTP_URL, 78 COMP_HTTP_HOST, 79 COMP_HTTP_REFERER, 80 COMP_HTTP_USER_AGENT, 81 COMP_HTTP_LANGUAGE, 82 COMP_HTTP_COOKIE, 83 COMP_HTTP_REMOTE_IP, 84 COMP_HTTP_QUERY_STRING, 85 COMP_HTTP_SCHEME, 86 COMP_HTTP_REQUEST_METHOD, 87 88 COMP_LAST_ELEMENT 89 } comp_key_t; 90 91 /* $HTTP["host"] == "incremental.home.kneschke.de" { ... } 92 * for print: comp_key op string 93 * for compare: comp cond string/regex 94 */ 95 96 typedef struct data_config data_config; 97 DEFINE_TYPED_VECTOR_NO_RELEASE(config_weak, data_config*); 98 99 struct data_config { 100 DATA_UNSET; 101 102 array *value; 103 104 buffer *comp_key; 105 comp_key_t comp; 106 107 config_cond_t cond; 108 buffer *op; 109 110 int context_ndx; /* more or less like an id */ 111 vector_config_weak children; 112 /* nested */ 113 data_config *parent; 114 /* for chaining only */ 115 data_config *prev; 116 data_config *next; 117 118 buffer *string; 119 #ifdef HAVE_PCRE_H 120 pcre *regex; 121 pcre_extra *regex_study; 122 #endif 123 }; 124 125 data_config *data_config_init(void); 126 127 typedef struct { 128 DATA_UNSET; 129 130 int value; 131 } data_integer; 132 133 data_integer *data_integer_init(void); 134 135 typedef struct { 136 DATA_UNSET; 137 138 buffer *host; 139 140 unsigned short port; 141 142 time_t disable_ts; 143 int is_disabled; 144 size_t balance; 145 146 int usage; /* fair-balancing needs the no. of connections active on this host */ 147 int last_used_ndx; /* round robin */ 148 } data_fastcgi; 149 150 data_fastcgi *data_fastcgi_init(void); 151 152 array *array_init(void); 153 array *array_init_array(array *a); 154 void array_free(array *a); 155 void array_reset(array *a); 156 void array_insert_unique(array *a, data_unset *entry); 157 data_unset *array_pop(array *a); /* only works on "simple" lists with autogenerated keys */ 158 int array_print(array *a, int depth); 159 data_unset *array_get_unused_element(array *a, data_type_t t); 160 data_unset *array_get_element(array *a, const char *key); 161 data_unset *array_extract_element(array *a, const char *key); /* removes found entry from array */ 162 void array_set_key_value(array *hdrs, const char *key, size_t key_len, const char *value, size_t val_len); 163 void array_replace(array *a, data_unset *entry); 164 int array_strcasecmp(const char *a, size_t a_len, const char *b, size_t b_len); 165 void array_print_indent(int depth); 166 size_t array_get_max_key_length(array *a); 167 168 #endif 169