| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 | /* * Copyright (C) 2004-2007 Atmel Corporation * * This file is subject to the terms and conditions of the GNU Lesser General * Public License.  See the file "COPYING.LIB" in the main directory of this * archive for more details. */#include <errno.h>#include <signal.h>#include <string.h>#include <sys/syscall.h>#include <bits/kernel_sigaction.h>#define SA_RESTORER    0x04000000extern void __default_rt_sa_restorer(void);libc_hidden_proto(memcpy)/* * If act is not NULL, change the action for sig to *act. * If oact is not NULL, put the old action for sig in *oact. */int __libc_sigaction(int signum, const struct sigaction *act,                    struct sigaction *oldact){       struct kernel_sigaction kact, koact;       int result;       if (act) {               kact.k_sa_handler = act->sa_handler;               memcpy(&kact.sa_mask, &act->sa_mask, sizeof (kact.sa_mask));               kact.sa_flags = act->sa_flags;               if (kact.sa_flags & SA_RESTORER)                       kact.sa_restorer = act->sa_restorer;               else                       kact.sa_restorer = __default_rt_sa_restorer;               kact.sa_flags |= SA_RESTORER;       }       result = __syscall_rt_sigaction(signum, act ? __ptrvalue(&kact) : NULL,                                       oldact ? __ptrvalue(&koact) : NULL,                                       _NSIG / 8);       if (oldact && result >= 0) {               oldact->sa_handler = koact.k_sa_handler;               memcpy(&oldact->sa_mask, &koact.sa_mask,                      sizeof(oldact->sa_mask));               oldact->sa_flags = koact.sa_flags;               oldact->sa_restorer = koact.sa_restorer;       }       return result;}#ifndef LIBC_SIGACTIONlibc_hidden_proto(sigaction)weak_alias(__libc_sigaction, sigaction)libc_hidden_weak(sigaction)#endif
 |