blob: 7855474e5b447a892dc8777356317356ab30b841 [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
Willy Tarreaub4a163a2014-04-02 20:55:23 +020031/* pattern management function arrays */
32extern char *pat_match_names[PAT_MATCH_NUM];
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +020033extern int (*pat_parse_fcts[PAT_MATCH_NUM])(const char *, struct pattern *, int, char **);
Willy Tarreaub4a163a2014-04-02 20:55:23 +020034extern int (*pat_index_fcts[PAT_MATCH_NUM])(struct pattern_expr *, struct pattern *, char **);
35extern void (*pat_delete_fcts[PAT_MATCH_NUM])(struct pattern_expr *, struct pat_ref_elt *);
36extern void (*pat_prune_fcts[PAT_MATCH_NUM])(struct pattern_expr *);
37extern struct pattern *(*pat_match_fcts[PAT_MATCH_NUM])(struct sample *, struct pattern_expr *, int);
38extern int pat_match_types[PAT_MATCH_NUM];
39
Thierry FOURNIER1e00d382014-02-11 11:31:40 +010040void pattern_finalize_config(void);
Thierry FOURNIERed66c292013-11-28 11:05:19 +010041
Willy Tarreau6f8fe312013-11-28 22:24:25 +010042/* return the PAT_MATCH_* index for match name "name", or < 0 if not found */
43static inline int pat_find_match_name(const char *name)
44{
45 int i;
46
47 for (i = 0; i < PAT_MATCH_NUM; i++)
48 if (strcmp(name, pat_match_names[i]) == 0)
49 return i;
50 return -1;
51}
52
Thierry FOURNIERed66c292013-11-28 11:05:19 +010053/* This function executes a pattern match on a sample. It applies pattern <expr>
Thierry FOURNIER1794fdf2014-01-17 15:25:13 +010054 * to sample <smp>. The function returns NULL if the sample dont match. It returns
55 * non-null if the sample match. If <fill> is true and the sample match, the
56 * function returns the matched pattern. In many cases, this pattern can be a
57 * static buffer.
Thierry FOURNIERed66c292013-11-28 11:05:19 +010058 */
Thierry FOURNIER1e00d382014-02-11 11:31:40 +010059struct pattern *pattern_exec_match(struct pattern_head *head, struct sample *smp, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +010060
61/*
62 *
Thierry FOURNIERb9b08462013-12-13 15:12:32 +010063 * The following function gets "pattern", duplicate it and index it in "expr"
64 *
65 */
66int pat_idx_list_val(struct pattern_expr *expr, struct pattern *pat, char **err);
67int pat_idx_list_ptr(struct pattern_expr *expr, struct pattern *pat, char **err);
68int pat_idx_list_str(struct pattern_expr *expr, struct pattern *pat, char **err);
69int pat_idx_list_reg(struct pattern_expr *expr, struct pattern *pat, char **err);
70int pat_idx_tree_ip(struct pattern_expr *expr, struct pattern *pat, char **err);
71int pat_idx_tree_str(struct pattern_expr *expr, struct pattern *pat, char **err);
Willy Tarreaub1dd9bf2014-05-10 08:53:48 +020072int pat_idx_tree_pfx(struct pattern_expr *expr, struct pattern *pat, char **err);
Thierry FOURNIERb9b08462013-12-13 15:12:32 +010073
74/*
75 *
Thierry FOURNIERb1136502014-01-15 11:38:49 +010076 * The following functions search pattern <pattern> into the pattern
77 * expression <expr>. If the pattern is found, delete it. This function
78 * never fails.
79 *
80 */
Thierry FOURNIER7acca4b2014-01-28 16:43:36 +010081void pat_del_list_val(struct pattern_expr *expr, struct pat_ref_elt *ref);
82void pat_del_tree_ip(struct pattern_expr *expr, struct pat_ref_elt *ref);
83void pat_del_list_ptr(struct pattern_expr *expr, struct pat_ref_elt *ref);
84void pat_del_tree_str(struct pattern_expr *expr, struct pat_ref_elt *ref);
85void pat_del_list_reg(struct pattern_expr *expr, struct pat_ref_elt *ref);
Thierry FOURNIERb1136502014-01-15 11:38:49 +010086
87/*
88 *
Thierry FOURNIER6f7203d2014-01-14 16:24:51 +010089 * The following functions clean all entries of a pattern expression and
90 * reset the tree and list root.
91 *
92 */
93void pat_prune_val(struct pattern_expr *expr);
94void pat_prune_ptr(struct pattern_expr *expr);
95void pat_prune_reg(struct pattern_expr *expr);
96
97/*
98 *
Thierry FOURNIERed66c292013-11-28 11:05:19 +010099 * The following functions are general purpose pattern matching functions.
100 *
101 */
102
103
104/* ignore the current line */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200105int pat_parse_nothing(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100106
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100107/* Parse an integer. It is put both in min and max. */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200108int pat_parse_int(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100109
110/* Parse an version. It is put both in min and max. */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200111int pat_parse_dotted_ver(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100112
113/* Parse a range of integers delimited by either ':' or '-'. If only one
114 * integer is read, it is set as both min and max.
115 */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200116int pat_parse_range(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100117
118/* Parse a string. It is allocated and duplicated. */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200119int pat_parse_str(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100120
121/* Parse a hexa binary definition. It is allocated and duplicated. */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200122int pat_parse_bin(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100123
124/* Parse a regex. It is allocated. */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200125int pat_parse_reg(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100126
127/* Parse an IP address and an optional mask in the form addr[/mask].
128 * The addr may either be an IPv4 address or a hostname. The mask
129 * may either be a dotted mask or a number of bits. Returns 1 if OK,
130 * otherwise 0.
131 */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200132int pat_parse_ip(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100133
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100134/* NB: For two strings to be identical, it is required that their lengths match */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100135struct pattern *pat_match_str(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100136
137/* NB: For two binary buffers to be identical, it is required that their lengths match */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100138struct pattern *pat_match_bin(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100139
140/* Checks that the length of the pattern in <test> is included between min and max */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100141struct pattern *pat_match_len(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100142
143/* Checks that the integer in <test> is included between min and max */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100144struct pattern *pat_match_int(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100145
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100146/* always return false */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100147struct pattern *pat_match_nothing(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100148
149/* Checks that the pattern matches the end of the tested string. */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100150struct pattern *pat_match_end(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100151
152/* Checks that the pattern matches the beginning of the tested string. */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100153struct pattern *pat_match_beg(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100154
155/* Checks that the pattern is included inside the tested string. */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100156struct pattern *pat_match_sub(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100157
158/* Checks that the pattern is included inside the tested string, but enclosed
159 * between slashes or at the beginning or end of the string. Slashes at the
160 * beginning or end of the pattern are ignored.
161 */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100162struct pattern *pat_match_dir(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100163
164/* Checks that the pattern is included inside the tested string, but enclosed
165 * between dots or at the beginning or end of the string. Dots at the beginning
166 * or end of the pattern are ignored.
167 */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100168struct pattern *pat_match_dom(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100169
170/* Check that the IPv4 address in <test> matches the IP/mask in pattern */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100171struct pattern *pat_match_ip(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100172
173/* Executes a regex. It temporarily changes the data to add a trailing zero,
174 * and restores the previous character when leaving.
175 */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100176struct pattern *pat_match_reg(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100177
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100178/*
179 * pattern_ref manipulation.
180 */
181struct pat_ref *pat_ref_lookup(const char *reference);
Thierry FOURNIERaf5a29d2014-03-11 14:29:22 +0100182struct pat_ref *pat_ref_lookupid(int unique_id);
Thierry FOURNIER0d6ba512014-02-11 03:31:34 +0100183struct pat_ref *pat_ref_new(const char *reference, const char *display, unsigned int flags);
184struct pat_ref *pat_ref_newid(int unique_id, const char *display, unsigned int flags);
Baptiste Assmann953f74d2014-04-25 16:57:03 +0200185struct pat_ref_elt *pat_ref_find_elt(struct pat_ref *ref, const char *key);
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100186int pat_ref_append(struct pat_ref *ref, char *pattern, char *sample, int line);
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200187int pat_ref_add(struct pat_ref *ref, const char *pattern, const char *sample, char **err);
Thierry FOURNIER364cfdf2014-01-29 19:08:49 +0100188int pat_ref_set(struct pat_ref *ref, const char *pattern, const char *sample, char **err);
189int pat_ref_set_by_id(struct pat_ref *ref, struct pat_ref_elt *refelt, const char *value, char **err);
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100190int pat_ref_delete(struct pat_ref *ref, const char *key);
Thierry FOURNIER7acca4b2014-01-28 16:43:36 +0100191int pat_ref_delete_by_id(struct pat_ref *ref, struct pat_ref_elt *refelt);
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100192void pat_ref_prune(struct pat_ref *ref);
193int pat_ref_load(struct pat_ref *ref, struct pattern_expr *expr, int patflags, int soe, char **err);
Thierry FOURNIER46006bd2014-03-21 21:45:15 +0100194void pat_ref_reload(struct pat_ref *ref, struct pat_ref *replace);
195
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100196
197/*
198 * pattern_head manipulation.
199 */
200void pattern_init_head(struct pattern_head *head);
201void pattern_prune(struct pattern_head *head);
Thierry FOURNIER94580c92014-02-11 14:36:45 +0100202int pattern_read_from_file(struct pattern_head *head, unsigned int refflags, const char *filename, int patflags, int load_smp, char **err, const char *file, int line);
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);
Thierry FOURNIER315ec422014-11-24 11:14:42 +0100209struct pattern_expr *pattern_new_expr(struct pattern_head *head, struct pat_ref *ref,
210 char **err, int *reuse);
Thierry FOURNIERe369ca22014-01-29 16:24:55 +0100211struct sample_storage **pattern_find_smp(struct pattern_expr *expr, struct pat_ref_elt *elt);
Thierry FOURNIER7acca4b2014-01-28 16:43:36 +0100212int pattern_delete(struct pattern_expr *expr, struct pat_ref_elt *ref);
Thierry FOURNIER01cdcd42013-12-10 15:08:01 +0100213
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100214
215#endif