* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#define _GNU_SOURCE
#include <getopt.h>
#include <signal.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <unistd.h>
-#include <config.h>
#include <ctype.h>
#include <dirent.h>
#include <byteswap.h>
#include <version.h>
#include <lttng/lttng.h>
#include <common/common.h>
+#include <common/utils.h>
#define DEFAULT_VIEWER "babeltrace"
/* Variables */
static char *progname,
- *opt_viewer_path = DEFAULT_VIEWER,
- *opt_output_path;
+ *opt_viewer_path = NULL,
+ *opt_output_path = NULL;
static char *input_path;
{ NULL, 0, NULL, 0 },
};
-static void usage(FILE *ofp)
+static void usage(void)
{
- fprintf(ofp, "LTTng Crash Trace Viewer " VERSION " - " VERSION_NAME "%s\n\n",
- GIT_VERSION[0] == '\0' ? "" : " - " GIT_VERSION);
- fprintf(ofp, "usage: lttng-crash [OPTIONS] FILE\n");
- fprintf(ofp, "\n");
- fprintf(ofp, "Options:\n");
- fprintf(ofp, " -V, --version Show version.\n");
- fprintf(ofp, " -h, --help Show this help.\n");
- fprintf(ofp, " --list-options Simple listing of lttng-crash options.\n");
- fprintf(ofp, " -v, --verbose Increase verbosity.\n");
- fprintf(ofp, " -e, --viewer Specify viewer and/or options to use. This will\n"
- " completely override the default viewers so please\n"
- " make sure to specify the full command. The trace\n"
- " directory paths appended at the end to the\n"
- " arguments.\n");
- fprintf(ofp, " -x, --extract PATH Extract trace(s) to specified path. Don't view\n"
- " trace.\n");
- fprintf(ofp, "\n");
- fprintf(ofp, "Please see the lttng-crash(1) man page for full documentation.\n");
- fprintf(ofp, "See http://lttng.org for updates, bug reports and news.\n");
+ int ret = utils_show_man_page(1, "lttng-crash");
+
+ if (ret) {
+ ERR("Cannot view man page lttng-crash(1)");
+ perror("exec");
+ exit(EXIT_FAILURE);
+ }
}
static void version(FILE *ofp)
int opt, ret = 0;
if (argc < 2) {
- usage(stderr);
+ usage();
exit(EXIT_FAILURE);
}
- while ((opt = getopt_long(argc, argv, "+Vhvex:", long_options, NULL)) != -1) {
+ while ((opt = getopt_long(argc, argv, "+Vhve:x:", long_options, NULL)) != -1) {
switch (opt) {
case 'V':
version(stdout);
ret = 1;
goto end;
case 'h':
- usage(stdout);
+ usage();
ret = 1;
goto end;
case 'v':
}
break;
case 'e':
+ free(opt_viewer_path);
opt_viewer_path = strdup(optarg);
break;
case 'x':
+ free(opt_output_path);
opt_output_path = strdup(optarg);
break;
case OPT_DUMP_OPTIONS:
ret = 1;
goto end;
default:
- usage(stderr);
+ ERR("Unknown command-line option");
goto error;
}
}
+ if (!opt_viewer_path) {
+ opt_viewer_path = DEFAULT_VIEWER;
+ }
+
/* No leftovers, or more than one input path, print usage and quit */
- if ((argc - optind) == 0 || (argc - optind) > 1) {
- usage(stderr);
+ if (argc - optind != 1) {
+ ERR("Command-line error: Specify exactly one input path");
goto error;
}
return -EINVAL;
}
- DBG("Copy crash subbuffer at offset %lu", offset);
+ DBG("Copy crash subbuffer at offset %" PRIu64, offset);
sbidx = subbuf_index(offset, buf_size, subbuf_size);
/*
break;
}
case DT_REG:
+ case DT_LNK:
if (!strcmp(entry->d_name, "metadata")) {
ret = extract_one_trace(output_path,
input_path);