port: fix compat/endian.h on FreeBSD
[lttng-tools.git] / src / bin / lttng-crash / lttng-crash.c
index 53de81bd46b640bb77862d6af48a472217844310..7f1f52803f9f5c5102ebcdbc5b8f5cd1281fa3d0 100644 (file)
@@ -2,18 +2,8 @@
  * Copyright (C) 2011 David Goulet <david.goulet@polymtl.ca>
  * Copyright (C) 2014 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2 only,
- * as published by the Free Software Foundation.
+ * SPDX-License-Identifier: GPL-2.0-only
  *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
 #include <getopt.h>
 #include <unistd.h>
 #include <ctype.h>
 #include <dirent.h>
-#include <byteswap.h>
+#include <common/compat/endian.h>
 #include <inttypes.h>
 #include <stdbool.h>
 
 #include <version.h>
 #include <lttng/lttng.h>
 #include <common/common.h>
+#include <common/spawn-viewer.h>
 #include <common/utils.h>
 
-#define DEFAULT_VIEWER "babeltrace"
-
 #define COPY_BUFLEN            4096
 #define RB_CRASH_DUMP_ABI_LEN  32
 
@@ -190,9 +179,9 @@ struct lttng_crash_layout {
 };
 
 /* Variables */
-static char *progname,
-       *opt_viewer_path = NULL,
-       *opt_output_path = NULL;
+static const char *progname;
+static char *opt_viewer_path = NULL;
+static char *opt_output_path = NULL;
 
 static char *input_path;
 
@@ -227,9 +216,10 @@ static void usage(void)
 static void version(FILE *ofp)
 {
        fprintf(ofp, "%s (LTTng Crash Trace Viewer) " VERSION " - " VERSION_NAME
-"%s\n",
+                       "%s%s\n",
                        progname,
-                       GIT_VERSION[0] == '\0' ? "" : " - " GIT_VERSION);
+                       GIT_VERSION[0] == '\0' ? "" : " - " GIT_VERSION,
+                       EXTRA_VERSION_NAME[0] == '\0' ? "" : " - " EXTRA_VERSION_NAME);
 }
 
 /*
@@ -304,10 +294,6 @@ static int parse_args(int argc, char **argv)
                }
        }
 
-       if (!opt_viewer_path) {
-               opt_viewer_path = DEFAULT_VIEWER;
-       }
-
        /* No leftovers, or more than one input path, print usage and quit */
        if (argc - optind != 1) {
                ERR("Command-line error: Specify exactly one input path");
@@ -387,19 +373,19 @@ uint64_t _crash_get_field(const struct lttng_crash_layout *layout,
        switch (size) {
        case 1: return *(uint8_t *) ptr;
        case 2: if (layout->reverse_byte_order) {
-                       return __bswap_16(*(uint16_t *) ptr);
+                       return bswap_16(*(uint16_t *) ptr);
                } else {
                        return *(uint16_t *) ptr;
 
                }
        case 4: if (layout->reverse_byte_order) {
-                       return __bswap_32(*(uint32_t *) ptr);
+                       return bswap_32(*(uint32_t *) ptr);
                } else {
                        return *(uint32_t *) ptr;
 
                }
        case 8: if (layout->reverse_byte_order) {
-                       return __bswap_64(*(uint64_t *) ptr);
+                       return bswap_64(*(uint64_t *) ptr);
                } else {
                        return *(uint64_t *) ptr;
                }
@@ -498,7 +484,8 @@ int check_magic(const uint8_t *magic)
 }
 
 static
-int get_crash_layout(struct lttng_crash_layout *layout, int fd)
+int get_crash_layout(struct lttng_crash_layout *layout, int fd,
+               const char *input_file)
 {
        char *map;
        int ret = 0, unmapret;
@@ -509,7 +496,21 @@ int get_crash_layout(struct lttng_crash_layout *layout, int fd)
        const struct crash_abi_unknown *abi;
        uint16_t endian;
        enum lttng_crash_type layout_type;
+       struct stat stat;
 
+       ret = fstat(fd, &stat);
+       if (ret < 0) {
+               PERROR("Failed to fstat '%s'", input_file);
+               return -1;
+       }
+       if (stat.st_size < RB_CRASH_DUMP_ABI_LEN) {
+               ERR("File '%s' truncated: file length of %" PRIi64
+                               " bytes does not meet the minimal expected "
+                               "length of %d bytes",
+                               input_file, (int64_t) stat.st_size,
+                               RB_CRASH_DUMP_ABI_LEN);
+               return -1;
+       }
        map = mmap(NULL, RB_CRASH_DUMP_ABI_LEN, PROT_READ, MAP_PRIVATE,
                fd, 0);
        if (map == MAP_FAILED) {
@@ -719,7 +720,7 @@ int copy_crash_subbuf(const struct lttng_crash_layout *layout,
                                subbuf_ptr + layout->offset.packet_size,
                                layout->length.packet_size);
                        if (layout->reverse_byte_order) {
-                               packet_size = __bswap_64(packet_size);
+                               packet_size = bswap_64(packet_size);
                        }
                        packet_size /= CHAR_BIT;
                } else {
@@ -735,7 +736,7 @@ int copy_crash_subbuf(const struct lttng_crash_layout *layout,
                 */
                patch_size = committed * CHAR_BIT;
                if (layout->reverse_byte_order) {
-                       patch_size = __bswap_64(patch_size);
+                       patch_size = bswap_64(patch_size);
                }
                if (layout->length.content_size) {
                        memcpy(subbuf_ptr + layout->offset.content_size,
@@ -838,7 +839,7 @@ int extract_file(int output_dir_fd, const char *output_file,
        }
 
        /* Query the crash ABI layout */
-       ret = get_crash_layout(&layout, fd_src);
+       ret = get_crash_layout(&layout, fd_src, input_file);
        if (ret) {
                goto close_src;
        }
@@ -1087,7 +1088,7 @@ int delete_dir_recursive(const char *path)
        if (!dir) {
                PERROR("Cannot open '%s' path", path);
                ret = -errno;
-               goto end;
+               goto end_no_closedir;
        }
 
        path_len = strlen(path);
@@ -1170,11 +1171,12 @@ end:
        if (closeret) {
                PERROR("closedir");
        }
+end_no_closedir:
        return ret;
 }
 
 static
-int view_trace(const char *viewer_path, const char *trace_path)
+int view_trace(const char *trace_path, char *viewer_path)
 {
        pid_t pid;
 
@@ -1195,13 +1197,12 @@ int view_trace(const char *viewer_path, const char *trace_path)
                /* Child */
                int ret;
 
-               ret = execlp(viewer_path, viewer_path,
-                       trace_path, (char *) NULL);
+               ret = spawn_viewer(trace_path, viewer_path, false);
                if (ret) {
-                       PERROR("execlp");
                        exit(EXIT_FAILURE);
                }
-               exit(EXIT_SUCCESS);     /* Never reached */
+               /* Never reached */
+               exit(EXIT_SUCCESS);
        }
        return 0;
 }
@@ -1253,7 +1254,7 @@ int main(int argc, char *argv[])
        }
        if (!opt_output_path) {
                /* View trace */
-               ret = view_trace(opt_viewer_path, output_path);
+               ret = view_trace(output_path, opt_viewer_path);
                if (ret) {
                        has_warning = true;
                }
This page took 0.02574 seconds and 4 git commands to generate.