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/

Reply via email to