mirror of https://gitee.com/Nocallback/glibc.git
Browse Source
* locale/xlocale.h: Define locale_t type. * locale/locale.h: duplocale, freelocale, newlocale, uselocale are in POSIX 2008. Don't define locale_t here. * stdlib/monetary.h: strfmon_l is in POSIX 2008. * signal/signal.h: Declare psignal and psiginfo for POSIX 2008. * stdio-common/psiginfo.c: New file. * stdio-common/psiginfo-data.h: New file. * stdio-common/psiginfo-define.h: New file. * stdio-common/Makefile (routines): Add psiginfo. * stdio-common/Versions: Export psiginfo for GLIBC_2.10.cvs/master
9 changed files with 272 additions and 6 deletions
@ -0,0 +1,50 @@ |
|||
#if NOW == SIGILL |
|||
P (ILL_ILLOPC, N_("Illegal opcode")) |
|||
P (ILL_ILLOPN, N_("Illegal operand")) |
|||
P (ILL_ILLADR, N_("Illegal addressing mode")) |
|||
P (ILL_ILLTRP, N_("Illegal trap")) |
|||
P (ILL_PRVOPC, N_("Privileged opcode")) |
|||
P (ILL_PRVREG, N_("Privileged register")) |
|||
P (ILL_COPROC, N_("Coprocessor error")) |
|||
P (ILL_BADSTK, N_("Internal stack error")) |
|||
#endif |
|||
#if NOW == SIGFPE |
|||
P (FPE_INTDIV, N_("Integer divide by zero")) |
|||
P (FPE_INTOVF, N_("Integer overflow")) |
|||
P (FPE_FLTDIV, N_("Floating-point divide by zero")) |
|||
P (FPE_FLTOVF, N_("Floating-point overflow")) |
|||
P (FPE_FLTUND, N_("Floating-point underflow")) |
|||
P (FPE_FLTRES, N_("Floating-poing inexact result")) |
|||
P (FPE_FLTINV, N_("Invalid floating-point operation")) |
|||
P (FPE_FLTSUB, N_("Subscript out of range")) |
|||
#endif |
|||
#if NOW == SIGSEGV |
|||
P (SEGV_MAPERR, N_("Address not mapped to object")) |
|||
P (SEGV_ACCERR, N_("Invalid permissions for mapped object")) |
|||
#endif |
|||
#if NOW == SIGBUS |
|||
P (BUS_ADRALN, N_("Invalid address alignment")) |
|||
P (BUS_ADRERR, N_("Nonexisting physical address")) |
|||
P (BUS_OBJERR, N_("Object-specific hardware error")) |
|||
#endif |
|||
#if NOW == SIGTRAP |
|||
P (TRAP_BRKPT, N_("Process breakpoint")) |
|||
P (TRAP_TRACE, N_("Process trace trap")) |
|||
#endif |
|||
#if NOW == SIGCLD |
|||
P (CLD_EXITED, N_("Child has exited")) |
|||
P (CLD_KILLED, N_("Child has terminated abnormally and did not create a core file")) |
|||
P (CLD_DUMPED, N_("Child hat terminated abnormally and created a core file")) |
|||
P (CLD_TRAPPED, N_("Traced child has trapped")) |
|||
P (CLD_STOPPED, N_("Child has stopped")) |
|||
P (CLD_CONTINUED, N_("Stopped child has continued")) |
|||
#endif |
|||
#if NOW == SIGPOLL |
|||
P (POLL_IN, N_("Data input available")) |
|||
P (POLL_OUT, N_("Output buffers available")) |
|||
P (POLL_MSG, N_("Input message available")) |
|||
P (POLL_ERR, N_("I/O error")) |
|||
P (POLL_PRI, N_("High priority input available")) |
|||
P (POLL_HUP, N_("Device disconnected")) |
|||
#endif |
|||
#undef P |
|||
@ -0,0 +1,15 @@ |
|||
static const union C(codestrs_t_, NOW) { |
|||
struct { |
|||
#define P(n, s) char MF(__LINE__)[sizeof (s)]; |
|||
#include "psiginfo-data.h" |
|||
}; |
|||
char str[0]; |
|||
} C(codestrs_, NOW) = { { |
|||
#define P(n, s) s, |
|||
#include "psiginfo-data.h" |
|||
} }; |
|||
static const uint8_t C(codes_, NOW)[] = { |
|||
#define P(n, s) [(n) - 1] = offsetof (union C(codestrs_t_, NOW), MF(__LINE__)), |
|||
#include "psiginfo-data.h" |
|||
}; |
|||
#undef NOW |
|||
@ -0,0 +1,178 @@ |
|||
/* Copyright (C) 2009 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 |
|||
modify it under the terms of the GNU Lesser General Public |
|||
License as published by the Free Software Foundation; either |
|||
version 2.1 of the License, or (at your option) any later version. |
|||
|
|||
The GNU C Library 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 |
|||
Lesser General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU Lesser General Public |
|||
License along with the GNU C Library; if not, write to the Free |
|||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA |
|||
02111-1307 USA. */ |
|||
|
|||
#include <libintl.h> |
|||
#include <signal.h> |
|||
#include <stdint.h> |
|||
#include <stdio.h> |
|||
#include <stdlib.h> |
|||
#include <string.h> |
|||
#include <unistd.h> |
|||
#include <not-cancel.h> |
|||
|
|||
|
|||
#define MF(l) MF1 (l) |
|||
#define MF1(l) str_##l |
|||
#define C(s1, s2) C1 (s1, s2) |
|||
#define C1(s1, s2) s1##s2 |
|||
|
|||
#define NOW SIGILL |
|||
#include "psiginfo-define.h" |
|||
|
|||
#define NOW SIGFPE |
|||
#include "psiginfo-define.h" |
|||
|
|||
#define NOW SIGSEGV |
|||
#include "psiginfo-define.h" |
|||
|
|||
#define NOW SIGBUS |
|||
#include "psiginfo-define.h" |
|||
|
|||
#define NOW SIGTRAP |
|||
#include "psiginfo-define.h" |
|||
|
|||
#define NOW SIGCLD |
|||
#include "psiginfo-define.h" |
|||
|
|||
#define NOW SIGPOLL |
|||
#include "psiginfo-define.h" |
|||
|
|||
|
|||
/* Print out on stderr a line consisting of the test in S, a colon, a space,
|
|||
a message describing the meaning of the signal number PINFO and a newline. |
|||
If S is NULL or "", the colon and space are omitted. */ |
|||
void |
|||
psiginfo (const siginfo_t *pinfo, const char *s) |
|||
{ |
|||
char buf[512]; |
|||
FILE *fp = fmemopen (buf, sizeof (buf), "w"); |
|||
if (fp == NULL) |
|||
{ |
|||
const char *colon; |
|||
|
|||
if (s == NULL || *s == '\0') |
|||
s = colon = ""; |
|||
else |
|||
colon = ": "; |
|||
|
|||
__fxprintf (NULL, "%s%ssignal %d\n", s, colon, pinfo->si_signo); |
|||
return; |
|||
} |
|||
|
|||
if (s != NULL && *s != '\0') |
|||
fprintf (fp, "%s: ", s); |
|||
|
|||
const char *desc; |
|||
if (pinfo->si_signo >= 0 && pinfo->si_signo < NSIG |
|||
&& (desc = INTUSE(_sys_siglist)[pinfo->si_signo]) != NULL) |
|||
{ |
|||
fprintf (fp, "%s (", _(desc)); |
|||
|
|||
const char *base = NULL; |
|||
const uint8_t *offarr = NULL; |
|||
size_t offarr_len = 0; |
|||
switch (pinfo->si_signo) |
|||
{ |
|||
#define H(sig) \ |
|||
case sig: \ |
|||
base = C(codestrs_, sig).str; \ |
|||
offarr = C (codes_, sig); \ |
|||
offarr_len = sizeof (C (codes_, sig)) / sizeof (C (codes_, sig)[0]);\ |
|||
break |
|||
|
|||
H (SIGILL); |
|||
H (SIGFPE); |
|||
H (SIGSEGV); |
|||
H (SIGBUS); |
|||
H (SIGTRAP); |
|||
H (SIGCHLD); |
|||
H (SIGPOLL); |
|||
} |
|||
|
|||
const char *str = NULL; |
|||
if (offarr != NULL |
|||
&& pinfo->si_code >= 1 && pinfo->si_code <= offarr_len) |
|||
str = base + offarr[pinfo->si_code - 1]; |
|||
else |
|||
switch (pinfo->si_code) |
|||
{ |
|||
case SI_USER: |
|||
str = N_("Signal sent by kill()"); |
|||
break; |
|||
case SI_QUEUE: |
|||
str = N_("Signal sent by sigqueue()"); |
|||
break; |
|||
case SI_TIMER: |
|||
str = N_("Signal generated by the expiration of a timer"); |
|||
break; |
|||
case SI_ASYNCIO: |
|||
str = N_("\
|
|||
Signal generated by the completion of an asynchronous I/O request"); |
|||
break; |
|||
case SI_MESGQ: |
|||
str = N_("\
|
|||
Signal generated by the arrival of a message on an empty message queue"); |
|||
break; |
|||
#ifdef SI_TKILL |
|||
case SI_TKILL: |
|||
str = N_("Signal sent by tkill()"); |
|||
break; |
|||
#endif |
|||
#ifdef SI_ASYNCNL |
|||
case SI_ASYNCNL: |
|||
str = N_("\
|
|||
Signal generated by the completion of an asynchronous name lookup request"); |
|||
break; |
|||
#endif |
|||
#ifdef SI_SIGIO |
|||
case SI_SIGIO: |
|||
str = N_("\
|
|||
Signal generated by the completion of an I/O request"); |
|||
break; |
|||
#endif |
|||
#ifdef SI_KERNEL |
|||
case SI_KERNEL: |
|||
str = N_("Signal sent by the kernel"); |
|||
break; |
|||
#endif |
|||
} |
|||
|
|||
if (str != NULL) |
|||
fprintf (fp, "%s ", _(str)); |
|||
else |
|||
fprintf (fp, "%d ", pinfo->si_code); |
|||
|
|||
if (pinfo->si_signo == SIGILL || pinfo->si_signo == SIGFPE |
|||
|| pinfo->si_signo == SIGSEGV || pinfo->si_signo == SIGBUS) |
|||
fprintf (fp, "[%p])", pinfo->si_addr); |
|||
else if (pinfo->si_signo == SIGCHLD) |
|||
fprintf (fp, "%ld %d %ld)", (long int) pinfo->si_pid, pinfo->si_status, |
|||
(long int) pinfo->si_uid); |
|||
else if (pinfo->si_signo == SIGPOLL) |
|||
fprintf (fp, "%ld)", pinfo->si_band); |
|||
else |
|||
fprintf (fp, "%ld %ld)", |
|||
(long int) pinfo->si_pid, (long int) pinfo->si_uid); |
|||
} |
|||
else |
|||
fprintf (fp, _("Unknown signal %d\n"), pinfo->si_signo); |
|||
|
|||
fclose (fp); |
|||
|
|||
write_not_cancel (STDERR_FILENO, buf, strlen (buf)); |
|||
} |
|||
Loading…
Reference in new issue