da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1985-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Phong Vo <kpv@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * signal that disables syscall restart on interrupt with clear signal mask
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * fun==SIG_DFL also unblocks signal
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !_UWIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef signal
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define signal ______signal
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ast.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sig.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !_UWIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef signal
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef _def_map_ast
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ast_map.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(__EXPORT__)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define extern __EXPORT__
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(SV_ABORT)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef SV_INTERRUPT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SV_INTERRUPT SV_ABORT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !_std_signal && (_lib_sigaction && defined(SA_NOCLDSTOP) || _lib_sigvec && defined(SV_INTERRUPT))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !defined(SA_NOCLDSTOP) || !defined(SA_INTERRUPT) && defined(SV_INTERRUPT)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef SA_INTERRUPT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SA_INTERRUPT SV_INTERRUPT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef sigaction
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sigaction sigvec
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef sigemptyset
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sigemptyset(p) (*(p)=0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef sa_flags
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sa_flags sv_flags
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef sa_handler
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sa_handler sv_handler
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef sa_mask
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define sa_mask sv_mask
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern Sig_handler_t
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinsignal(int sig, Sig_handler_t fun)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct sigaction na;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct sigaction oa;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin int unblock;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef SIGNO_MASK
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned int flags;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (sig < 0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sig = -sig;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unblock = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unblock = fun == SIG_DFL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef SIGNO_MASK
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags = sig & ~SIGNO_MASK;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sig &= SIGNO_MASK;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memzero(&na, sizeof(na));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin na.sa_handler = fun;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(SA_INTERRUPT) || defined(SA_RESTART)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (sig)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(SIGIO) || defined(SIGTSTP) || defined(SIGTTIN) || defined(SIGTTOU)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(SIGIO)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case SIGIO:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(SIGTSTP)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case SIGTSTP:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(SIGTTIN)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case SIGTTIN:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(SIGTTOU)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case SIGTTOU:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(SA_RESTART)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin na.sa_flags = SA_RESTART;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(SA_INTERRUPT)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin na.sa_flags = SA_INTERRUPT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (sigaction(sig, &na, &oa))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (unblock)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sigunblock(sig);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return oa.sa_handler;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinNoN(signal)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif