From: Willy Tarreau Date: Sun, 20 Jul 2008 08:39:22 +0000 (+0200) Subject: [MEDIUM] acl: get rid of dummy values in always_true/always_false X-Git-Tag: v1.3.16-rc1~225 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=58393e103fc170ab654de7ffde2e366c31ac340b;p=thirdparty%2Fhaproxy.git [MEDIUM] acl: get rid of dummy values in always_true/always_false make use of last change in order to get rid of dummy values in always_true/always_false. --- diff --git a/doc/configuration.txt b/doc/configuration.txt index a2132d5cca..8e5f707e73 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -3941,8 +3941,8 @@ only the first three ones are not layer 7 based. ACL name Equivalent to Usage ---------------+-----------------------------+--------------------------------- -TRUE always_true 1 always match -FALSE always_false 0 never match +TRUE always_true always match +FALSE always_false never match LOCALHOST src 127.0.0.1/8 match connection from local host HTTP_1.0 req_ver 1.0 match HTTP version 1.0 HTTP_1.1 req_ver 1.1 match HTTP version 1.1 diff --git a/include/proto/acl.h b/include/proto/acl.h index 1f6a7b2f71..ae64a5053f 100644 --- a/include/proto/acl.h +++ b/include/proto/acl.h @@ -111,6 +111,9 @@ void acl_unregister_keywords(struct acl_kw_list *kwl); */ +/* ignore the current line */ +int acl_parse_nothing(const char **text, struct acl_pattern *pattern, int *opaque); + /* NB: For two strings to be identical, it is required that their lengths match */ int acl_match_str(struct acl_test *test, struct acl_pattern *pattern); @@ -141,6 +144,13 @@ int acl_parse_reg(const char **text, struct acl_pattern *pattern, int *opaque); */ int acl_parse_ip(const char **text, struct acl_pattern *pattern, int *opaque); +/* always fake a data retrieval */ +int acl_fetch_nothing(struct proxy *px, struct session *l4, void *l7, int dir, + struct acl_expr *expr, struct acl_test *test); + +/* always return false */ +int acl_match_nothing(struct acl_test *test, struct acl_pattern *pattern); + /* Checks that the pattern matches the end of the tested string. */ int acl_match_end(struct acl_test *test, struct acl_pattern *pattern); diff --git a/src/acl.c b/src/acl.c index e755990f8e..e66d502f62 100644 --- a/src/acl.c +++ b/src/acl.c @@ -30,31 +30,44 @@ static struct acl_kw_list acl_keywords = { * These functions are only used for debugging complex configurations. */ -/* ignore the current line */ +/* force TRUE to be returned at the fetch level */ static int -acl_parse_nothing(const char **text, struct acl_pattern *pattern, int *opaque) +acl_fetch_true(struct proxy *px, struct session *l4, void *l7, int dir, + struct acl_expr *expr, struct acl_test *test) { + test->flags |= ACL_TEST_F_SET_RES_PASS; return 1; } -/* always fake a data retrieval */ +/* force FALSE to be returned at the fetch level */ static int -acl_fetch_nothing(struct proxy *px, struct session *l4, void *l7, int dir, - struct acl_expr *expr, struct acl_test *test) +acl_fetch_false(struct proxy *px, struct session *l4, void *l7, int dir, + struct acl_expr *expr, struct acl_test *test) { + test->flags |= ACL_TEST_F_SET_RES_FAIL; return 1; } -/* always return true */ -static int -acl_match_true(struct acl_test *test, struct acl_pattern *pattern) + +/* + * These functions are exported and may be used by any other component. + */ + +/* ignore the current line */ +int acl_parse_nothing(const char **text, struct acl_pattern *pattern, int *opaque) { - return ACL_PAT_PASS; + return 1; +} + +/* always fake a data retrieval */ +int acl_fetch_nothing(struct proxy *px, struct session *l4, void *l7, int dir, + struct acl_expr *expr, struct acl_test *test) +{ + return 1; } /* always return false */ -static int -acl_match_false(struct acl_test *test, struct acl_pattern *pattern) +int acl_match_nothing(struct acl_test *test, struct acl_pattern *pattern) { return ACL_PAT_FAIL; } @@ -743,8 +756,8 @@ const struct { const char *name; const char *expr[4]; /* put enough for longest expression */ } default_acl_list[] = { - { .name = "TRUE", .expr = {"always_true","1",""}}, - { .name = "FALSE", .expr = {"always_false","0",""}}, + { .name = "TRUE", .expr = {"always_true",""}}, + { .name = "FALSE", .expr = {"always_false",""}}, { .name = "LOCALHOST", .expr = {"src","127.0.0.1/8",""}}, { .name = "HTTP_1.0", .expr = {"req_ver","1.0",""}}, { .name = "HTTP_1.1", .expr = {"req_ver","1.1",""}}, @@ -1049,8 +1062,8 @@ int acl_exec_cond(struct acl_cond *cond, struct proxy *px, struct session *l4, v /* Note: must not be declared as its list will be overwritten */ static struct acl_kw_list acl_kws = {{ },{ - { "always_true", acl_parse_nothing, acl_fetch_nothing, acl_match_true }, - { "always_false", acl_parse_nothing, acl_fetch_nothing, acl_match_false }, + { "always_true", acl_parse_nothing, acl_fetch_true, acl_match_nothing }, + { "always_false", acl_parse_nothing, acl_fetch_false, acl_match_nothing }, #if 0 { "time", acl_parse_time, acl_fetch_time, acl_match_time }, #endif