blob: be9975ebfdca6d47e05d56fee223e59cf69c50e6 [file] [log] [blame]
Thierry FOURNIERed66c292013-11-28 11:05:19 +01001/*
2 * include/proto/pattern.h
3 * This file provides structures and types for pattern matching.
4 *
5 * Copyright (C) 2000-2013 Willy Tarreau - w@1wt.eu
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation, version 2.1
10 * exclusively.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22#ifndef _PROTO_PATTERN_H
23#define _PROTO_PATTERN_H
24
Willy Tarreau6f8fe312013-11-28 22:24:25 +010025#include <string.h>
26
Willy Tarreau0cba6072013-11-28 22:21:02 +010027#include <common/config.h>
28#include <common/standard.h>
29#include <types/pattern.h>
30
Thierry FOURNIER1e00d382014-02-11 11:31:40 +010031void pattern_finalize_config(void);
Thierry FOURNIERed66c292013-11-28 11:05:19 +010032
Willy Tarreau6f8fe312013-11-28 22:24:25 +010033/* return the PAT_MATCH_* index for match name "name", or < 0 if not found */
34static inline int pat_find_match_name(const char *name)
35{
36 int i;
37
38 for (i = 0; i < PAT_MATCH_NUM; i++)
39 if (strcmp(name, pat_match_names[i]) == 0)
40 return i;
41 return -1;
42}
43
Thierry FOURNIERed66c292013-11-28 11:05:19 +010044/* This function executes a pattern match on a sample. It applies pattern <expr>
Thierry FOURNIER1794fdf2014-01-17 15:25:13 +010045 * to sample <smp>. The function returns NULL if the sample dont match. It returns
46 * non-null if the sample match. If <fill> is true and the sample match, the
47 * function returns the matched pattern. In many cases, this pattern can be a
48 * static buffer.
Thierry FOURNIERed66c292013-11-28 11:05:19 +010049 */
Thierry FOURNIER1e00d382014-02-11 11:31:40 +010050struct pattern *pattern_exec_match(struct pattern_head *head, struct sample *smp, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +010051
52/*
53 *
Thierry FOURNIERb9b08462013-12-13 15:12:32 +010054 * The following function gets "pattern", duplicate it and index it in "expr"
55 *
56 */
57int pat_idx_list_val(struct pattern_expr *expr, struct pattern *pat, char **err);
58int pat_idx_list_ptr(struct pattern_expr *expr, struct pattern *pat, char **err);
59int pat_idx_list_str(struct pattern_expr *expr, struct pattern *pat, char **err);
60int pat_idx_list_reg(struct pattern_expr *expr, struct pattern *pat, char **err);
61int pat_idx_tree_ip(struct pattern_expr *expr, struct pattern *pat, char **err);
62int pat_idx_tree_str(struct pattern_expr *expr, struct pattern *pat, char **err);
63
64/*
65 *
Thierry FOURNIERb1136502014-01-15 11:38:49 +010066 * The following functions search pattern <pattern> into the pattern
67 * expression <expr>. If the pattern is found, delete it. This function
68 * never fails.
69 *
70 */
Thierry FOURNIER7acca4b2014-01-28 16:43:36 +010071void pat_del_list_val(struct pattern_expr *expr, struct pat_ref_elt *ref);
72void pat_del_tree_ip(struct pattern_expr *expr, struct pat_ref_elt *ref);
73void pat_del_list_ptr(struct pattern_expr *expr, struct pat_ref_elt *ref);
74void pat_del_tree_str(struct pattern_expr *expr, struct pat_ref_elt *ref);
75void pat_del_list_reg(struct pattern_expr *expr, struct pat_ref_elt *ref);
Thierry FOURNIERb1136502014-01-15 11:38:49 +010076
77/*
78 *
Thierry FOURNIER55d0b102014-01-15 11:25:26 +010079 * The following function lookup the pattern and return a pointer on the
80 * pointer containing the sample expression. This is useful to replace
81 * the sample.
82 *
83 */
84struct sample_storage **pat_find_smp_list_val(struct pattern_expr *expr, struct pattern *pattern);
85struct sample_storage **pat_find_smp_tree_ip(struct pattern_expr *expr, struct pattern *pattern);
86struct sample_storage **pat_find_smp_list_ptr(struct pattern_expr *expr, struct pattern *pattern);
87struct sample_storage **pat_find_smp_tree_str(struct pattern_expr *expr, struct pattern *pattern);
88struct sample_storage **pat_find_smp_list_str(struct pattern_expr *expr, struct pattern *pattern);
89struct sample_storage **pat_find_smp_list_reg(struct pattern_expr *expr, struct pattern *pattern);
90
91/*
92 *
Thierry FOURNIER6f7203d2014-01-14 16:24:51 +010093 * The following functions clean all entries of a pattern expression and
94 * reset the tree and list root.
95 *
96 */
97void pat_prune_val(struct pattern_expr *expr);
98void pat_prune_ptr(struct pattern_expr *expr);
99void pat_prune_reg(struct pattern_expr *expr);
100
101/*
102 *
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100103 * The following functions are general purpose pattern matching functions.
104 *
105 */
106
107
108/* ignore the current line */
Thierry FOURNIERedc15c32013-12-13 15:36:59 +0100109int pat_parse_nothing(const char *text, struct pattern *pattern, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100110
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100111/* Parse an integer. It is put both in min and max. */
Thierry FOURNIERedc15c32013-12-13 15:36:59 +0100112int pat_parse_int(const char *text, struct pattern *pattern, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100113
114/* Parse an version. It is put both in min and max. */
Thierry FOURNIERedc15c32013-12-13 15:36:59 +0100115int pat_parse_dotted_ver(const char *text, struct pattern *pattern, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100116
117/* Parse a range of integers delimited by either ':' or '-'. If only one
118 * integer is read, it is set as both min and max.
119 */
Thierry FOURNIERedc15c32013-12-13 15:36:59 +0100120int pat_parse_range(const char *text, struct pattern *pattern, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100121
122/* Parse a string. It is allocated and duplicated. */
Thierry FOURNIERedc15c32013-12-13 15:36:59 +0100123int pat_parse_str(const char *text, struct pattern *pattern, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100124
125/* Parse a hexa binary definition. It is allocated and duplicated. */
Thierry FOURNIERedc15c32013-12-13 15:36:59 +0100126int pat_parse_bin(const char *text, struct pattern *pattern, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100127
128/* Parse a regex. It is allocated. */
Thierry FOURNIERedc15c32013-12-13 15:36:59 +0100129int pat_parse_reg(const char *text, struct pattern *pattern, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100130
131/* Parse an IP address and an optional mask in the form addr[/mask].
132 * The addr may either be an IPv4 address or a hostname. The mask
133 * may either be a dotted mask or a number of bits. Returns 1 if OK,
134 * otherwise 0.
135 */
Thierry FOURNIERedc15c32013-12-13 15:36:59 +0100136int pat_parse_ip(const char *text, struct pattern *pattern, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100137
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100138/* NB: For two strings to be identical, it is required that their lengths match */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100139struct pattern *pat_match_str(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100140
141/* NB: For two binary buffers to be identical, it is required that their lengths match */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100142struct pattern *pat_match_bin(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100143
144/* Checks that the length of the pattern in <test> is included between min and max */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100145struct pattern *pat_match_len(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100146
147/* Checks that the integer in <test> is included between min and max */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100148struct pattern *pat_match_int(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100149
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100150/* always return false */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100151struct pattern *pat_match_nothing(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100152
153/* Checks that the pattern matches the end of the tested string. */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100154struct pattern *pat_match_end(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100155
156/* Checks that the pattern matches the beginning of the tested string. */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100157struct pattern *pat_match_beg(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100158
159/* Checks that the pattern is included inside the tested string. */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100160struct pattern *pat_match_sub(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100161
162/* Checks that the pattern is included inside the tested string, but enclosed
163 * between slashes or at the beginning or end of the string. Slashes at the
164 * beginning or end of the pattern are ignored.
165 */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100166struct pattern *pat_match_dir(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100167
168/* Checks that the pattern is included inside the tested string, but enclosed
169 * between dots or at the beginning or end of the string. Dots at the beginning
170 * or end of the pattern are ignored.
171 */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100172struct pattern *pat_match_dom(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100173
174/* Check that the IPv4 address in <test> matches the IP/mask in pattern */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100175struct pattern *pat_match_ip(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100176
177/* Executes a regex. It temporarily changes the data to add a trailing zero,
178 * and restores the previous character when leaving.
179 */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100180struct pattern *pat_match_reg(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100181
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100182/*
183 * pattern_ref manipulation.
184 */
185struct pat_ref *pat_ref_lookup(const char *reference);
Thierry FOURNIERaf5a29d2014-03-11 14:29:22 +0100186struct pat_ref *pat_ref_lookupid(int unique_id);
Thierry FOURNIER0d6ba512014-02-11 03:31:34 +0100187struct pat_ref *pat_ref_new(const char *reference, const char *display, unsigned int flags);
188struct pat_ref *pat_ref_newid(int unique_id, const char *display, unsigned int flags);
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100189int pat_ref_append(struct pat_ref *ref, char *pattern, char *sample, int line);
190int pat_ref_add(struct pat_ref *ref, const char *pattern, const char *sample, char **err);
191int pat_ref_set(struct pat_ref *ref, const char *pattern, const char *sample);
192int pat_ref_delete(struct pat_ref *ref, const char *key);
Thierry FOURNIER7acca4b2014-01-28 16:43:36 +0100193int pat_ref_delete_by_id(struct pat_ref *ref, struct pat_ref_elt *refelt);
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100194void pat_ref_prune(struct pat_ref *ref);
195int pat_ref_load(struct pat_ref *ref, struct pattern_expr *expr, int patflags, int soe, char **err);
196
197/*
198 * pattern_head manipulation.
199 */
200void pattern_init_head(struct pattern_head *head);
201void pattern_prune(struct pattern_head *head);
Thierry FOURNIER0d6ba512014-02-11 03:31:34 +0100202int pattern_read_from_file(struct pattern_head *head, unsigned int refflags, const char *filename, int patflags, char **err, const char *display);
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100203
204/*
205 * pattern_expr manipulation.
206 */
Thierry FOURNIERa65b3432013-11-28 18:22:00 +0100207void pattern_init_expr(struct pattern_expr *expr);
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100208struct pattern_expr *pattern_lookup_expr(struct pattern_head *head, struct pat_ref *ref);
209struct pattern_expr *pattern_new_expr(struct pattern_head *head, struct pat_ref *ref, char **err);
Thierry FOURNIER55d0b102014-01-15 11:25:26 +0100210struct sample_storage **pattern_find_smp(const char *key, struct pattern_expr *expr, char **err);
Thierry FOURNIER7acca4b2014-01-28 16:43:36 +0100211int pattern_delete(struct pattern_expr *expr, struct pat_ref_elt *ref);
Thierry FOURNIER01cdcd42013-12-10 15:08:01 +0100212
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100213
214#endif