blob: 40e87b8a61b568f3b09b43e5a48a682ec2f9b839 [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);
72
73/*
74 *
Thierry FOURNIERb1136502014-01-15 11:38:49 +010075 * The following functions search pattern <pattern> into the pattern
76 * expression <expr>. If the pattern is found, delete it. This function
77 * never fails.
78 *
79 */
Thierry FOURNIER7acca4b2014-01-28 16:43:36 +010080void pat_del_list_val(struct pattern_expr *expr, struct pat_ref_elt *ref);
81void pat_del_tree_ip(struct pattern_expr *expr, struct pat_ref_elt *ref);
82void pat_del_list_ptr(struct pattern_expr *expr, struct pat_ref_elt *ref);
83void pat_del_tree_str(struct pattern_expr *expr, struct pat_ref_elt *ref);
84void pat_del_list_reg(struct pattern_expr *expr, struct pat_ref_elt *ref);
Thierry FOURNIERb1136502014-01-15 11:38:49 +010085
86/*
87 *
Thierry FOURNIER6f7203d2014-01-14 16:24:51 +010088 * The following functions clean all entries of a pattern expression and
89 * reset the tree and list root.
90 *
91 */
92void pat_prune_val(struct pattern_expr *expr);
93void pat_prune_ptr(struct pattern_expr *expr);
94void pat_prune_reg(struct pattern_expr *expr);
95
96/*
97 *
Thierry FOURNIERed66c292013-11-28 11:05:19 +010098 * The following functions are general purpose pattern matching functions.
99 *
100 */
101
102
103/* ignore the current line */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200104int pat_parse_nothing(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100105
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100106/* Parse an integer. It is put both in min and max. */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200107int pat_parse_int(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100108
109/* Parse an version. It is put both in min and max. */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200110int pat_parse_dotted_ver(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100111
112/* Parse a range of integers delimited by either ':' or '-'. If only one
113 * integer is read, it is set as both min and max.
114 */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200115int pat_parse_range(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100116
117/* Parse a string. It is allocated and duplicated. */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200118int pat_parse_str(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100119
120/* Parse a hexa binary definition. It is allocated and duplicated. */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200121int pat_parse_bin(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100122
123/* Parse a regex. It is allocated. */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200124int pat_parse_reg(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100125
126/* Parse an IP address and an optional mask in the form addr[/mask].
127 * The addr may either be an IPv4 address or a hostname. The mask
128 * may either be a dotted mask or a number of bits. Returns 1 if OK,
129 * otherwise 0.
130 */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200131int pat_parse_ip(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100132
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100133/* NB: For two strings to be identical, it is required that their lengths match */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100134struct pattern *pat_match_str(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100135
136/* NB: For two binary buffers to be identical, it is required that their lengths match */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100137struct pattern *pat_match_bin(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100138
139/* Checks that the length of the pattern in <test> is included between min and max */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100140struct pattern *pat_match_len(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100141
142/* Checks that the integer in <test> is included between min and max */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100143struct pattern *pat_match_int(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100144
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100145/* always return false */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100146struct pattern *pat_match_nothing(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100147
148/* Checks that the pattern matches the end of the tested string. */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100149struct pattern *pat_match_end(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100150
151/* Checks that the pattern matches the beginning of the tested string. */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100152struct pattern *pat_match_beg(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100153
154/* Checks that the pattern is included inside the tested string. */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100155struct pattern *pat_match_sub(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100156
157/* Checks that the pattern is included inside the tested string, but enclosed
158 * between slashes or at the beginning or end of the string. Slashes at the
159 * beginning or end of the pattern are ignored.
160 */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100161struct pattern *pat_match_dir(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100162
163/* Checks that the pattern is included inside the tested string, but enclosed
164 * between dots or at the beginning or end of the string. Dots at the beginning
165 * or end of the pattern are ignored.
166 */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100167struct pattern *pat_match_dom(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100168
169/* Check that the IPv4 address in <test> matches the IP/mask in pattern */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100170struct pattern *pat_match_ip(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100171
172/* Executes a regex. It temporarily changes the data to add a trailing zero,
173 * and restores the previous character when leaving.
174 */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100175struct pattern *pat_match_reg(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100176
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100177/*
178 * pattern_ref manipulation.
179 */
180struct pat_ref *pat_ref_lookup(const char *reference);
Thierry FOURNIERaf5a29d2014-03-11 14:29:22 +0100181struct pat_ref *pat_ref_lookupid(int unique_id);
Thierry FOURNIER0d6ba512014-02-11 03:31:34 +0100182struct pat_ref *pat_ref_new(const char *reference, const char *display, unsigned int flags);
183struct pat_ref *pat_ref_newid(int unique_id, const char *display, unsigned int flags);
Baptiste Assmann953f74d2014-04-25 16:57:03 +0200184struct pat_ref_elt *pat_ref_find_elt(struct pat_ref *ref, const char *key);
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100185int pat_ref_append(struct pat_ref *ref, char *pattern, char *sample, int line);
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200186int pat_ref_add(struct pat_ref *ref, const char *pattern, const char *sample, char **err);
Thierry FOURNIER364cfdf2014-01-29 19:08:49 +0100187int pat_ref_set(struct pat_ref *ref, const char *pattern, const char *sample, char **err);
188int 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 +0100189int pat_ref_delete(struct pat_ref *ref, const char *key);
Thierry FOURNIER7acca4b2014-01-28 16:43:36 +0100190int pat_ref_delete_by_id(struct pat_ref *ref, struct pat_ref_elt *refelt);
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100191void pat_ref_prune(struct pat_ref *ref);
192int pat_ref_load(struct pat_ref *ref, struct pattern_expr *expr, int patflags, int soe, char **err);
Thierry FOURNIER46006bd2014-03-21 21:45:15 +0100193void pat_ref_reload(struct pat_ref *ref, struct pat_ref *replace);
194
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100195
196/*
197 * pattern_head manipulation.
198 */
199void pattern_init_head(struct pattern_head *head);
200void pattern_prune(struct pattern_head *head);
Thierry FOURNIER94580c92014-02-11 14:36:45 +0100201int 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 +0100202
203/*
204 * pattern_expr manipulation.
205 */
Thierry FOURNIERa65b3432013-11-28 18:22:00 +0100206void pattern_init_expr(struct pattern_expr *expr);
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100207struct pattern_expr *pattern_lookup_expr(struct pattern_head *head, struct pat_ref *ref);
208struct pattern_expr *pattern_new_expr(struct pattern_head *head, struct pat_ref *ref, char **err);
Thierry FOURNIERe369ca22014-01-29 16:24:55 +0100209struct sample_storage **pattern_find_smp(struct pattern_expr *expr, struct pat_ref_elt *elt);
Thierry FOURNIER7acca4b2014-01-28 16:43:36 +0100210int pattern_delete(struct pattern_expr *expr, struct pat_ref_elt *ref);
Thierry FOURNIER01cdcd42013-12-10 15:08:01 +0100211
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100212
213#endif