aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/posix
diff options
context:
space:
mode:
authorRoland McGrath <roland@hack.frob.com>2013-03-19 17:07:15 -0700
committerRoland McGrath <roland@hack.frob.com>2013-03-19 17:07:15 -0700
commita600e5cef53e10147932d910cdb2fdfc62afae4e (patch)
treefddf4c1fefedcffaf6bdb610bc7c46bb931cb528 /sysdeps/posix
parent6b18bea6256e1eefebd27811873831d0e3f171de (diff)
downloadglibc-a600e5cef53e10147932d910cdb2fdfc62afae4e.tar
glibc-a600e5cef53e10147932d910cdb2fdfc62afae4e.tar.gz
glibc-a600e5cef53e10147932d910cdb2fdfc62afae4e.tar.bz2
glibc-a600e5cef53e10147932d910cdb2fdfc62afae4e.zip
Consolidate Linux and POSIX libc_fatal code.
Diffstat (limited to 'sysdeps/posix')
-rw-r--r--sysdeps/posix/libc_fatal.c37
1 files changed, 30 insertions, 7 deletions
diff --git a/sysdeps/posix/libc_fatal.c b/sysdeps/posix/libc_fatal.c
index 8d416006b5..afa1b816c3 100644
--- a/sysdeps/posix/libc_fatal.c
+++ b/sysdeps/posix/libc_fatal.c
@@ -1,4 +1,5 @@
-/* Copyright (C) 1993-2013 Free Software Foundation, Inc.
+/* Catastrophic failure reports. Generic POSIX.1 version.
+ Copyright (C) 1993-2013 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -27,6 +28,7 @@
#include <string.h>
#include <sysdep.h>
#include <unistd.h>
+#include <sys/mman.h>
#include <sys/syslog.h>
#include <sys/uio.h>
#include <not-cancel.h>
@@ -35,6 +37,25 @@
#include FATAL_PREPARE_INCLUDE
#endif
+#ifndef WRITEV_FOR_FATAL
+# define WRITEV_FOR_FATAL writev_for_fatal
+static bool
+writev_for_fatal (int fd, const struct iovec *iov, size_t niov, size_t total)
+{
+ return TEMP_FAILURE_RETRY (__writev (fd, iov, niov)) == total;
+}
+#endif
+
+#ifndef BEFORE_ABORT
+# define BEFORE_ABORT before_abort
+static void
+before_abort (int do_abort __attribute__ ((unused)),
+ bool written __attribute__ ((unused)),
+ int fd __attribute__ ((unused)))
+{
+}
+#endif
+
struct str_list
{
const char *str;
@@ -42,7 +63,6 @@ struct str_list
struct str_list *next;
};
-
/* Abort with an error message. */
void
__libc_message (int do_abort, const char *fmt, ...)
@@ -121,8 +141,7 @@ __libc_message (int do_abort, const char *fmt, ...)
list = list->next;
}
- if (TEMP_FAILURE_RETRY (__writev (fd, iov, nlist)) == total)
- written = true;
+ written = WRITEV_FOR_FATAL (fd, iov, nlist, total);
if (do_abort)
{
@@ -131,7 +150,7 @@ __libc_message (int do_abort, const char *fmt, ...)
struct abort_msg_s *buf = __mmap (NULL, total,
PROT_READ | PROT_WRITE,
MAP_ANON | MAP_PRIVATE, -1, 0);
- if (buf != MAP_FAILED)
+ if (__glibc_likely (buf != MAP_FAILED))
{
buf->size = total;
char *wp = buf->msg;
@@ -158,8 +177,12 @@ __libc_message (int do_abort, const char *fmt, ...)
va_end (ap_copy);
if (do_abort)
- /* Kill the application. */
- abort ();
+ {
+ BEFORE_ABORT (do_abort, written, fd);
+
+ /* Kill the application. */
+ abort ();
+ }
}