-int path_is_ctf_trace(const char *path)
-{
- GString *metadata_path = g_string_new(NULL);
- int ret = 0;
-
- if (!metadata_path) {
- ret = -1;
- goto end;
- }
-
- g_string_printf(metadata_path, "%s" G_DIR_SEPARATOR_S "%s", path, CTF_FS_METADATA_FILENAME);
-
- if (g_file_test(metadata_path->str, G_FILE_TEST_IS_REGULAR)) {
- ret = 1;
- goto end;
- }
-
-end:
- g_string_free(metadata_path, TRUE);
- return ret;
-}
-
-static
-int add_trace_path(GList **trace_paths, const char *path,
- bt_logging_level log_level, bt_self_component *self_comp)
-{
- GString *norm_path = NULL;
- int ret = 0;
-
- norm_path = bt_common_normalize_path(path, NULL);
- if (!norm_path) {
- BT_COMP_LOGE("Failed to normalize path `%s`.", path);
- ret = -1;
- goto end;
- }
-
- // FIXME: Remove or ifdef for __MINGW32__
- if (strcmp(norm_path->str, "/") == 0) {
- BT_COMP_LOGE("Opening a trace in `/` is not supported.");
- ret = -1;
- goto end;
- }
-
- *trace_paths = g_list_prepend(*trace_paths, norm_path);
- BT_ASSERT(*trace_paths);
- norm_path = NULL;
-
-end:
- if (norm_path) {
- g_string_free(norm_path, TRUE);
- }
-
- return ret;
-}
-
-static
-int ctf_fs_find_traces(GList **trace_paths, const char *start_path,
- bt_logging_level log_level, bt_self_component *self_comp)
-{
- int ret;
- GError *error = NULL;
- GDir *dir = NULL;
- const char *basename = NULL;
-
- /* Check if the starting path is a CTF trace itself */
- ret = path_is_ctf_trace(start_path);
- if (ret < 0) {
- goto end;
- }
-
- if (ret) {
- /*
- * Stop recursion: a CTF trace cannot contain another
- * CTF trace.
- */
- ret = add_trace_path(trace_paths, start_path, log_level,
- self_comp);
- goto end;
- }
-
- /* Look for subdirectories */
- if (!g_file_test(start_path, G_FILE_TEST_IS_DIR)) {
- /* Starting path is not a directory: end of recursion */
- goto end;
- }
-
- dir = g_dir_open(start_path, 0, &error);
- if (!dir) {
- if (error->code == G_FILE_ERROR_ACCES) {
- BT_COMP_LOGI("Cannot open directory `%s`: %s (code %d): continuing",
- start_path, error->message, error->code);
- goto end;
- }
-
- BT_COMP_LOGE("Cannot open directory `%s`: %s (code %d)",
- start_path, error->message, error->code);
- ret = -1;
- goto end;
- }
-
- while ((basename = g_dir_read_name(dir))) {
- GString *sub_path = g_string_new(NULL);
-
- if (!sub_path) {
- ret = -1;
- goto end;
- }
-
- g_string_printf(sub_path, "%s" G_DIR_SEPARATOR_S "%s", start_path, basename);
- ret = ctf_fs_find_traces(trace_paths, sub_path->str,
- log_level, self_comp);
- g_string_free(sub_path, TRUE);
- if (ret) {
- goto end;
- }
- }
-
-end:
- if (dir) {
- g_dir_close(dir);
- }
-
- if (error) {
- g_error_free(error);
- }
-
- return ret;
-}
-
-static
-GList *ctf_fs_create_trace_names(GList *trace_paths, const char *base_path) {
- GList *trace_names = NULL;
- GList *node;
- const char *last_sep;
- size_t base_dist;
-
- /*
- * At this point we know that all the trace paths are
- * normalized, and so is the base path. This means that
- * they are absolute and they don't end with a separator.
- * We can simply find the location of the last separator
- * in the base path, which gives us the name of the actual
- * directory to look into, and use this location as the
- * start of each trace name within each trace path.
- *
- * For example:
- *
- * Base path: /home/user/my-traces/some-trace
- * Trace paths:
- * - /home/user/my-traces/some-trace/host1/trace1
- * - /home/user/my-traces/some-trace/host1/trace2
- * - /home/user/my-traces/some-trace/host2/trace
- * - /home/user/my-traces/some-trace/other-trace
- *
- * In this case the trace names are:
- *
- * - some-trace/host1/trace1
- * - some-trace/host1/trace2
- * - some-trace/host2/trace
- * - some-trace/other-trace
- */
- last_sep = strrchr(base_path, G_DIR_SEPARATOR);
-
- /* We know there's at least one separator */
- BT_ASSERT(last_sep);