From: Amaury Denoyelle Date: Thu, 27 May 2021 13:45:28 +0000 (+0200) Subject: MEDIUM: errors: implement parsing context type X-Git-Tag: v2.5-dev1~196 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6af81f80fb12ca5306f78f84faf8a8855ea2ba7b;p=thirdparty%2Fhaproxy.git MEDIUM: errors: implement parsing context type Create a parsing_ctx structure. This type is used to store information about the current file/line parsed. A global context is created and can be manipulated when haproxy is in STARTING mode. When starting is over, the context is resetted and should not be accessed anymore. --- diff --git a/include/haproxy/errors.h b/include/haproxy/errors.h index aaf5cd8663..6dd60f1e1e 100644 --- a/include/haproxy/errors.h +++ b/include/haproxy/errors.h @@ -60,12 +60,22 @@ enum { }; -void usermsgs_clr(void); +void usermsgs_clr(const char *prefix); int usermsgs_empty(void); const char *usermsgs_str(void); /************ Error reporting functions ***********/ +struct usermsgs_ctx { + const char *prefix; /* prefix of every output */ + const char *file; /* related filename for config parsing */ + int line; /* related line number for config parsing */ + enum obj_type *obj; /* related proxy, server, ... */ +}; +void set_usermsgs_ctx(const char *file, int line, enum obj_type *obj); +void register_parsing_obj(enum obj_type *obj); +void reset_usermsgs_ctx(void); + /* * Displays the message on stderr with the date and pid. Overrides the quiet * mode during startup. diff --git a/src/errors.c b/src/errors.c index 9da04f9184..68fcf1af19 100644 --- a/src/errors.c +++ b/src/errors.c @@ -22,6 +22,10 @@ static struct ring *startup_logs = NULL; #define USER_MESSAGES_BUFSIZE 1024 static THREAD_LOCAL struct buffer usermsgs_buf = BUF_NULL; +/* A thread local context used for stderr output via ha_alert/warning/notice/diag. + */ +static THREAD_LOCAL struct usermsgs_ctx usermsgs_ctx = { }; + /* Put msg in usermsgs_buf. * * The message should not be terminated by a newline because this function @@ -49,13 +53,19 @@ static void usermsgs_put(const struct ist *msg) } } -/* Clear the messages log buffer. */ -void usermsgs_clr(void) +/* Clear the user messages log buffer. + * + * will set the local-thread context appended to every output + * following this call. It can be NULL if not necessary. + */ +void usermsgs_clr(const char *prefix) { if (likely(!b_is_null(&usermsgs_buf))) { b_reset(&usermsgs_buf); usermsgs_buf.area[0] = '\0'; } + + usermsgs_ctx.prefix = prefix; } /* Check if the user messages buffer is empty. */ @@ -73,6 +83,40 @@ const char *usermsgs_str(void) return b_head(&usermsgs_buf); } +/* Set thread-local context infos to prefix forthcoming stderr output during + * configuration parsing. + * + * and specify the location of the parsed configuration. + * + * can be of various types. If not NULL, the string prefix generated will + * depend on its type. + */ +void set_usermsgs_ctx(const char *file, int line, enum obj_type *obj) +{ + usermsgs_ctx.file = file; + usermsgs_ctx.line = line; + usermsgs_ctx.obj = obj; +} + +/* Set thread-local context infos to prefix forthcoming stderr output. It will + * be set as a complement to possibly already defined file/line. + * + * can be of various types. If not NULL, the string prefix generated will + * depend on its type. + */ +void register_parsing_obj(enum obj_type *obj) +{ + usermsgs_ctx.obj = obj; +} + +/* Reset thread-local context infos for stderr output. */ +void reset_usermsgs_ctx(void) +{ + usermsgs_ctx.file = NULL; + usermsgs_ctx.line = 0; + usermsgs_ctx.obj = NULL; +} + /* Generic function to display messages prefixed by a label */ static void print_message(const char *label, const char *fmt, va_list argp) { diff --git a/src/haproxy.c b/src/haproxy.c index 0e707f5ef4..f4c24ee7e7 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -3380,6 +3380,8 @@ int main(int argc, char **argv) } global.mode &= ~MODE_STARTING; + reset_usermsgs_ctx(); + /* * That's it : the central polling loop. Run until we stop. */