(root)/
glibc-2.38/
sysdeps/
posix/
sysv_signal.c
       1  /* Copyright (C) 1991-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <errno.h>
      19  #include <signal.h>
      20  #include <string.h>	/* For the real memset prototype.  */
      21  #include <sigsetops.h>
      22  
      23  /* Tolerate non-threads versions of Posix */
      24  #ifndef SA_ONESHOT
      25  #define SA_ONESHOT 0
      26  #endif
      27  #ifndef SA_NOMASK
      28  #define SA_NOMASK 0
      29  #endif
      30  #ifndef SA_INTERRUPT
      31  #define SA_INTERRUPT 0
      32  #endif
      33  
      34  /* Set the handler for the signal SIG to HANDLER,
      35     returning the old handler, or SIG_ERR on error.  */
      36  __sighandler_t
      37  __sysv_signal (int sig, __sighandler_t handler)
      38  {
      39    struct sigaction act, oact;
      40  
      41    /* Check signal extents to protect __sigismember.  */
      42    if (handler == SIG_ERR || sig < 1 || sig >= NSIG)
      43      {
      44        __set_errno (EINVAL);
      45        return SIG_ERR;
      46      }
      47  
      48    act.sa_handler = handler;
      49    __sigemptyset (&act.sa_mask);
      50    act.sa_flags = SA_ONESHOT | SA_NOMASK | SA_INTERRUPT;
      51    act.sa_flags &= ~SA_RESTART;
      52    if (__sigaction (sig, &act, &oact) < 0)
      53      return SIG_ERR;
      54  
      55    return oact.sa_handler;
      56  }
      57  
      58  weak_alias (__sysv_signal, sysv_signal)