X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=converter%2Fbabeltrace.c;h=d5a7040cdb33b4bc4085a2c31cb8efcd8a3b8c6a;hb=a386e24609752742b100120db6798d311fab512a;hp=a34af175f9e817545c3b9ef2cf2863aa487ae151;hpb=7237592a76cceda97a1c79904fed583e215d3fa9;p=babeltrace.git diff --git a/converter/babeltrace.c b/converter/babeltrace.c index a34af175..d5a7040c 100644 --- a/converter/babeltrace.c +++ b/converter/babeltrace.c @@ -93,6 +93,7 @@ enum { OPT_FIELDS, OPT_NO_DELTA, OPT_CLOCK_OFFSET, + OPT_CLOCK_OFFSET_NS, OPT_CLOCK_CYCLES, OPT_CLOCK_SECONDS, OPT_CLOCK_DATE, @@ -121,6 +122,7 @@ static struct poptOption long_options[] = { { "fields", 'f', POPT_ARG_STRING, NULL, OPT_FIELDS, NULL, NULL }, { "no-delta", 0, POPT_ARG_NONE, NULL, OPT_NO_DELTA, NULL, NULL }, { "clock-offset", 0, POPT_ARG_STRING, NULL, OPT_CLOCK_OFFSET, NULL, NULL }, + { "clock-offset-ns", 0, POPT_ARG_STRING, NULL, OPT_CLOCK_OFFSET_NS, NULL, NULL }, { "clock-cycles", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_CYCLES, NULL, NULL }, { "clock-seconds", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_SECONDS, NULL, NULL }, { "clock-date", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_DATE, NULL, NULL }, @@ -164,6 +166,7 @@ static void usage(FILE *fp) fprintf(fp, " (default: trace:hostname,trace:procname,trace:vpid)\n"); fprintf(fp, " --clock-cycles Timestamp in cycles\n"); fprintf(fp, " --clock-offset seconds Clock offset in seconds\n"); + fprintf(fp, " --clock-offset-ns ns Clock offset in nanoseconds\n"); fprintf(fp, " --clock-seconds Print the timestamps as [sec.ns]\n"); fprintf(fp, " (default is: [hh:mm:ss.ns])\n"); fprintf(fp, " --clock-date Print clock date\n"); @@ -357,6 +360,29 @@ static int parse_options(int argc, char **argv) case OPT_CLOCK_SECONDS: opt_clock_seconds = 1; break; + case OPT_CLOCK_OFFSET_NS: + { + char *str; + char *endptr; + + str = (char *) poptGetOptArg(pc); + if (!str) { + fprintf(stderr, "[error] Missing --clock-offset-ns argument\n"); + ret = -EINVAL; + goto end; + } + errno = 0; + opt_clock_offset_ns = strtoull(str, &endptr, 0); + if (*endptr != '\0' || str == endptr || errno != 0) { + fprintf(stderr, "[error] Incorrect --clock-offset-ns argument: %s\n", str); + ret = -EINVAL; + free(str); + goto end; + } + free(str); + break; + } + case OPT_CLOCK_DATE: opt_clock_date = 1; break; @@ -425,15 +451,20 @@ static int traverse_trace_dir(const char *fpath, const struct stat *sb, /* No meta data, just return */ return 0; } else { + int err_close = 0; + closeret = close(metafd); if (closeret < 0) { perror("close"); - return -1; /* failure */ + err_close = 1; } closeret = close(dirfd); if (closeret < 0) { perror("close"); - return -1; /* failure */ + err_close = 1; + } + if (err_close) { + return -1; } /* Add path to the global list */ @@ -464,15 +495,11 @@ int bt_context_add_traces_recursive(struct bt_context *ctx, const char *path, void (*packet_seek)(struct bt_stream_pos *pos, size_t offset, int whence)) { - - GArray *trace_ids; - int ret = 0; + int ret = 0, trace_ids = 0; /* Should lock traversed_paths mutex here if used in multithread */ traversed_paths = g_ptr_array_new(); - trace_ids = g_array_new(FALSE, TRUE, sizeof(int)); - ret = nftw(path, traverse_trace_dir, 10, 0); /* Process the array if ntfw did not return a fatal error */ @@ -494,7 +521,7 @@ int bt_context_add_traces_recursive(struct bt_context *ctx, const char *path, /* Allow to skip erroneous traces. */ ret = 1; /* partial error */ } else { - g_array_append_val(trace_ids, trace_id); + trace_ids++; } g_string_free(trace_path, TRUE); } @@ -508,11 +535,10 @@ int bt_context_add_traces_recursive(struct bt_context *ctx, const char *path, /* * Return an error if no trace can be opened. */ - if (trace_ids->len == 0) { + if (trace_ids == 0) { fprintf(stderr, "[error] Cannot open any trace for reading.\n\n"); ret = -ENOENT; /* failure */ } - g_array_free(trace_ids, TRUE); return ret; }