1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-28 00:21:52 +03:00

Consolidate Linux and POSIX libc_fatal code.

This commit is contained in:
Roland McGrath
2013-03-19 17:07:15 -07:00
parent 6b18bea625
commit a600e5cef5
3 changed files with 82 additions and 185 deletions

View File

@ -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 ();
}
}