On 2.07.21 г. 14:33, Steven Rostedt wrote:
On Fri, 2 Jul 2021 14:10:46 +0300 "Yordan Karadzhov (VMware)" <y.karadz@xxxxxxxxx> wrote:+static int build_list(const char *name, void *data) +{ + struct instance_list *list = data; + char **instances; + int ret = -1; + + if (!match(name, list->re)) + return 0; + + instances = realloc(list->list, list->size + 2); + if (!instances) + goto out; + + list->list = instances;Hi Steven, I am not sure what was your original intention here, but this doesn't seem to work properly. Maybe we need something like this: int size = sizeof(*instances) * (list->size + 2); instances = realloc(list->list, size);Bah, that's what I get for trying to "multitask" while coding :-p That was suppose to be: instances = realloc(list->list, sizeof(*instances) * (list->size + 2); as you stated, but I'll keep it one line.if (!instances) goto out; instances[list->size + 1] = NULL;
but you still need to make sure it is NULL terminated. Y.
+ list->list[list->size] = strdup(name); + if (!list->list[list->size]) + goto out; + + list->size++; + ret = 0; + + out: + list->failed = ret; + return ret; +} + +/** + * tracefs_instances - return a list of instance names + * @regex: A regex of instances to filter on (NULL to match all) + * + * Returns a list of names of existing instances, that must be + * freed with tracefs_list_free(). Note, if there are no matches + * then an empty list will be returned (not NULL). + * NULL on error. + */ +char **tracefs_instances(const char *regex) +{ + struct instance_list list = { .re = NULL, .list = NULL }; + regex_t re; + int ret; + + if (regex) { + ret = regcomp(&re, regex, REG_ICASE|REG_NOSUB); + if (ret < 0) + return NULL; + list.re = &re; + } + + ret = tracefs_instances_walk(build_list, &list); + if (ret < 0 || list.failed) { + tracefs_list_free(list.list); + list.list = NULL; + } else { + if (!list.list) { + /* No matches should produce an empty list */ + list.list = malloc(sizeof(*list.list)); + if (list.list) + list.list[0] = NULL; + }Or you can just do: return calloc(1, sizeof(*list.list));Which I do in tracefs_get_probes(), must have missed this one. Will update, thanks for the review. -- SteveThanks! Yordan+ } + return list.list; +}