void trace_register_source(struct trace_source *source);
-int trace_parse_cmd(char *arg, char **errmsg);
+int trace_parse_cmd(const char *arg_src, char **errmsg);
/* return a single char to describe a trace state */
static inline char trace_state_char(enum trace_state st)
*
* Returns 0 on success else non-zero.
*/
-int trace_parse_cmd(char *arg, char **errmsg)
+int trace_parse_cmd(const char *arg_src, char **errmsg)
{
char *str;
+ char *arg, *oarg;
+ char *saveptr;
+
+ if (arg_src) {
+ /* keep a copy of the ptr for strtok */
+ oarg = arg = strdup(arg_src);
+ if (!arg) {
+ memprintf(errmsg, "Can't allocate !");
+ return 1;
+ }
+ }
- if (!arg) {
+ if (!arg_src) {
/* No trace specification, activate all sources on error level. */
struct trace_source *src = NULL;
return 0;
}
- while ((str = strtok(arg, ","))) {
+ while ((str = strtok_r(arg, ",", &saveptr))) {
struct trace_source *src = NULL;
char *field, *name;
char *sep;
src = trace_find_source(name);
if (!src) {
memprintf(errmsg, "unknown trace source '%s'", name);
+ ha_free(&oarg);
return 1;
}
}
level = trace_parse_level(field);
if (level < 0) {
memprintf(errmsg, "no such trace level '%s', available levels are 'error', 'user', 'proto', 'state', 'data', and 'developer'", field);
+ ha_free(&oarg);
return 1;
}
}
field = str;
if (strchr(field, ':')) {
memprintf(errmsg, "too many double-colon separators in trace definition");
+ ha_free(&oarg);
return 1;
}
memprintf(errmsg, "%s, %s'%s'", *errmsg, (nd + 1)->name ? "" : "and ", nd->name);
}
+ ha_free(&oarg);
return 1;
}
/* Reset arg to NULL for strtok. */
arg = NULL;
}
-
+ ha_free(&oarg);
return 0;
}