summaryrefslogtreecommitdiffstats
path: root/src/trace.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-03 05:11:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-03 05:11:10 +0000
commitcff6d757e3ba609c08ef2aaa00f07e53551e5bf6 (patch)
tree08c4fc3255483ad397d712edb4214ded49149fd9 /src/trace.c
parentAdding upstream version 2.9.7. (diff)
downloadhaproxy-cff6d757e3ba609c08ef2aaa00f07e53551e5bf6.tar.xz
haproxy-cff6d757e3ba609c08ef2aaa00f07e53551e5bf6.zip
Adding upstream version 3.0.0.upstream/3.0.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r--src/trace.c72
1 files changed, 39 insertions, 33 deletions
diff --git a/src/trace.c b/src/trace.c
index a233c0d..fcf557b 100644
--- a/src/trace.c
+++ b/src/trace.c
@@ -129,7 +129,7 @@ int __trace_enabled(enum trace_level level, uint64_t mask, struct trace_source *
if (!sess && strm)
sess = strm->sess;
- else if (!sess && conn && LIST_INLIST(&conn->session_list))
+ else if (!sess && conn && LIST_INLIST(&conn->sess_el))
sess = conn->owner;
else if (!sess && check)
sess = check->sess;
@@ -376,15 +376,16 @@ static int trace_source_parse_verbosity(struct trace_source *src,
const struct name_desc *nd;
int ret;
+ /* Only "quiet" is defined for all sources. Other identifiers are
+ * specific to trace source.
+ */
if (strcmp(verbosity, "quiet") == 0) {
ret = 0;
goto end;
}
- /* Only "quiet" is defined for all sources. Other identifiers are
- * specific to trace source.
- */
- BUG_ON(!src);
+ if (!src)
+ return -1;
if (!src->decoding || !src->decoding[0].name) {
if (strcmp(verbosity, "default") != 0)
@@ -566,10 +567,16 @@ static int trace_parse_statement(char **args, char **msg)
}
else if (strcmp(args[2], "level") == 0) {
const char *name = args[3];
- int level;
+ int level = -1;
- if (!*name) {
- chunk_printf(&trash, "Supported trace levels for source %s:\n", src->name.ptr);
+ if (*name)
+ level = trace_parse_level(name);
+
+ if (level < 0) {
+ chunk_reset(&trash);
+ if (*name)
+ chunk_appendf(&trash, "No such trace level '%s'. ", name);
+ chunk_appendf(&trash, "Supported trace levels for source %s:\n", src->name.ptr);
chunk_appendf(&trash, " %c error : report errors\n",
src->level == TRACE_LEVEL_ERROR ? '*' : ' ');
chunk_appendf(&trash, " %c user : also information useful to the end user\n",
@@ -584,13 +591,7 @@ static int trace_parse_statement(char **args, char **msg)
src->level == TRACE_LEVEL_DEVELOPER ? '*' : ' ');
trash.area[trash.data] = 0;
*msg = strdup(trash.area);
- return LOG_WARNING;
- }
-
- level = trace_parse_level(name);
- if (level < 0) {
- memprintf(msg, "No such trace level '%s'", name);
- return LOG_ERR;
+ return *name ? LOG_ERR : LOG_WARNING;
}
HA_ATOMIC_STORE(&src->level, level);
@@ -734,10 +735,16 @@ static int trace_parse_statement(char **args, char **msg)
else if (strcmp(args[2], "verbosity") == 0) {
const char *name = args[3];
const struct name_desc *nd;
- int verbosity;
+ int verbosity = -1;
- if (!*name) {
- chunk_printf(&trash, "Supported trace verbosities for source %s:\n", src->name.ptr);
+ if (*name)
+ verbosity = trace_source_parse_verbosity(src, name);
+
+ if (verbosity < 0) {
+ chunk_reset(&trash);
+ if (*name)
+ chunk_appendf(&trash, "No such verbosity level '%s'. ", name);
+ chunk_appendf(&trash, "Supported trace verbosities for source %s:\n", src->name.ptr);
chunk_appendf(&trash, " %c quiet : only report basic information with no decoding\n",
src->verbosity == 0 ? '*' : ' ');
if (!src->decoding || !src->decoding[0].name) {
@@ -751,13 +758,7 @@ static int trace_parse_statement(char **args, char **msg)
}
trash.area[trash.data] = 0;
*msg = strdup(trash.area);
- return LOG_WARNING;
- }
-
- verbosity = trace_source_parse_verbosity(src, name);
- if (verbosity < 0) {
- memprintf(msg, "No such verbosity level '%s'", name);
- return LOG_ERR;
+ return *name ? LOG_ERR : LOG_WARNING;
}
HA_ATOMIC_STORE(&src->verbosity, verbosity);
@@ -837,7 +838,7 @@ int trace_parse_cmd(char *arg, char **errmsg)
if (strlen(field)) {
level = trace_parse_level(field);
if (level < 0) {
- memprintf(errmsg, "no such level '%s'", field);
+ memprintf(errmsg, "no such trace level '%s', available levels are 'error', 'user', 'proto', 'state', 'data', and 'developer'", field);
return 1;
}
}
@@ -848,18 +849,23 @@ int trace_parse_cmd(char *arg, char **errmsg)
/* 3. verbosity */
field = str;
if (strchr(field, ':')) {
- memprintf(errmsg, "too many double-colon separator");
- return 1;
- }
-
- if (!src && strcmp(field, "quiet") != 0) {
- memprintf(errmsg, "trace source must be specified for verbosity other than 'quiet'");
+ memprintf(errmsg, "too many double-colon separators in trace definition");
return 1;
}
verbosity = trace_source_parse_verbosity(src, field);
if (verbosity < 0) {
- memprintf(errmsg, "no such verbosity '%s' for source '%s'", field, name);
+ const struct name_desc *nd;
+
+ if (!src) {
+ memprintf(errmsg, "trace source must be specified for verbosity other than 'quiet'");
+ }
+ else {
+ memprintf(errmsg, "no such trace verbosity '%s' for source '%s', available verbosities for this source are: 'quiet'", field, name);
+ for (nd = src->decoding; nd->name && nd->desc; nd++)
+ memprintf(errmsg, "%s, %s'%s'", *errmsg, (nd + 1)->name ? "" : "and ", nd->name);
+ }
+
return 1;
}