Blame signame.c

Packit Service 62bb50
/* Convert between signal names and numbers.
Packit Service 62bb50
Copyright (C) 1990-2016 Free Software Foundation, Inc.
Packit Service 62bb50
This file is part of GNU Make.
Packit Service 62bb50
Packit Service 62bb50
GNU Make is free software; you can redistribute it and/or modify it under the
Packit Service 62bb50
terms of the GNU General Public License as published by the Free Software
Packit Service 62bb50
Foundation; either version 3 of the License, or (at your option) any later
Packit Service 62bb50
version.
Packit Service 62bb50
Packit Service 62bb50
GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
Packit Service 62bb50
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
Packit Service 62bb50
A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
Packit Service 62bb50
Packit Service 62bb50
You should have received a copy of the GNU General Public License along with
Packit Service 62bb50
this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit Service 62bb50
Packit Service 62bb50
#include "makeint.h"
Packit Service 62bb50
Packit Service 62bb50
/* If the system provides strsignal, we don't need it. */
Packit Service 62bb50
Packit Service 62bb50
#if !HAVE_STRSIGNAL
Packit Service 62bb50
Packit Service 62bb50
/* If the system provides sys_siglist, we'll use that.
Packit Service 62bb50
   Otherwise create our own.
Packit Service 62bb50
 */
Packit Service 62bb50
Packit Service 62bb50
#if !HAVE_DECL_SYS_SIGLIST
Packit Service 62bb50
Packit Service 62bb50
/* Some systems do not define NSIG in <signal.h>.  */
Packit Service 62bb50
#ifndef NSIG
Packit Service 62bb50
#ifdef  _NSIG
Packit Service 62bb50
#define NSIG    _NSIG
Packit Service 62bb50
#else
Packit Service 62bb50
#define NSIG    32
Packit Service 62bb50
#endif
Packit Service 62bb50
#endif
Packit Service 62bb50
Packit Service 62bb50
/* There is too much variation in Sys V signal numbers and names, so
Packit Service 62bb50
   we must initialize them at runtime.  */
Packit Service 62bb50
Packit Service 62bb50
static const char *undoc;
Packit Service 62bb50
Packit Service 62bb50
static const char *sys_siglist[NSIG];
Packit Service 62bb50
Packit Service 62bb50
/* Table of abbreviations for signals.  Note:  A given number can
Packit Service 62bb50
   appear more than once with different abbreviations.  */
Packit Service 62bb50
#define SIG_TABLE_SIZE  (NSIG*2)
Packit Service 62bb50
Packit Service 62bb50
typedef struct
Packit Service 62bb50
  {
Packit Service 62bb50
    int number;
Packit Service 62bb50
    const char *abbrev;
Packit Service 62bb50
  } num_abbrev;
