X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng%2Fuprobe.c;h=3ab442a5a3cd089ccceeeecd9d54a77f9056225c;hb=4b082b1252f03d83e732102b97bb6115da5728ab;hp=c51c44af05d2650a3edd79605f0ff77d92b3e729;hpb=0c4e727b6aeb61a5fd2749abede3c9b56f84504c;p=lttng-tools.git diff --git a/src/bin/lttng/uprobe.c b/src/bin/lttng/uprobe.c index c51c44af0..3ab442a5a 100644 --- a/src/bin/lttng/uprobe.c +++ b/src/bin/lttng/uprobe.c @@ -14,6 +14,7 @@ #include "common/compat/getenv.h" #include "common/string-utils/string-utils.h" #include "common/utils.h" +#include "common/path.h" #include "lttng/constant.h" #include "command.h" @@ -200,22 +201,24 @@ int parse_userspace_probe_opts(const char *opt, struct lttng_userspace_probe_location **probe_location) { int ret = CMD_SUCCESS; - int num_token; - char **tokens = NULL; + size_t num_token = 0; char *target_path = NULL; char *unescaped_target_path = NULL; char *real_target_path = NULL; char *symbol_name = NULL, *probe_name = NULL, *provider_name = NULL; struct lttng_userspace_probe_location *probe_location_local = NULL; struct lttng_userspace_probe_location_lookup_method *lookup_method = NULL; + struct lttng_dynamic_pointer_array tokens; assert(opt); /* * userspace probe fields are separated by ':'. */ - tokens = strutils_split(opt, ':', 1); - num_token = strutils_array_of_strings_len(tokens); + ret = strutils_split(opt, ':', true, &tokens); + if (ret == 0) { + num_token = lttng_dynamic_pointer_array_get_count(&tokens); + } /* * Early sanity check that the number of parameter is between 2 and 4 @@ -224,7 +227,7 @@ int parse_userspace_probe_opts(const char *opt, * std:PATH:PROVIDER_NAME:PROBE_NAME * PATH:SYMBOL (same behavior as ELF) */ - if (num_token < 2 || num_token > 4) { + if (ret < 0 || num_token < 2 || num_token > 4) { ret = CMD_ERROR; goto end; } @@ -237,12 +240,12 @@ int parse_userspace_probe_opts(const char *opt, case 2: /* When the probe type is omitted we assume ELF for now. */ case 3: - if (num_token == 3 && strcmp(tokens[0], "elf") == 0) { - target_path = tokens[1]; - symbol_name = tokens[2]; + if (num_token == 3 && strcmp(lttng_dynamic_pointer_array_get_pointer(&tokens, 0), "elf") == 0) { + target_path = lttng_dynamic_pointer_array_get_pointer(&tokens, 1); + symbol_name = lttng_dynamic_pointer_array_get_pointer(&tokens, 2); } else if (num_token == 2) { - target_path = tokens[0]; - symbol_name = tokens[1]; + target_path = lttng_dynamic_pointer_array_get_pointer(&tokens, 0); + symbol_name = lttng_dynamic_pointer_array_get_pointer(&tokens, 1); } else { ret = CMD_ERROR; goto end; @@ -256,10 +259,10 @@ int parse_userspace_probe_opts(const char *opt, } break; case 4: - if (strcmp(tokens[0], "sdt") == 0) { - target_path = tokens[1]; - provider_name = tokens[2]; - probe_name = tokens[3]; + if (strcmp(lttng_dynamic_pointer_array_get_pointer(&tokens, 0), "sdt") == 0) { + target_path = lttng_dynamic_pointer_array_get_pointer(&tokens, 1); + provider_name = lttng_dynamic_pointer_array_get_pointer(&tokens, 2); + probe_name = lttng_dynamic_pointer_array_get_pointer(&tokens, 3); } else { ret = CMD_ERROR; goto end; @@ -375,7 +378,7 @@ int parse_userspace_probe_opts(const char *opt, end: lttng_userspace_probe_location_destroy(probe_location_local); lttng_userspace_probe_location_lookup_method_destroy(lookup_method); - strutils_free_null_terminated_array_of_strings(tokens); + lttng_dynamic_pointer_array_reset(&tokens); /* * Freeing both char * here makes the error handling simplier. free() * performs not action if the pointer is NULL.