blob: ee7518cd5d6e51ade81683d6623781f69dc94d4a [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 Tarreau0cba6072013-11-28 22:21:02 +010025#include <common/config.h>
26#include <common/standard.h>
27#include <types/pattern.h>
28
Thierry FOURNIERed66c292013-11-28 11:05:19 +010029/* parse the <text> with <expr> compliant parser. <pattern> is a context for
30 * the current parsed acl. It must initialized at NULL:
31 *
Thierry FOURNIERa65b3432013-11-28 18:22:00 +010032 * struct pattern *pattern = NULL
33 * pattern_register(..., &pattern, ...);
Thierry FOURNIERed66c292013-11-28 11:05:19 +010034 *
Thierry FOURNIERa65b3432013-11-28 18:22:00 +010035 * patflag are a lot of 'PAT_F_*' flags pattern compatible. see
Thierry FOURNIERed66c292013-11-28 11:05:19 +010036 * <types/acl.h>.
37 *
38 * The function returns 1 if the processing is ok, return -1 if the parser
39 * fails, with <err> message filled. It returns -2 in "out of memory"
40 * error case.
41 */
Thierry FOURNIERa65b3432013-11-28 18:22:00 +010042int pattern_register(struct pattern_expr *expr, char *text, struct sample_storage *smp, struct pattern **pattern, int patflags, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +010043
44/* This function executes a pattern match on a sample. It applies pattern <expr>
45 * to sample <smp>. If <sample> is not NULL, a pointer to an optional sample
46 * associated to the matching patterned will be put there. The function returns
Thierry FOURNIERa65b3432013-11-28 18:22:00 +010047 * PAT_MATCH or PAT_NOMATCH.
Thierry FOURNIERed66c292013-11-28 11:05:19 +010048 */
Willy Tarreau0cba6072013-11-28 22:21:02 +010049enum pat_match_res pattern_exec_match(struct pattern_expr *expr, struct sample *smp, struct sample_storage **sample);
Thierry FOURNIERed66c292013-11-28 11:05:19 +010050
51/*
52 *
53 * The following functions are general purpose pattern matching functions.
54 *
55 */
56
57
58/* ignore the current line */
Thierry FOURNIERa65b3432013-11-28 18:22:00 +010059int pat_parse_nothing(const char **text, struct pattern *pattern, struct sample_storage *smp, int *opaque, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +010060
61/* NB: For two strings to be identical, it is required that their lengths match */
Willy Tarreau0cba6072013-11-28 22:21:02 +010062enum pat_match_res pat_match_str(struct sample *smp, struct pattern *pattern);
Thierry FOURNIERed66c292013-11-28 11:05:19 +010063
64/* NB: For two binary buffers to be identical, it is required that their lengths match */
Willy Tarreau0cba6072013-11-28 22:21:02 +010065enum pat_match_res pat_match_bin(struct sample *smp, struct pattern *pattern);
Thierry FOURNIERed66c292013-11-28 11:05:19 +010066
67/* Checks that the length of the pattern in <test> is included between min and max */
Willy Tarreau0cba6072013-11-28 22:21:02 +010068enum pat_match_res pat_match_len(struct sample *smp, struct pattern *pattern);
Thierry FOURNIERed66c292013-11-28 11:05:19 +010069
70/* Checks that the integer in <test> is included between min and max */
Willy Tarreau0cba6072013-11-28 22:21:02 +010071enum pat_match_res pat_match_int(struct sample *smp, struct pattern *pattern);
Thierry FOURNIERed66c292013-11-28 11:05:19 +010072
73/* Parse an integer. It is put both in min and max. */
Thierry FOURNIERa65b3432013-11-28 18:22:00 +010074int pat_parse_int(const char **text, struct pattern *pattern, struct sample_storage *smp, int *opaque, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +010075
76/* Parse an version. It is put both in min and max. */
Thierry FOURNIERa65b3432013-11-28 18:22:00 +010077int pat_parse_dotted_ver(const char **text, struct pattern *pattern, struct sample_storage *smp, int *opaque, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +010078
79/* Parse a range of integers delimited by either ':' or '-'. If only one
80 * integer is read, it is set as both min and max.
81 */
Thierry FOURNIERa65b3432013-11-28 18:22:00 +010082int pat_parse_range(const char **text, struct pattern *pattern, struct sample_storage *smp, int *opaque, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +010083
84/* Parse a string. It is allocated and duplicated. */
Thierry FOURNIERa65b3432013-11-28 18:22:00 +010085int pat_parse_str(const char **text, struct pattern *pattern, struct sample_storage *smp, int *opaque, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +010086
87/* Parse a hexa binary definition. It is allocated and duplicated. */
Thierry FOURNIERa65b3432013-11-28 18:22:00 +010088int pat_parse_bin(const char **text, struct pattern *pattern, struct sample_storage *smp, int *opaque, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +010089
90/* Parse and concatenate strings into one. It is allocated and duplicated. */
Thierry FOURNIERa65b3432013-11-28 18:22:00 +010091int pat_parse_strcat(const char **text, struct pattern *pattern, struct sample_storage *smp, int *opaque, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +010092
93/* Parse a regex. It is allocated. */
Thierry FOURNIERa65b3432013-11-28 18:22:00 +010094int pat_parse_reg(const char **text, struct pattern *pattern, struct sample_storage *smp, int *opaque, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +010095
96/* Parse an IP address and an optional mask in the form addr[/mask].
97 * The addr may either be an IPv4 address or a hostname. The mask
98 * may either be a dotted mask or a number of bits. Returns 1 if OK,
99 * otherwise 0.
100 */
Thierry FOURNIERa65b3432013-11-28 18:22:00 +0100101int pat_parse_ip(const char **text, struct pattern *pattern, struct sample_storage *smp, int *opaque, char **err);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100102
103/* always return false */
Willy Tarreau0cba6072013-11-28 22:21:02 +0100104enum pat_match_res pat_match_nothing(struct sample *smp, struct pattern *pattern);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100105
106/* Checks that the pattern matches the end of the tested string. */
Willy Tarreau0cba6072013-11-28 22:21:02 +0100107enum pat_match_res pat_match_end(struct sample *smp, struct pattern *pattern);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100108
109/* Checks that the pattern matches the beginning of the tested string. */
Willy Tarreau0cba6072013-11-28 22:21:02 +0100110enum pat_match_res pat_match_beg(struct sample *smp, struct pattern *pattern);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100111
112/* Checks that the pattern is included inside the tested string. */
Willy Tarreau0cba6072013-11-28 22:21:02 +0100113enum pat_match_res pat_match_sub(struct sample *smp, struct pattern *pattern);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100114
115/* Checks that the pattern is included inside the tested string, but enclosed
116 * between slashes or at the beginning or end of the string. Slashes at the
117 * beginning or end of the pattern are ignored.
118 */
Willy Tarreau0cba6072013-11-28 22:21:02 +0100119enum pat_match_res pat_match_dir(struct sample *smp, struct pattern *pattern);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100120
121/* Checks that the pattern is included inside the tested string, but enclosed
122 * between dots or at the beginning or end of the string. Dots at the beginning
123 * or end of the pattern are ignored.
124 */
Willy Tarreau0cba6072013-11-28 22:21:02 +0100125enum pat_match_res pat_match_dom(struct sample *smp, struct pattern *pattern);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100126
127/* Check that the IPv4 address in <test> matches the IP/mask in pattern */
Willy Tarreau0cba6072013-11-28 22:21:02 +0100128enum pat_match_res pat_match_ip(struct sample *smp, struct pattern *pattern);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100129
130/* Executes a regex. It temporarily changes the data to add a trailing zero,
131 * and restores the previous character when leaving.
132 */
Willy Tarreau0cba6072013-11-28 22:21:02 +0100133enum pat_match_res pat_match_reg(struct sample *smp, struct pattern *pattern);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100134
Thierry FOURNIERa65b3432013-11-28 18:22:00 +0100135int pattern_read_from_file(struct pattern_expr *expr, const char *filename, int patflags, char **err);
136void pattern_free(struct pattern *pat);
137void pattern_prune_expr(struct pattern_expr *expr);
138void pattern_init_expr(struct pattern_expr *expr);
Thierry FOURNIERed66c292013-11-28 11:05:19 +0100139
140#endif