X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=converter%2Fbabeltrace.c;h=83f300c5d9b2fa7635614fa477b173621f6a68b2;hp=113655836a4777ba7b8b77043d976e3cb0252c4b;hb=05cab52530332c97aca9d8c78a8cae2f82f00896;hpb=9fe26ec7307661efcc268a58293564fdb55e5572 diff --git a/converter/babeltrace.c b/converter/babeltrace.c index 11365583..83f300c5 100644 --- a/converter/babeltrace.c +++ b/converter/babeltrace.c @@ -16,6 +16,14 @@ * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. */ #define _GNU_SOURCE @@ -48,16 +56,19 @@ #define DEFAULT_FILE_ARRAY_SIZE 1 -/* - * casting these to const char * to please libpopt. It allocates memory - * behind our back (this is of course not documented). - */ static char *opt_input_format, *opt_output_format; +/* + * We are not freeing opt_input_paths ipath elements when exiting from + * main() for backward compatibility with libpop 0.13, which does not + * allocate copies for arguments returned by poptGetArg(), and for + * general compatibility with the documented behavior. This is known to + * cause a small memory leak with libpop 0.16. + */ static GPtrArray *opt_input_paths; static char *opt_output_path; -static struct format *fmt_read; +static struct bt_format *fmt_read; static void strlower(char *str) @@ -91,11 +102,14 @@ enum { /* * We are _not_ using POPT_ARG_STRING ability to store directly into * variables, because we want to cast the return to non-const, which is - * not possible without using poptGetOptArg explicitly. + * not possible without using poptGetOptArg explicitly. This helps us + * controlling memory allocation correctly without making assumptions + * about undocumented behaviors. poptGetOptArg is documented as + * requiring the returned const char * to be freed by the caller. */ static struct poptOption long_options[] = { /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */ - { "output", 'w', POPT_ARG_STRING, NULL, OPT_NONE, NULL, NULL }, + { "output", 'w', POPT_ARG_STRING, NULL, OPT_OUTPUT_PATH, NULL, NULL }, { "input-format", 'i', POPT_ARG_STRING, NULL, OPT_INPUT_FORMAT, NULL, NULL }, { "output-format", 'o', POPT_ARG_STRING, NULL, OPT_OUTPUT_FORMAT, NULL, NULL }, { "help", 'h', POPT_ARG_NONE, NULL, OPT_HELP, NULL, NULL }, @@ -190,7 +204,6 @@ static int get_names_args(poptContext *pc) opt_payload_field_names = 0; } else { fprintf(stderr, "[error] unknown field name type %s\n", str); - free(strlist); ret = -EINVAL; goto end; } @@ -249,7 +262,7 @@ static int parse_options(int argc, char **argv) { poptContext pc; int opt, ret = 0; - char *ipath; + const char *ipath; if (argc == 1) { usage(stdout); @@ -360,7 +373,7 @@ static int parse_options(int argc, char **argv) } do { - ipath = (char *) poptGetArg(pc); + ipath = poptGetArg(pc); if (ipath) g_ptr_array_add(opt_input_paths, (gpointer) ipath); } while (ipath); @@ -432,6 +445,7 @@ static int traverse_trace_dir(const char *fpath, const struct stat *sb, return 0; } + /* * bt_context_add_traces_recursive: Open a trace recursively * @@ -446,13 +460,12 @@ static int traverse_trace_dir(const char *fpath, const struct stat *sb, */ int bt_context_add_traces_recursive(struct bt_context *ctx, const char *path, const char *format_str, - void (*packet_seek)(struct stream_pos *pos, + void (*packet_seek)(struct bt_stream_pos *pos, size_t offset, int whence)) { GArray *trace_ids; int ret = 0; - int i; /* Should lock traversed_paths mutex here if used in multithread */ @@ -463,6 +476,8 @@ int bt_context_add_traces_recursive(struct bt_context *ctx, const char *path, /* 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); @@ -483,6 +498,7 @@ int bt_context_add_traces_recursive(struct bt_context *ctx, const char *path, g_string_free(trace_path, TRUE); } } + g_ptr_array_free(traversed_paths, TRUE); traversed_paths = NULL; @@ -499,7 +515,7 @@ int bt_context_add_traces_recursive(struct bt_context *ctx, const char *path, return ret; } -int convert_trace(struct trace_descriptor *td_write, +int convert_trace(struct bt_trace_descriptor *td_write, struct bt_context *ctx) { struct bt_ctf_iter *iter; @@ -538,8 +554,8 @@ error_iter: int main(int argc, char **argv) { int ret, partial_error = 0, open_success = 0; - struct format *fmt_write; - struct trace_descriptor *td_write; + struct bt_format *fmt_write; + struct bt_trace_descriptor *td_write; struct bt_context *ctx; int i; @@ -590,7 +606,7 @@ int main(int argc, char **argv) } } fmt_read = bt_lookup_format(g_quark_from_static_string(opt_input_format)); - if (!fmt_read) { + if (!fmt_read || fmt_read->name != g_quark_from_static_string("ctf")) { fprintf(stderr, "[error] Format \"%s\" is not supported.\n\n", opt_input_format); partial_error = 1; @@ -670,10 +686,6 @@ end: free(opt_input_format); free(opt_output_format); free(opt_output_path); - for (i = 0; i < opt_input_paths->len; i++) { - char *ipath = g_ptr_array_index(opt_input_paths, i); - free(ipath); - } g_ptr_array_free(opt_input_paths, TRUE); if (partial_error) exit(EXIT_FAILURE);