Blame sysdeps/unix/sysv/linux/sigaction.c

Packit 6c4009
/* Copyright (C) 1997-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#include <errno.h>
Packit 6c4009
#include <signal.h>
Packit 6c4009
#include <string.h>
Packit 6c4009
Packit 6c4009
#include <sysdep.h>
Packit 6c4009
#include <sys/syscall.h>
Packit 6c4009
Packit 6c4009
/* New ports should not define the obsolete SA_RESTORER, however some
Packit 6c4009
   architecture requires for compat mode and/or due old ABI.  */
Packit 6c4009
#include <kernel_sigaction.h>
Packit 6c4009
Packit 6c4009
#ifndef SA_RESTORER
Packit 6c4009
# define SET_SA_RESTORER(kact, act)
Packit 6c4009
# define RESET_SA_RESTORER(act, kact)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* SPARC passes the restore function as an argument to rt_sigaction.  */
Packit 6c4009
#ifndef STUB
Packit 6c4009
# define STUB(act)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* If ACT is not NULL, change the action for SIG to *ACT.
Packit 6c4009
   If OACT is not NULL, put the old action for SIG in *OACT.  */
Packit 6c4009
int
Packit 6c4009
__libc_sigaction (int sig, const struct sigaction *act, struct sigaction *oact)
Packit 6c4009
{
Packit 6c4009
  int result;
Packit 6c4009
Packit 6c4009
  struct kernel_sigaction kact, koact;
Packit 6c4009
Packit 6c4009
  if (act)
Packit 6c4009
    {
Packit 6c4009
      kact.k_sa_handler = act->sa_handler;
Packit 6c4009
      memcpy (&kact.sa_mask, &act->sa_mask, sizeof (sigset_t));
Packit 6c4009
      kact.sa_flags = act->sa_flags;
Packit 6c4009
      SET_SA_RESTORER (&kact, act);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  /* XXX The size argument hopefully will have to be changed to the
Packit 6c4009
     real size of the user-level sigset_t.  */
Packit 6c4009
  result = INLINE_SYSCALL_CALL (rt_sigaction, sig,
Packit 6c4009
				act ? &kact : NULL,
Packit 6c4009
				oact ? &koact : NULL, STUB(act) _NSIG / 8);
Packit 6c4009
Packit 6c4009
  if (oact && result >= 0)
Packit 6c4009
    {
Packit 6c4009
      oact->sa_handler = koact.k_sa_handler;
Packit 6c4009
      memcpy (&oact->sa_mask, &koact.sa_mask, sizeof (sigset_t));
Packit 6c4009
      oact->sa_flags = koact.sa_flags;
Packit 6c4009
      RESET_SA_RESTORER (oact, &koact);
Packit 6c4009
    }
Packit 6c4009
  return result;
Packit 6c4009
}
Packit 6c4009
libc_hidden_def (__libc_sigaction)
Packit 6c4009
Packit 6c4009
#include <nptl/sigaction.c>