|
@@ -1608,25 +1608,27 @@ out:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+static bool visible_dir_filter(const char *name, struct dirent *d)
|
|
|
+{
|
|
|
+ if (d->d_type != DT_DIR)
|
|
|
+ return false;
|
|
|
+ return lsdir_no_dot_filter(name, d);
|
|
|
+}
|
|
|
+
|
|
|
static int find_matching_kcore(struct map *map, char *dir, size_t dir_sz)
|
|
|
{
|
|
|
char kallsyms_filename[PATH_MAX];
|
|
|
- struct dirent *dent;
|
|
|
int ret = -1;
|
|
|
- DIR *d;
|
|
|
+ struct strlist *dirs;
|
|
|
+ struct str_node *nd;
|
|
|
|
|
|
- d = opendir(dir);
|
|
|
- if (!d)
|
|
|
+ dirs = lsdir(dir, visible_dir_filter);
|
|
|
+ if (!dirs)
|
|
|
return -1;
|
|
|
|
|
|
- while (1) {
|
|
|
- dent = readdir(d);
|
|
|
- if (!dent)
|
|
|
- break;
|
|
|
- if (dent->d_type != DT_DIR)
|
|
|
- continue;
|
|
|
+ strlist__for_each(nd, dirs) {
|
|
|
scnprintf(kallsyms_filename, sizeof(kallsyms_filename),
|
|
|
- "%s/%s/kallsyms", dir, dent->d_name);
|
|
|
+ "%s/%s/kallsyms", dir, nd->s);
|
|
|
if (!validate_kcore_addresses(kallsyms_filename, map)) {
|
|
|
strlcpy(dir, kallsyms_filename, dir_sz);
|
|
|
ret = 0;
|
|
@@ -1634,7 +1636,7 @@ static int find_matching_kcore(struct map *map, char *dir, size_t dir_sz)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- closedir(d);
|
|
|
+ strlist__delete(dirs);
|
|
|
|
|
|
return ret;
|
|
|
}
|