aboutsummaryrefslogtreecommitdiff
path: root/libgfortran/runtime/backtrace.c
diff options
context:
space:
mode:
Diffstat (limited to 'libgfortran/runtime/backtrace.c')
-rw-r--r--libgfortran/runtime/backtrace.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/libgfortran/runtime/backtrace.c b/libgfortran/runtime/backtrace.c
index b824688..e0c2770 100644
--- a/libgfortran/runtime/backtrace.c
+++ b/libgfortran/runtime/backtrace.c
@@ -68,6 +68,7 @@ static void
error_callback (void *data, const char *msg, int errnum)
{
struct mystate *state = (struct mystate *) data;
+ struct iovec iov[5];
#define ERRHDR "\nCould not print backtrace: "
if (errnum < 0)
@@ -77,21 +78,31 @@ error_callback (void *data, const char *msg, int errnum)
}
else if (errnum == 0)
{
- estr_write (ERRHDR);
- estr_write (msg);
- estr_write ("\n");
+ iov[0].iov_base = (char*) ERRHDR;
+ iov[0].iov_len = strlen (ERRHDR);
+ iov[1].iov_base = (char*) msg;
+ iov[1].iov_len = strlen (msg);
+ iov[2].iov_base = (char*) "\n";
+ iov[2].iov_len = 1;
+ estr_writev (iov, 3);
}
else
{
char errbuf[256];
if (state->in_signal_handler)
{
- estr_write (ERRHDR);
- estr_write (msg);
- estr_write (", errno: ");
+ iov[0].iov_base = (char*) ERRHDR;
+ iov[0].iov_len = strlen (ERRHDR);
+ iov[1].iov_base = (char*) msg;
+ iov[1].iov_len = strlen (msg);
+ iov[2].iov_base = (char*) ", errno: ";
+ iov[2].iov_len = strlen (iov[2].iov_base);
const char *p = gfc_itoa (errnum, errbuf, sizeof (errbuf));
- estr_write (p);
- estr_write ("\n");
+ iov[3].iov_base = (char*) p;
+ iov[3].iov_len = strlen (p);
+ iov[4].iov_base = (char*) "\n";
+ iov[4].iov_len = 1;
+ estr_writev (iov, 5);
}
else
st_printf (ERRHDR "%s: %s\n", msg,