MINOR: vars: reduce the code size of some wrappers
Some function are just a wrappers. This patch reduce the size of
this wrapper for improving the readability. One check is moved
from the wrapper to the main function, and some middle vars are
removed.
diff --git a/src/vars.c b/src/vars.c
index 02d472a..8cd09a6 100644
--- a/src/vars.c
+++ b/src/vars.c
@@ -501,46 +501,34 @@
return 1;
}
-/* Returns 0 if miss data, else returns 1. */
+/* Wrapper for action_store */
static int action_tcp_req_store(struct tcp_rule *rule, struct proxy *px,
struct session *sess, struct stream *s)
{
- struct sample_expr *expr = rule->act_prm.data[0];
- const char *name = rule->act_prm.data[1];
- int scope = (long)rule->act_prm.data[2];
-
- return action_store(expr, name, scope, px, s, SMP_OPT_DIR_REQ);
+ return action_store(rule->act_prm.data[0], rule->act_prm.data[1],
+ (long)rule->act_prm.data[2], px, s, SMP_OPT_DIR_REQ);
}
-/* Returns 0 if miss data, else returns 1. */
+/* Wrapper for action_store */
static int action_tcp_res_store(struct tcp_rule *rule, struct proxy *px,
struct session *sess, struct stream *s)
{
- struct sample_expr *expr = rule->act_prm.data[0];
- const char *name = rule->act_prm.data[1];
- int scope = (long)rule->act_prm.data[2];
-
- return action_store(expr, name, scope, px, s, SMP_OPT_DIR_RES);
+ return action_store(rule->act_prm.data[0], rule->act_prm.data[1],
+ (long)rule->act_prm.data[2], px, s, SMP_OPT_DIR_RES);
}
-/* Returns 0 if miss data, else returns 1. */
+/* Wrapper for action_store */
static int action_http_req_store(struct http_req_rule *rule, struct proxy *px, struct stream *s)
{
- struct sample_expr *expr = rule->arg.act.p[0];
- const char *name = rule->arg.act.p[1];
- int scope = (long)rule->arg.act.p[2];
-
- return action_store(expr, name, scope, px, s, SMP_OPT_DIR_REQ);
+ return action_store(rule->arg.act.p[0], rule->arg.act.p[1],
+ (long)rule->arg.act.p[2], px, s, SMP_OPT_DIR_REQ);
}
-/* Returns 0 if miss data, else returns 1. */
+/* Wrapper for action_store */
static int action_http_res_store(struct http_res_rule *rule, struct proxy *px, struct stream *s)
{
- struct sample_expr *expr = rule->arg.act.p[0];
- const char *name = rule->arg.act.p[1];
- int scope = (long)rule->arg.act.p[2];
-
- return action_store(expr, name, scope, px, s, SMP_OPT_DIR_RES);
+ return action_store(rule->arg.act.p[0], rule->arg.act.p[1],
+ (long)rule->arg.act.p[2], px, s, SMP_OPT_DIR_RES);
}
/* This two function checks the variable name and replace the
@@ -572,11 +560,12 @@
* expression to execute.
*/
static int parse_vars(const char **args, int *arg, struct proxy *px,
- struct sample_expr **expr, char **name,
- enum vars_scope *scope, char **err)
+ int flags, char **err, struct sample_expr **expr,
+ char **name, enum vars_scope *scope)
{
const char *var_name = args[*arg-1];
int var_len;
+ const char *kw_name;
var_name += strlen("set-var");
if (*var_name != '(') {
@@ -595,123 +584,77 @@
if (!*name)
return 0;
+ kw_name = args[*arg-1];
+
*expr = sample_parse_expr((char **)args, arg, px->conf.args.file, px->conf.args.line,
err, &px->conf.args);
if (!*expr)
return 0;
+ if (!((*expr)->fetch->val & flags)) {
+ memprintf(err,
+ "fetch method '%s' extracts information from '%s', none of which is available here",
+ kw_name, sample_src_names((*expr)->fetch->use));
+ free(*expr);
+ return 0;
+ }
+
return 1;
}
+/* Wrapper for parse_vars */
static int parse_tcp_req_store(const char **args, int *arg, struct proxy *px,
struct tcp_rule *rule, char **err)
{
- struct sample_expr *expr;
- int cur_arg = *arg;
- char *name;
- enum vars_scope scope;
-
- if (!parse_vars(args, arg, px, &expr, &name, &scope, err))
- return 0;
-
- if (!(expr->fetch->val & SMP_VAL_FE_REQ_CNT)) {
- memprintf(err,
- "fetch method '%s' extracts information from '%s', none of which is available here",
- args[cur_arg-1], sample_src_names(expr->fetch->use));
- free(expr);
+ if (!parse_vars(args, arg, px, SMP_VAL_FE_REQ_CNT, err,
+ (struct sample_expr **)rule->act_prm.data[0],
+ (char **)rule->act_prm.data[1],
+ (enum vars_scope *)rule->act_prm.data[2]))
return 0;
- }
-
rule->action = TCP_ACT_CUSTOM_CONT;
rule->action_ptr = action_tcp_req_store;
- rule->act_prm.data[0] = expr;
- rule->act_prm.data[1] = name;
- rule->act_prm.data[2] = (void *)(long)scope;
-
return 1;
}
+/* Wrapper for parse_vars */
static int parse_tcp_res_store(const char **args, int *arg, struct proxy *px,
struct tcp_rule *rule, char **err)
{
- struct sample_expr *expr;
- int cur_arg = *arg;
- char *name;
- enum vars_scope scope;
-
- if (!parse_vars(args, arg, px, &expr, &name, &scope, err))
+ if (!parse_vars(args, arg, px, SMP_VAL_BE_RES_CNT, err,
+ (struct sample_expr **)rule->act_prm.data[0],
+ (char **)rule->act_prm.data[1],
+ (enum vars_scope *)rule->act_prm.data[2]))
return 0;
-
- if (!(expr->fetch->val & SMP_VAL_BE_RES_CNT)) {
- memprintf(err,
- "fetch method '%s' extracts information from '%s', none of which is available here",
- args[cur_arg-1], sample_src_names(expr->fetch->use));
- free(expr);
- return 0;
- }
-
rule->action = TCP_ACT_CUSTOM_CONT;
rule->action_ptr = action_tcp_res_store;
- rule->act_prm.data[0] = expr;
- rule->act_prm.data[1] = name;
- rule->act_prm.data[2] = (void *)(long)scope;
-
return 1;
}
+/* Wrapper for parse_vars */
static int parse_http_req_store(const char **args, int *arg, struct proxy *px,
struct http_req_rule *rule, char **err)
{
- struct sample_expr *expr;
- int cur_arg = *arg;
- char *name;
- enum vars_scope scope;
-
- if (!parse_vars(args, arg, px, &expr, &name, &scope, err))
+ if (!parse_vars(args, arg, px, SMP_VAL_FE_HRQ_HDR, err,
+ (struct sample_expr **)rule->arg.act.p[0],
+ (char **)rule->arg.act.p[1],
+ (enum vars_scope *)rule->arg.act.p[2]))
return -1;
-
- if (!(expr->fetch->val & SMP_VAL_FE_HRQ_HDR)) {
- memprintf(err,
- "fetch method '%s' extracts information from '%s', none of which is available here",
- args[cur_arg-1], sample_src_names(expr->fetch->use));
- free(expr);
- return -1;
- }
-
rule->action = HTTP_REQ_ACT_CUSTOM_CONT;
rule->action_ptr = action_http_req_store;
- rule->arg.act.p[0] = expr;
- rule->arg.act.p[1] = name;
- rule->arg.act.p[2] = (void *)(long)scope;
-
return 0;
}
+/* Wrapper for parse_vars */
static int parse_http_res_store(const char **args, int *arg, struct proxy *px,
struct http_res_rule *rule, char **err)
{
- struct sample_expr *expr;
- int cur_arg = *arg;
- char *name;
- enum vars_scope scope;
-
- if (!parse_vars(args, arg, px, &expr, &name, &scope, err))
+ if (!parse_vars(args, arg, px, SMP_VAL_BE_HRS_HDR, err,
+ (struct sample_expr **)rule->arg.act.p[0],
+ (char **)rule->arg.act.p[1],
+ (enum vars_scope *)rule->arg.act.p[2]))
return -1;
-
- if (!(expr->fetch->val & SMP_VAL_BE_HRS_HDR)) {
- memprintf(err,
- "fetch method '%s' extracts information from '%s', none of which is available here",
- args[cur_arg-1], sample_src_names(expr->fetch->use));
- free(expr);
- return -1;
- }
-
rule->action = HTTP_RES_ACT_CUSTOM_CONT;
rule->action_ptr = action_http_res_store;
- rule->arg.act.p[0] = expr;
- rule->arg.act.p[1] = name;
- rule->arg.act.p[2] = (void *)(long)scope;
-
return 0;
}