#define BACKTRACE_SZ 100
static char static_progname[256];
+#if HAVE_EXECINFO_H
static void yaz_invoke_backtrace(char *buf, int buf_sz)
{
FILE *file = yaz_log_file();
int fd = fileno(file);
-#if HAVE_EXECINFO_H
pid_t pid;
int fds[2];
void *backtrace_info[BACKTRACE_SZ];
sz = backtrace(backtrace_info, sz);
backtrace_symbols_fd(backtrace_info, sz, fd);
- pipe(fds);
+ if (pipe(fds) == -1)
+ {
+ const char *cp = "backtrace: pipe failed\n";
+ write(fd, cp, strlen(cp));
+ return;
+ }
pid = fork();
if (pid == (pid_t) (-1))
{ /* error */
- const char *cp = "backtrace: fork failure";
+ const char *cp = "backtrace: fork failure\n";
write(fd, cp, strlen(cp));
}
else if (pid == 0)
}
close(fds[1]);
}
-#else
- strcat(buf, "no backtrace support (execinfo.h not found)\n");
- write(fd, buf, strlen(buf));
-#endif
}
static void yaz_panic_sig_handler(int sig)
yaz_invoke_backtrace(buf, sizeof buf);
abort();
}
+#endif
void yaz_enable_panic_backtrace(const char *progname)
{