]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: map: uses HAProxy facilities to store default value
authorThierry FOURNIER <tfournier@haproxy.com>
Thu, 12 Mar 2015 23:10:16 +0000 (00:10 +0100)
committerWilly Tarreau <w@1wt.eu>
Fri, 13 Mar 2015 13:10:30 +0000 (14:10 +0100)
The default value is stored in a special struct that describe the
map. This default value is parsed with special parser. This is
useless because HAProxy provides a space to store the default
value (the args) and HAProxy provides also standard parser for
the input types (args again).

This patch remove this special storage and replace it by an argument.
In other way the args of maps are declared as the expected type in
place of strings.

include/types/map.h
src/map.c

index f274e27fe11ef7e59a0c2337fd57e054939c3b8b..c2e251bd6325cd689006675055e3753d844ef1de 100644 (file)
@@ -37,9 +37,6 @@ struct map_descriptor {
        struct sample_conv *conv;      /* original converter descriptor */
        struct pattern_head pat;       /* the pattern matching associated to the map */
        int do_free;                   /* set if <pat> is the orignal pat and must be freed */
-       char *default_value;           /* a copy of default value. This copy is
-                                         useful if the type is str */
-       struct sample_storage *def;    /* contain the default value */
 };
 
 #endif /* _TYPES_MAP_H */
index e7f7f2605bed98a6685dffa4bc80124627ce0dc0..451fad67fb2db7532f67996a436104c193d4984c 100644 (file)
--- a/src/map.c
+++ b/src/map.c
@@ -157,26 +157,6 @@ static int sample_load_map(struct arg *arg, struct sample_conv *conv,
                                    1, err, file, line))
                return 0;
 
-       /* The second argument is the default value */
-       if (arg[1].type == ARGT_STR) {
-               desc->default_value = strdup(arg[1].data.str.str);
-               if (!desc->default_value) {
-                       memprintf(err, "out of memory");
-                       return 0;
-               }
-               desc->def = calloc(1, sizeof(*desc->def));
-               if (!desc->def) {
-                       memprintf(err, "out of memory");
-                       return 0;
-               }
-               if (!desc->pat.parse_smp(desc->default_value, desc->def)) {
-                       memprintf(err, "Cannot parse default value");
-                       return 0;
-               }
-       }
-       else
-               desc->def = NULL;
-
        /* replace the first argument by this definition */
        arg[0].type = ARGT_MAP;
        arg[0].data.map = desc;
@@ -213,13 +193,34 @@ static int sample_conv_map(struct session *session, const struct arg *arg_p,
        }
 
        /* If no default value avalaible, the converter fails. */
-       if (!desc->def)
+       if (arg_p[1].type == ARGT_STOP)
                return 0;
 
        /* Return the default value. */
-       smp->type = desc->def->type;
-       smp->flags |= SMP_F_CONST;
-       memcpy(&smp->data, &desc->def->data, sizeof(smp->data));
+       switch (desc->conv->out_type) {
+
+       case SMP_T_STR:
+               smp->type = SMP_T_STR;
+               smp->flags |= SMP_F_CONST;
+               smp->data.str = arg_p[1].data.str;
+               break;
+
+       case SMP_T_UINT:
+               smp->type = SMP_T_UINT;
+               smp->data.uint = arg_p[1].data.uint;
+               break;
+
+       case SMP_T_IPV4:
+               smp->type = SMP_T_IPV4;
+               smp->data.ipv4 = arg_p[1].data.ipv4;
+               break;
+
+       case SMP_T_IPV6:
+               smp->type = SMP_T_IPV6;
+               smp->data.ipv6 = arg_p[1].data.ipv6;
+               break;
+       }
+
        return 1;
 }
 
