- } else if (clock_a->absolute) {
- /*
- * Absolute time references, such as NTP, are looked up
- * by clock name.
- */
- clock_b = g_hash_table_lookup(match->clocks,
- (gpointer) (unsigned long) clock_a->name);
- if (clock_b) {
- match->clock_match = clock_b;
- return;
+ g_ptr_array_add(traversed_paths, g_string_new(fpath));
+ }
+
+ return 0;
+}
+
+/*
+ * bt_context_add_traces_recursive: Open a trace recursively
+ *
+ * Find each trace present in the subdirectory starting from the given
+ * path, and add them to the context. The packet_seek parameter can be
+ * NULL: this specify to use the default format packet_seek.
+ *
+ * Return: 0 on success, < 0 on failure, > 0 on partial failure.
+ * Unable to open toplevel: failure.
+ * Unable to open some subdirectory or file: warn and continue (partial
+ * failure);
+ */
+int bt_context_add_traces_recursive(struct bt_context *ctx, const char *path,
+ const char *format_str,
+ void (*packet_seek)(struct bt_stream_pos *pos,
+ size_t offset, int whence))
+{
+ int ret = 0, trace_ids = 0;
+
+ /* Should lock traversed_paths mutex here if used in multithread */
+
+ traversed_paths = g_ptr_array_new();
+ ret = nftw(path, traverse_trace_dir, 10, 0);
+
+ /* Process the array if ntfw did not return a fatal error */
+ if (ret >= 0) {
+ int i;
+
+ for (i = 0; i < traversed_paths->len; i++) {
+ GString *trace_path = g_ptr_array_index(traversed_paths,
+ i);
+ int trace_id = bt_context_add_trace(ctx,
+ trace_path->str,
+ format_str,
+ packet_seek,
+ NULL,
+ NULL);
+ if (trace_id < 0) {
+ fprintf(stderr, "[warning] [Context] cannot open trace \"%s\" from %s "
+ "for reading.\n", trace_path->str, path);
+ /* Allow to skip erroneous traces. */
+ ret = 1; /* partial error */
+ } else {
+ trace_ids++;
+ }
+ g_string_free(trace_path, TRUE);