// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2021, VMware, Tzvetomir Stoyanov */ #include #include #include #include #include #include "trace-local.h" #include "trace-cmd.h" #include "trace-cmd-private.h" static void convert_file(const char *in, const char *out, int file_version, char *compr) { struct tracecmd_input *ihandle; struct tracecmd_output *ohandle; ihandle = tracecmd_open_head(in, 0); if (!ihandle) die("error reading %s", in); ohandle = tracecmd_copy(ihandle, out, TRACECMD_FILE_CPU_FLYRECORD, file_version, compr); if (!ohandle) die("error writing %s", out); tracecmd_output_close(ohandle); tracecmd_close(ihandle); } enum { OPT_file_version = 254, OPT_compression = 255, }; void trace_convert(int argc, char **argv) { char *input_file = NULL; char *output_file = NULL; char *compression = NULL; int file_version = tracecmd_default_file_version(); int c; if (argc < 2) usage(argv); if (strcmp(argv[1], "convert") != 0) usage(argv); for (;;) { int option_index = 0; static struct option long_options[] = { {"compression", required_argument, NULL, OPT_compression}, {"file-version", required_argument, NULL, OPT_file_version}, {"help", no_argument, NULL, '?'}, {NULL, 0, NULL, 0} }; c = getopt_long (argc-1, argv+1, "+hi:o:", long_options, &option_index); if (c == -1) break; switch (c) { case 'i': if (input_file) die("Only one input file is supported, %s already set", input_file); input_file = optarg; break; case 'o': if (output_file) die("Only one output file is supported, %s already set", output_file); output_file = optarg; break; case OPT_compression: if (strcmp(optarg, "any") && strcmp(optarg, "none") && !tracecmd_compress_is_supported(optarg, NULL)) die("Compression algorithm %s is not supported", optarg); compression = optarg; break; case OPT_file_version: file_version = atoi(optarg); if (file_version < FILE_VERSION_MIN || file_version > FILE_VERSION_MAX) die("Unsupported file version %d, " "supported versions are from %d to %d", file_version, FILE_VERSION_MIN, FILE_VERSION_MAX); break; case 'h': case '?': default: usage(argv); } } if ((argc - optind) >= 2) { if (output_file) usage(argv); output_file = argv[optind + 1]; } if (!input_file) input_file = DEFAULT_INPUT_FILE; if (!output_file) usage(argv); convert_file(input_file, output_file, file_version, compression); }