diff --git a/include/haproxy/proxy-t.h b/include/haproxy/proxy-t.h index eaca98899..e404f9a80 100644 --- a/include/haproxy/proxy-t.h +++ b/include/haproxy/proxy-t.h @@ -426,6 +426,7 @@ struct proxy { struct arg_list args; /* sample arg list that need to be resolved */ struct ebpt_node by_name; /* proxies are stored sorted by name here */ struct list lf_checks; /* list of logformats found in the proxy section that needs to be checked during postparse */ + struct eb_root log_steps; /* tree of log origins where log should be generated during request handling */ const char *file_prev; /* file of the previous instance found with the same name, or NULL */ int line_prev; /* line of the previous instance found with the same name, or 0 */ unsigned int refcount; /* refcount on this proxy (only used for default proxy for now) */ diff --git a/src/proxy.c b/src/proxy.c index 33c3be22d..9850d45a5 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -202,6 +202,7 @@ static inline void proxy_free_common(struct proxy *px) struct acl *acl, *aclb; struct logger *log, *logb; struct lf_expr *lf, *lfb; + struct eb32_node *node; ha_free(&px->id); drop_file_name(&px->conf.file); @@ -259,6 +260,16 @@ static inline void proxy_free_common(struct proxy *px) chunk_destroy(&px->log_tag); + node = eb32_first(&px->conf.log_steps); + while (node) { + struct eb32_node *prev_node = node; + + /* log steps directly use the node key as id, they are not encapsulated */ + node = eb32_next(node); + eb32_delete(prev_node); + free(prev_node); + } + free_email_alert(px); } @@ -1415,6 +1426,7 @@ void init_new_proxy(struct proxy *p) p->conf.used_listener_id = EB_ROOT; p->conf.used_server_id = EB_ROOT; p->used_server_addr = EB_ROOT_UNIQUE; + p->conf.log_steps = EB_ROOT_UNIQUE; /* Timeouts are defined as -1 */ proxy_reset_timeouts(p); @@ -1644,6 +1656,7 @@ static int proxy_defproxy_cpy(struct proxy *curproxy, const struct proxy *defpro { struct logger *tmplogger; char *tmpmsg = NULL; + struct eb32_node *node; /* set default values from the specified default proxy */ srv_settings_cpy(&curproxy->defsrv, &defproxy->defsrv, 0); @@ -1849,6 +1862,25 @@ static int proxy_defproxy_cpy(struct proxy *curproxy, const struct proxy *defpro curproxy->email_alert.level = defproxy->email_alert.level; curproxy->email_alert.flags = defproxy->email_alert.flags; + /* defproxy is const pointer, so we need to typecast log_steps to + * drop the const in order to use EB tree API, please note however + * that the operations performed below should theorically be read-only + */ + node = eb32_first((struct eb_root *)&defproxy->conf.log_steps); + while (node) { + struct eb32_node *new_node; + + new_node = malloc(sizeof(*new_node)); + if (!new_node) { + memprintf(errmsg, "proxy '%s': out of memory for log_steps option", curproxy->id); + return 1; + } + + new_node->key = node->key; + eb32_insert(&curproxy->conf.log_steps, new_node); + node = eb32_next(node); + } + return 0; }