perf data: Add perf_data__open_dir_data function
Add perf_data__open_dir_data to open files inside 'struct perf_data' path directory: static int perf_data__open_dir(struct perf_data *data); Signed-off-by: Jiri Olsa <jolsa@kernel.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Alexey Budankov <alexey.budankov@linux.intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/r/20190224190656.30163-10-jolsa@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
1455206311
commit
eb6176709b
|
@ -8,6 +8,8 @@
|
|||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <asm/bug.h>
|
||||
#include <sys/types.h>
|
||||
#include <dirent.h>
|
||||
|
||||
#include "data.h"
|
||||
#include "util.h"
|
||||
|
@ -59,6 +61,63 @@ out_err:
|
|||
return ret;
|
||||
}
|
||||
|
||||
int perf_data__open_dir(struct perf_data *data)
|
||||
{
|
||||
struct perf_data_file *files = NULL;
|
||||
struct dirent *dent;
|
||||
int ret = -1;
|
||||
DIR *dir;
|
||||
int nr = 0;
|
||||
|
||||
dir = opendir(data->path);
|
||||
if (!dir)
|
||||
return -EINVAL;
|
||||
|
||||
while ((dent = readdir(dir)) != NULL) {
|
||||
struct perf_data_file *file;
|
||||
char path[PATH_MAX];
|
||||
struct stat st;
|
||||
|
||||
snprintf(path, sizeof(path), "%s/%s", data->path, dent->d_name);
|
||||
if (stat(path, &st))
|
||||
continue;
|
||||
|
||||
if (!S_ISREG(st.st_mode) || strncmp(dent->d_name, "data", 4))
|
||||
continue;
|
||||
|
||||
ret = -ENOMEM;
|
||||
|
||||
file = realloc(files, (nr + 1) * sizeof(*files));
|
||||
if (!file)
|
||||
goto out_err;
|
||||
|
||||
files = file;
|
||||
file = &files[nr++];
|
||||
|
||||
file->path = strdup(path);
|
||||
if (!file->path)
|
||||
goto out_err;
|
||||
|
||||
ret = open(file->path, O_RDONLY);
|
||||
if (ret < 0)
|
||||
goto out_err;
|
||||
|
||||
file->fd = ret;
|
||||
file->size = st.st_size;
|
||||
}
|
||||
|
||||
if (!files)
|
||||
return -EINVAL;
|
||||
|
||||
data->dir.files = files;
|
||||
data->dir.nr = nr;
|
||||
return 0;
|
||||
|
||||
out_err:
|
||||
close_dir(files, nr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool check_pipe(struct perf_data *data)
|
||||
{
|
||||
struct stat st;
|
||||
|
|
|
@ -71,5 +71,6 @@ int perf_data__switch(struct perf_data *data,
|
|||
size_t pos, bool at_exit);
|
||||
|
||||
int perf_data__create_dir(struct perf_data *data, int nr);
|
||||
int perf_data__open_dir(struct perf_data *data);
|
||||
void perf_data__close_dir(struct perf_data *data);
|
||||
#endif /* __PERF_DATA_H */
|
||||
|
|
Loading…
Reference in New Issue