blob: 73d3cdcf3bd4b1520c2bffa0636b870e6a90a9e0 [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
Carl Henrik Lunde4944c8c2020-02-27 16:45:50 +010040int 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);
Thierry Fournier8feaa662016-02-10 22:55:20 +010070int pat_idx_list_regm(struct pattern_expr *expr, struct pattern *pat, char **err);
Thierry FOURNIERb9b08462013-12-13 15:12:32 +010071int pat_idx_tree_ip(struct pattern_expr *expr, struct pattern *pat, char **err);
72int pat_idx_tree_str(struct pattern_expr *expr, struct pattern *pat, char **err);
Willy Tarreaub1dd9bf2014-05-10 08:53:48 +020073int pat_idx_tree_pfx(struct pattern_expr *expr, struct pattern *pat, char **err);
Thierry FOURNIERb9b08462013-12-13 15:12:32 +010074
75/*
76 *
Thierry FOURNIERb1136502014-01-15 11:38:49 +010077 * The following functions search pattern <pattern> into the pattern
78 * expression <expr>. If the pattern is found, delete it. This function
79 * never fails.
80 *
81 */
Thierry FOURNIER7acca4b2014-01-28 16:43:36 +010082void pat_del_list_val(struct pattern_expr *expr, struct pat_ref_elt *ref);
83void pat_del_tree_ip(struct pattern_expr *expr, struct pat_ref_elt *ref);
84void pat_del_list_ptr(struct pattern_expr *expr, struct pat_ref_elt *ref);
85void pat_del_tree_str(struct pattern_expr *expr, struct pat_ref_elt *ref);
86void pat_del_list_reg(struct pattern_expr *expr, struct pat_ref_elt *ref);
Thierry FOURNIERb1136502014-01-15 11:38:49 +010087
88/*
89 *
Thierry FOURNIER6f7203d2014-01-14 16:24:51 +010090 * The following functions clean all entries of a pattern expression and
91 * reset the tree and list root.
92 *
93 */
94void pat_prune_val(struct pattern_expr *expr);
95void pat_prune_ptr(struct pattern_expr *expr);
96void pat_prune_reg(struct pattern_expr *expr);
97
98/*
99 *
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100100 * The following functions are general purpose pattern matching functions.
101 *
102 */
103
104
105/* ignore the current line */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200106int pat_parse_nothing(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100107
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100108/* Parse an integer. It is put both in min and max. */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200109int pat_parse_int(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100110
111/* Parse an version. It is put both in min and max. */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200112int pat_parse_dotted_ver(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100113
114/* Parse a range of integers delimited by either ':' or '-'. If only one
115 * integer is read, it is set as both min and max.
116 */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200117int pat_parse_range(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100118
119/* Parse a string. It is allocated and duplicated. */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200120int pat_parse_str(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100121
122/* Parse a hexa binary definition. It is allocated and duplicated. */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200123int pat_parse_bin(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100124
125/* Parse a regex. It is allocated. */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200126int pat_parse_reg(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100127
128/* Parse an IP address and an optional mask in the form addr[/mask].
129 * The addr may either be an IPv4 address or a hostname. The mask
130 * may either be a dotted mask or a number of bits. Returns 1 if OK,
131 * otherwise 0.
132 */
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200133int pat_parse_ip(const char *text, struct pattern *pattern, int mflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100134
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100135/* NB: For two strings to be identical, it is required that their lengths match */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100136struct pattern *pat_match_str(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100137
138/* NB: For two binary buffers to be identical, it is required that their lengths match */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100139struct pattern *pat_match_bin(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100140
141/* Checks that the length of the pattern in <test> is included between min and max */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100142struct pattern *pat_match_len(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100143
144/* Checks that the integer in <test> is included between min and max */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100145struct pattern *pat_match_int(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERe7ba2362014-01-21 11:25:41 +0100146
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100147/* always return false */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100148struct pattern *pat_match_nothing(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100149
150/* Checks that the pattern matches the end of the tested string. */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100151struct pattern *pat_match_end(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100152
153/* Checks that the pattern matches the beginning of the tested string. */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100154struct pattern *pat_match_beg(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100155
156/* Checks that the pattern is included inside the tested string. */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100157struct pattern *pat_match_sub(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, but enclosed
160 * between slashes or at the beginning or end of the string. Slashes at the
161 * beginning or end of the pattern are ignored.
162 */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100163struct pattern *pat_match_dir(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100164
165/* Checks that the pattern is included inside the tested string, but enclosed
166 * between dots or at the beginning or end of the string. Dots at the beginning
167 * or end of the pattern are ignored.
168 */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100169struct pattern *pat_match_dom(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100170
171/* Check that the IPv4 address in <test> matches the IP/mask in pattern */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100172struct pattern *pat_match_ip(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100173
174/* Executes a regex. It temporarily changes the data to add a trailing zero,
175 * and restores the previous character when leaving.
176 */
Thierry FOURNIER5338eea2013-12-16 14:22:13 +0100177struct pattern *pat_match_reg(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry Fournier8feaa662016-02-10 22:55:20 +0100178struct pattern *pat_match_regm(struct sample *smp, struct pattern_expr *expr, int fill);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100179
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100180/*
181 * pattern_ref manipulation.
182 */
183struct pat_ref *pat_ref_lookup(const char *reference);
Thierry FOURNIERaf5a29d2014-03-11 14:29:22 +0100184struct pat_ref *pat_ref_lookupid(int unique_id);
Thierry FOURNIER0d6ba512014-02-11 03:31:34 +0100185struct pat_ref *pat_ref_new(const char *reference, const char *display, unsigned int flags);
186struct pat_ref *pat_ref_newid(int unique_id, const char *display, unsigned int flags);
Baptiste Assmann953f74d2014-04-25 16:57:03 +0200187struct pat_ref_elt *pat_ref_find_elt(struct pat_ref *ref, const char *key);
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100188int pat_ref_append(struct pat_ref *ref, char *pattern, char *sample, int line);
Thierry FOURNIERe47e4e22014-04-28 11:18:57 +0200189int pat_ref_add(struct pat_ref *ref, const char *pattern, const char *sample, char **err);
Thierry FOURNIER364cfdf2014-01-29 19:08:49 +0100190int pat_ref_set(struct pat_ref *ref, const char *pattern, const char *sample, char **err);
191int 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 +0100192int 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);
Thierry FOURNIER46006bd2014-03-21 21:45:15 +0100196void pat_ref_reload(struct pat_ref *ref, struct pat_ref *replace);
197
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100198
199/*
200 * pattern_head manipulation.
201 */
202void pattern_init_head(struct pattern_head *head);
203void pattern_prune(struct pattern_head *head);
Thierry FOURNIER94580c92014-02-11 14:36:45 +0100204int 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 +0100205
206/*
207 * pattern_expr manipulation.
208 */
Thierry FOURNIERa65b3432013-11-28 18:22:00 +0100209void pattern_init_expr(struct pattern_expr *expr);
Thierry FOURNIER1e00d382014-02-11 11:31:40 +0100210struct pattern_expr *pattern_lookup_expr(struct pattern_head *head, struct pat_ref *ref);
Thierry FOURNIER315ec422014-11-24 11:14:42 +0100211struct pattern_expr *pattern_new_expr(struct pattern_head *head, struct pat_ref *ref,
Emeric Brun7d27f3c2017-07-03 17:54:23 +0200212 int patflags, char **err, int *reuse);
Thierry FOURNIER12ba0c22015-08-14 00:02:11 +0200213struct sample_data **pattern_find_smp(struct pattern_expr *expr, struct pat_ref_elt *elt);
Thierry FOURNIER7acca4b2014-01-28 16:43:36 +0100214int pattern_delete(struct pattern_expr *expr, struct pat_ref_elt *ref);
Thierry FOURNIER01cdcd42013-12-10 15:08:01 +0100215
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100216
217#endif