Packit Service 62bb50
Packit Service 62bb50
static num_abbrev sig_table[SIG_TABLE_SIZE];
Packit Service 62bb50
Packit Service 62bb50
/* Number of elements of sig_table used.  */
Packit Service 62bb50
static int sig_table_nelts = 0;
Packit Service 62bb50
Packit Service 62bb50
/* Enter signal number NUMBER into the tables with ABBREV and NAME.  */
Packit Service 62bb50
Packit Service 62bb50
static void
Packit Service 62bb50
init_sig (int number, const char *abbrev, const char *name)
Packit Service 62bb50
{
Packit Service 62bb50
  /* If this value is ever greater than NSIG it seems like it'd be a bug in
Packit Service 62bb50
     the system headers, but... better safe than sorry.  We know, for
Packit Service 62bb50
     example, that this isn't always true on VMS.  */
Packit Service 62bb50
Packit Service 62bb50
  if (number >= 0 && number < NSIG)
Packit Service 62bb50
    sys_siglist[number] = name;
Packit Service 62bb50
Packit Service 62bb50
  if (sig_table_nelts < SIG_TABLE_SIZE)
Packit Service 62bb50
    {
Packit Service 62bb50
      sig_table[sig_table_nelts].number = number;
Packit Service 62bb50
      sig_table[sig_table_nelts++].abbrev = abbrev;
Packit Service 62bb50
    }
Packit Service 62bb50
}
Packit Service 62bb50
Packit Service 62bb50
static int
Packit Service 62bb50
signame_init (void)
Packit Service 62bb50
{
Packit Service 62bb50
  int i;
Packit Service 62bb50
Packit Service 62bb50
  undoc = xstrdup (_("unknown signal"));
Packit Service 62bb50
Packit Service 62bb50
  /* Initialize signal names.  */
Packit Service 62bb50
  for (i = 0; i < NSIG; i++)
Packit Service 62bb50
    sys_siglist[i] = undoc;
Packit Service 62bb50
Packit Service 62bb50
  /* Initialize signal names.  */
Packit Service 62bb50
#if defined (SIGHUP)
Packit Service 62bb50
  init_sig (SIGHUP, "HUP", _("Hangup"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGINT)
Packit Service 62bb50
  init_sig (SIGINT, "INT", _("Interrupt"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGQUIT)
Packit Service 62bb50
  init_sig (SIGQUIT, "QUIT", _("Quit"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGILL)
Packit Service 62bb50
  init_sig (SIGILL, "ILL", _("Illegal Instruction"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGTRAP)
Packit Service 62bb50
  init_sig (SIGTRAP, "TRAP", _("Trace/breakpoint trap"));
Packit Service 62bb50
#endif
Packit Service 62bb50
  /* If SIGIOT == SIGABRT, we want to print it as SIGABRT because
Packit Service 62bb50
     SIGABRT is in ANSI and POSIX.1 and SIGIOT isn't.  */
Packit Service 62bb50
#if defined (SIGABRT)
Packit Service 62bb50
  init_sig (SIGABRT, "ABRT", _("Aborted"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGIOT)
Packit Service 62bb50
  init_sig (SIGIOT, "IOT", _("IOT trap"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGEMT)
Packit Service 62bb50
  init_sig (SIGEMT, "EMT", _("EMT trap"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGFPE)
Packit Service 62bb50
  init_sig (SIGFPE, "FPE", _("Floating point exception"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGKILL)
Packit Service 62bb50
  init_sig (SIGKILL, "KILL", _("Killed"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGBUS)
Packit Service 62bb50
  init_sig (SIGBUS, "BUS", _("Bus error"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGSEGV)
Packit Service 62bb50
  init_sig (SIGSEGV, "SEGV", _("Segmentation fault"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGSYS)
Packit Service 62bb50
  init_sig (SIGSYS, "SYS", _("Bad system call"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGPIPE)
Packit Service 62bb50
  init_sig (SIGPIPE, "PIPE", _("Broken pipe"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGALRM)
Packit Service 62bb50
  init_sig (SIGALRM, "ALRM", _("Alarm clock"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGTERM)
Packit Service 62bb50
  init_sig (SIGTERM, "TERM", _("Terminated"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGUSR1)
Packit Service 62bb50
  init_sig (SIGUSR1, "USR1", _("User defined signal 1"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGUSR2)
Packit Service 62bb50
  init_sig (SIGUSR2, "USR2", _("User defined signal 2"));
Packit Service 62bb50
#endif
Packit Service 62bb50
  /* If SIGCLD == SIGCHLD, we want to print it as SIGCHLD because that
Packit Service 62bb50
     is what is in POSIX.1.  */
Packit Service 62bb50
#if defined (SIGCHLD)
Packit Service 62bb50
  init_sig (SIGCHLD, "CHLD", _("Child exited"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGCLD)
Packit Service 62bb50
  init_sig (SIGCLD, "CLD", _("Child exited"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGPWR)
Packit Service 62bb50
  init_sig (SIGPWR, "PWR", _("Power failure"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGTSTP)
Packit Service 62bb50
  init_sig (SIGTSTP, "TSTP", _("Stopped"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGTTIN)
Packit Service 62bb50
  init_sig (SIGTTIN, "TTIN", _("Stopped (tty input)"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGTTOU)
Packit Service 62bb50
  init_sig (SIGTTOU, "TTOU", _("Stopped (tty output)"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGSTOP)
Packit Service 62bb50
  init_sig (SIGSTOP, "STOP", _("Stopped (signal)"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGXCPU)
Packit Service 62bb50
  init_sig (SIGXCPU, "XCPU", _("CPU time limit exceeded"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGXFSZ)
Packit Service 62bb50
  init_sig (SIGXFSZ, "XFSZ", _("File size limit exceeded"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGVTALRM)
Packit Service 62bb50
  init_sig (SIGVTALRM, "VTALRM", _("Virtual timer expired"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGPROF)
Packit Service 62bb50
  init_sig (SIGPROF, "PROF", _("Profiling timer expired"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGWINCH)
Packit Service 62bb50
  /* "Window size changed" might be more accurate, but even if that
Packit Service 62bb50
     is all that it means now, perhaps in the future it will be
Packit Service 62bb50
     extended to cover other kinds of window changes.  */
Packit Service 62bb50
  init_sig (SIGWINCH, "WINCH", _("Window changed"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGCONT)
Packit Service 62bb50
  init_sig (SIGCONT, "CONT", _("Continued"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGURG)
Packit Service 62bb50
  init_sig (SIGURG, "URG", _("Urgent I/O condition"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGIO)
Packit Service 62bb50
  /* "I/O pending" has also been suggested.  A disadvantage is that signal
Packit Service 62bb50
     only happens when the process has asked for it, not every time I/O is
Packit Service 62bb50
     pending.  Another disadvantage is the confusion from giving it a
Packit Service 62bb50
     different name than under Unix.  */
Packit Service 62bb50
  init_sig (SIGIO, "IO", _("I/O possible"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGWIND)
Packit Service 62bb50
  init_sig (SIGWIND, "WIND", _("SIGWIND"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGPHONE)
Packit Service 62bb50
  init_sig (SIGPHONE, "PHONE", _("SIGPHONE"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGPOLL)
Packit Service 62bb50
  init_sig (SIGPOLL, "POLL", _("I/O possible"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGLOST)
Packit Service 62bb50
  init_sig (SIGLOST, "LOST", _("Resource lost"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGDANGER)
Packit Service 62bb50
  init_sig (SIGDANGER, "DANGER", _("Danger signal"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGINFO)
Packit Service 62bb50
  init_sig (SIGINFO, "INFO", _("Information request"));
Packit Service 62bb50
#endif
Packit Service 62bb50
#if defined (SIGNOFP)
Packit Service 62bb50
  init_sig (SIGNOFP, "NOFP", _("Floating point co-processor not available"));
Packit Service 62bb50
#endif
Packit Service 62bb50
Packit Service 62bb50
  return 1;
Packit Service 62bb50
}
Packit Service 62bb50
Packit Service 62bb50
#endif  /* HAVE_DECL_SYS_SIGLIST */
Packit Service 62bb50
Packit Service 62bb50
Packit Service 62bb50
char *
Packit Service 62bb50
strsignal (int sig)
Packit Service 62bb50
{
Packit Service 62bb50
  static char buf[] = "Signal 12345678901234567890";
Packit Service 62bb50
Packit Service 62bb50
#if ! HAVE_DECL_SYS_SIGLIST
Packit Service 62bb50
# if HAVE_DECL__SYS_SIGLIST
Packit Service 62bb50
#  define sys_siglist _sys_siglist
Packit Service 62bb50
# elif HAVE_DECL___SYS_SIGLIST
Packit Service 62bb50
#  define sys_siglist __sys_siglist
Packit Service 62bb50
# else
Packit Service 62bb50
  static char sig_initted = 0;
Packit Service 62bb50
Packit Service 62bb50
  if (!sig_initted)
Packit Service 62bb50
    sig_initted = signame_init ();
Packit Service 62bb50
# endif
Packit Service 62bb50
#endif
Packit Service 62bb50
Packit Service 62bb50
  if (sig > 0 && sig < NSIG)
Packit Service 62bb50
    return (char *) sys_siglist[sig];
Packit Service 62bb50
Packit Service 62bb50
  sprintf (buf, "Signal %d", sig);
Packit Service 62bb50
  return buf;
Packit Service 62bb50
}
Packit Service 62bb50
Packit Service 62bb50
#endif  /* HAVE_STRSIGNAL */