]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: cfgparse: post section callback
authorWilliam Lallemand <wlallemand@haproxy.com>
Mon, 16 Oct 2017 09:06:50 +0000 (11:06 +0200)
committerWilly Tarreau <w@1wt.eu>
Fri, 27 Oct 2017 08:14:51 +0000 (10:14 +0200)
This commit implements a post section callback. This callback will be
used at the end of a section parsing.

Every call to cfg_register_section must be modified to use the new
prototype:

    int cfg_register_section(char *section_name,
                             int (*section_parser)(const char *, int, char **, int),
                             int (*post_section_parser)());

include/common/cfgparse.h
src/cfgparse.c
src/flt_spoe.c

index fd04b14470713df1336181d1efb9e0123e44b4aa..fc96bfea049dc144e60384a4c10257b924bde3fa 100644 (file)
@@ -73,7 +73,8 @@ void init_default_instance();
 int check_config_validity();
 int str2listener(char *str, struct proxy *curproxy, struct bind_conf *bind_conf, const char *file, int line, char **err);
 int cfg_register_section(char *section_name,
-                         int (*section_parser)(const char *, int, char **, int));
+                         int (*section_parser)(const char *, int, char **, int),
+                         int (*post_section_parser)());
 void cfg_unregister_sections(void);
 void cfg_backup_sections(struct list *backup_sections);
 void cfg_restore_sections(struct list *backup_sections);
index 9b91b9048ae2f0ab9b9382d3799e8c3565b4e747..8a5c8f003bf60347e9d44a69ae1aeb8d83b61362 100644 (file)
@@ -126,6 +126,7 @@ struct cfg_section {
        struct list list;
        char *section_name;
        int (*section_parser)(const char *, int, char **, int);
+       int (*post_section_parser)();
 };
 
 /* Used to chain configuration sections definitions. This list
@@ -6979,7 +6980,7 @@ int readcfgfile(const char *file)
        FILE *f;
        int linenum = 0;
        int err_code = 0;
-       struct cfg_section *cs = NULL;
+       struct cfg_section *cs = NULL, *pcs = NULL;
        struct cfg_section *ics;
        int readbytes = 0;
 
@@ -7279,17 +7280,29 @@ next_line:
                        }
                }
 
-               /* else it's a section keyword */
-               if (cs)
-                       err_code |= cs->section_parser(file, linenum, args, kwm);
-               else {
+               if (!cs) {
                        Alert("parsing [%s:%d]: unknown keyword '%s' out of section.\n", file, linenum, args[0]);
                        err_code |= ERR_ALERT | ERR_FATAL;
-               }
+               } else {
+                       /* else it's a section keyword */
 
-               if (err_code & ERR_ABORT)
-                       break;
+                       if (pcs != cs && pcs && pcs->post_section_parser) {
+                               err_code |= pcs->post_section_parser();
+                               if (err_code & ERR_ABORT)
+                                       goto err;
+                       }
+
+                       err_code |= cs->section_parser(file, linenum, args, kwm);
+                       if (err_code & ERR_ABORT)
+                               goto err;
+               }
+               pcs = cs;
        }
+
+       if (pcs == cs && pcs && pcs->post_section_parser)
+               err_code |= pcs->post_section_parser();
+
+err:
        free(cfg_scope);
        cfg_scope = NULL;
        cursection = NULL;
@@ -9252,7 +9265,8 @@ void cfg_unregister_keywords(struct cfg_kw_list *kwl)
  * only the first declared is used.
  */
 int cfg_register_section(char *section_name,
-                         int (*section_parser)(const char *, int, char **, int))
+                         int (*section_parser)(const char *, int, char **, int),
+                         int (*post_section_parser)())
 {
        struct cfg_section *cs;
 
@@ -9271,6 +9285,7 @@ int cfg_register_section(char *section_name,
 
        cs->section_name = section_name;
        cs->section_parser = section_parser;
+       cs->post_section_parser = post_section_parser;
 
        LIST_ADDQ(&sections, &cs->list);
 
@@ -9314,16 +9329,16 @@ __attribute__((constructor))
 static void cfgparse_init(void)
 {
        /* Register internal sections */
-       cfg_register_section("listen",         cfg_parse_listen);
-       cfg_register_section("frontend",       cfg_parse_listen);
-       cfg_register_section("backend",        cfg_parse_listen);
-       cfg_register_section("defaults",       cfg_parse_listen);
-       cfg_register_section("global",         cfg_parse_global);
-       cfg_register_section("userlist",       cfg_parse_users);
-       cfg_register_section("peers",          cfg_parse_peers);
-       cfg_register_section("mailers",        cfg_parse_mailers);
-       cfg_register_section("namespace_list", cfg_parse_netns);
-       cfg_register_section("resolvers",      cfg_parse_resolvers);
+       cfg_register_section("listen",         cfg_parse_listen,    NULL);
+       cfg_register_section("frontend",       cfg_parse_listen,    NULL);
+       cfg_register_section("backend",        cfg_parse_listen,    NULL);
+       cfg_register_section("defaults",       cfg_parse_listen,    NULL);
+       cfg_register_section("global",         cfg_parse_global,    NULL);
+       cfg_register_section("userlist",       cfg_parse_users,     NULL);
+       cfg_register_section("peers",          cfg_parse_peers,     NULL);
+       cfg_register_section("mailers",        cfg_parse_mailers,   NULL);
+       cfg_register_section("namespace_list", cfg_parse_netns,     NULL);
+       cfg_register_section("resolvers",      cfg_parse_resolvers, NULL);
 }
 
 /*
index 1d4b0c8ce63b4be2ffb6daa13d703b5508f4f41a..228770c9a9950a1d45820e4667a6ad1736715135 100644 (file)
@@ -3461,8 +3461,8 @@ parse_spoe_flt(char **args, int *cur_arg, struct proxy *px,
        /* backup sections and register SPOE sections */
        LIST_INIT(&backup_sections);
        cfg_backup_sections(&backup_sections);
-       cfg_register_section("spoe-agent",   cfg_parse_spoe_agent);
-       cfg_register_section("spoe-message", cfg_parse_spoe_message);
+       cfg_register_section("spoe-agent",   cfg_parse_spoe_agent,   NULL);
+       cfg_register_section("spoe-message", cfg_parse_spoe_message, NULL);
 
        /* Parse SPOE filter configuration file */
        curengine = engine;