@@ -251,25 +252,25 @@ static struct sample_conv_kw_list sample_conv_kws = {ILH, {
        { "map_int",     sample_conv_map, ARG2(1,STR,STR), sample_load_map, SMP_T_UINT, SMP_T_STR,  (void *)PAT_MATCH_INT },
        { "map_ip",      sample_conv_map, ARG2(1,STR,STR), sample_load_map, SMP_T_ADDR, SMP_T_STR,  (void *)PAT_MATCH_IP  },
 
-       { "map_str_int", sample_conv_map, ARG2(1,STR,STR), sample_load_map, SMP_T_STR,  SMP_T_UINT, (void *)PAT_MATCH_STR },
-       { "map_beg_int", sample_conv_map, ARG2(1,STR,STR), sample_load_map, SMP_T_STR,  SMP_T_UINT, (void *)PAT_MATCH_BEG },
-       { "map_sub_int", sample_conv_map, ARG2(1,STR,STR), sample_load_map, SMP_T_STR,  SMP_T_UINT, (void *)PAT_MATCH_SUB },
-       { "map_dir_int", sample_conv_map, ARG2(1,STR,STR), sample_load_map, SMP_T_STR,  SMP_T_UINT, (void *)PAT_MATCH_DIR },
-       { "map_dom_int", sample_conv_map, ARG2(1,STR,STR), sample_load_map, SMP_T_STR,  SMP_T_UINT, (void *)PAT_MATCH_DOM },
-       { "map_end_int", sample_conv_map, ARG2(1,STR,STR), sample_load_map, SMP_T_STR,  SMP_T_UINT, (void *)PAT_MATCH_END },
-       { "map_reg_int", sample_conv_map, ARG2(1,STR,STR), sample_load_map, SMP_T_STR,  SMP_T_UINT, (void *)PAT_MATCH_REG },
-       { "map_int_int", sample_conv_map, ARG2(1,STR,STR), sample_load_map, SMP_T_UINT, SMP_T_UINT, (void *)PAT_MATCH_INT },
-       { "map_ip_int",  sample_conv_map, ARG2(1,STR,STR), sample_load_map, SMP_T_ADDR, SMP_T_UINT, (void *)PAT_MATCH_IP  },
-
-       { "map_str_ip",  sample_conv_map, ARG2(1,STR,STR), sample_load_map, SMP_T_STR,  SMP_T_IPV4, (void *)PAT_MATCH_STR },
-       { "map_beg_ip",  sample_conv_map, ARG2(1,STR,STR), sample_load_map, SMP_T_STR,  SMP_T_IPV4, (void *)PAT_MATCH_BEG },
-       { "map_sub_ip",  sample_conv_map, ARG2(1,STR,STR), sample_load_map, SMP_T_STR,  SMP_T_IPV4, (void *)PAT_MATCH_SUB },
-       { "map_dir_ip",  sample_conv_map, ARG2(1,STR,STR), sample_load_map, SMP_T_STR,  SMP_T_IPV4, (void *)PAT_MATCH_DIR },
-       { "map_dom_ip",  sample_conv_map, ARG2(1,STR,STR), sample_load_map, SMP_T_STR,  SMP_T_IPV4, (void *)PAT_MATCH_DOM },
-       { "map_end_ip",  sample_conv_map, ARG2(1,STR,STR), sample_load_map, SMP_T_STR,  SMP_T_IPV4, (void *)PAT_MATCH_END },
-       { "map_reg_ip",  sample_conv_map, ARG2(1,STR,STR), sample_load_map, SMP_T_STR,  SMP_T_IPV4, (void *)PAT_MATCH_REG },
-       { "map_int_ip",  sample_conv_map, ARG2(1,STR,STR), sample_load_map, SMP_T_UINT, SMP_T_IPV4, (void *)PAT_MATCH_INT },
-       { "map_ip_ip",   sample_conv_map, ARG2(1,STR,STR), sample_load_map, SMP_T_ADDR, SMP_T_IPV4, (void *)PAT_MATCH_IP  },
+       { "map_str_int", sample_conv_map, ARG2(1,STR,UINT), sample_load_map, SMP_T_STR,  SMP_T_UINT, (void *)PAT_MATCH_STR },
+       { "map_beg_int", sample_conv_map, ARG2(1,STR,UINT), sample_load_map, SMP_T_STR,  SMP_T_UINT, (void *)PAT_MATCH_BEG },
+       { "map_sub_int", sample_conv_map, ARG2(1,STR,UINT), sample_load_map, SMP_T_STR,  SMP_T_UINT, (void *)PAT_MATCH_SUB },
+       { "map_dir_int", sample_conv_map, ARG2(1,STR,UINT), sample_load_map, SMP_T_STR,  SMP_T_UINT, (void *)PAT_MATCH_DIR },
+       { "map_dom_int", sample_conv_map, ARG2(1,STR,UINT), sample_load_map, SMP_T_STR,  SMP_T_UINT, (void *)PAT_MATCH_DOM },
+       { "map_end_int", sample_conv_map, ARG2(1,STR,UINT), sample_load_map, SMP_T_STR,  SMP_T_UINT, (void *)PAT_MATCH_END },
+       { "map_reg_int", sample_conv_map, ARG2(1,STR,UINT), sample_load_map, SMP_T_STR,  SMP_T_UINT, (void *)PAT_MATCH_REG },
+       { "map_int_int", sample_conv_map, ARG2(1,STR,UINT), sample_load_map, SMP_T_UINT, SMP_T_UINT, (void *)PAT_MATCH_INT },
+       { "map_ip_int",  sample_conv_map, ARG2(1,STR,UINT), sample_load_map, SMP_T_ADDR, SMP_T_UINT, (void *)PAT_MATCH_IP  },
+
+       { "map_str_ip",  sample_conv_map, ARG2(1,STR,IPV4), sample_load_map, SMP_T_STR,  SMP_T_IPV4, (void *)PAT_MATCH_STR },
+       { "map_beg_ip",  sample_conv_map, ARG2(1,STR,IPV4), sample_load_map, SMP_T_STR,  SMP_T_IPV4, (void *)PAT_MATCH_BEG },
+       { "map_sub_ip",  sample_conv_map, ARG2(1,STR,IPV4), sample_load_map, SMP_T_STR,  SMP_T_IPV4, (void *)PAT_MATCH_SUB },
+       { "map_dir_ip",  sample_conv_map, ARG2(1,STR,IPV4), sample_load_map, SMP_T_STR,  SMP_T_IPV4, (void *)PAT_MATCH_DIR },
+       { "map_dom_ip",  sample_conv_map, ARG2(1,STR,IPV4), sample_load_map, SMP_T_STR,  SMP_T_IPV4, (void *)PAT_MATCH_DOM },
+       { "map_end_ip",  sample_conv_map, ARG2(1,STR,IPV4), sample_load_map, SMP_T_STR,  SMP_T_IPV4, (void *)PAT_MATCH_END },
+       { "map_reg_ip",  sample_conv_map, ARG2(1,STR,IPV4), sample_load_map, SMP_T_STR,  SMP_T_IPV4, (void *)PAT_MATCH_REG },
+       { "map_int_ip",  sample_conv_map, ARG2(1,STR,IPV4), sample_load_map, SMP_T_UINT, SMP_T_IPV4, (void *)PAT_MATCH_INT },
+       { "map_ip_ip",   sample_conv_map, ARG2(1,STR,IPV4), sample_load_map, SMP_T_ADDR, SMP_T_IPV4, (void *)PAT_MATCH_IP  },
 
        { /* END */ },
 }};