Hi Masami, Just a small suggestion below.
On 02/20/2015 03:11 PM, Masami Hiramatsu wrote:
[SNIP] + +struct strlist *build_id_cache__list_build_ids(const char *pathname) +{ + struct strlist *list; + char *dirname; + DIR *dir; + struct dirent *d; + + list = strlist__new(true, NULL); + dirname = build_id_cache__dirname_from_path(pathname, false, false); + if (!list || !dirname) + goto error_free; + + /* List up all dirents */ + dir = opendir(dirname); + if (!dir) + goto error_free; + while ((d = readdir(dir)) != NULL) { + if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, "..")) + continue; + strlist__add(list, d->d_name); + } + closedir(dir); + + free(dirname); + return list; + +error_free: + free(dirname); + if (list) + strlist__delete(list);
Maybe we don't need the "if (list)" check here as strlist__delete already checks for this.
+ return NULL; +} + int build_id_cache__add_s(const char *sbuild_id, const char *name, bool is_kallsyms, bool is_vdso) { const size_t size = PATH_MAX; - char *realname, *filename = zalloc(size), + char *realname = NULL, *filename = NULL, *dirname = NULL, *linkname = zalloc(size), *targetname, *tmp; - int len, err = -1; - bool slash = is_kallsyms || is_vdso; + int err = -1; - if (is_kallsyms) { - if (symbol_conf.kptr_restrict) { - pr_debug("Not caching a kptr_restrict'ed /proc/kallsyms\n"); - err = 0; - goto out_free; - } - realname = (char *) name; - } else + if (!is_kallsyms) { realname = realpath(name, NULL); + if (!realname) + goto out_free; + } - if (realname == NULL || filename == NULL || linkname == NULL) + dirname = build_id_cache__dirname_from_path(name, is_kallsyms, is_vdso); + if (!dirname) goto out_free; - len = scnprintf(filename, size, "%s%s%s", - buildid_dir, slash ? "/" : "", - is_vdso ? DSO__NAME_VDSO : realname); - if (mkdir_p(filename, 0755)) + if (mkdir_p(dirname, 0755)) goto out_free; - snprintf(filename + len, size - len, "/%s", sbuild_id); + if (asprintf(&filename, "%s/%s", dirname, sbuild_id) < 0) { + filename = NULL; + goto out_free; + } if (access(filename, F_OK)) { if (is_kallsyms) { @@ -337,6 +388,7 @@ out_free: if (!is_kallsyms) free(realname); free(filename); + free(dirname); free(linkname); return err; } diff --git a/tools/perf/util/build-id.h b/tools/perf/util/build-id.h index 2a09498..cbcadea 100644 --- a/tools/perf/util/build-id.h +++ b/tools/perf/util/build-id.h @@ -22,6 +22,7 @@ bool perf_session__read_build_ids(struct perf_session *session, bool with_hits); int perf_session__write_buildid_table(struct perf_session *session, int fd); int perf_session__cache_build_ids(struct perf_session *session); +struct strlist *build_id_cache__list_build_ids(const char *pathname); bool build_id_cache__cached(const char *sbuild_id); int build_id_cache__add_s(const char *sbuild_id, const char *name, bool is_kallsyms, bool is_vdso);
-- Thanks, Hemant Kumar -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/