1*b30d1939SAndy Fiddaman /*********************************************************************** 2*b30d1939SAndy Fiddaman * * 3*b30d1939SAndy Fiddaman * This software is part of the ast package * 4*b30d1939SAndy Fiddaman * Copyright (c) 1985-2011 AT&T Intellectual Property * 5*b30d1939SAndy Fiddaman * and is licensed under the * 6*b30d1939SAndy Fiddaman * Eclipse Public License, Version 1.0 * 7*b30d1939SAndy Fiddaman * by AT&T Intellectual Property * 8*b30d1939SAndy Fiddaman * * 9*b30d1939SAndy Fiddaman * A copy of the License is available at * 10*b30d1939SAndy Fiddaman * http://www.eclipse.org/org/documents/epl-v10.html * 11*b30d1939SAndy Fiddaman * (with md5 checksum b35adb5213ca9657e911e9befb180842) * 12*b30d1939SAndy Fiddaman * * 13*b30d1939SAndy Fiddaman * Information and Software Systems Research * 14*b30d1939SAndy Fiddaman * AT&T Research * 15*b30d1939SAndy Fiddaman * Florham Park NJ * 16*b30d1939SAndy Fiddaman * * 17*b30d1939SAndy Fiddaman * Glenn Fowler <gsf@research.att.com> * 18*b30d1939SAndy Fiddaman * David Korn <dgk@research.att.com> * 19*b30d1939SAndy Fiddaman * Phong Vo <kpv@research.att.com> * 20*b30d1939SAndy Fiddaman * * 21*b30d1939SAndy Fiddaman ***********************************************************************/ 22*b30d1939SAndy Fiddaman #pragma prototyped 23*b30d1939SAndy Fiddaman 24*b30d1939SAndy Fiddaman /* 25*b30d1939SAndy Fiddaman * signal that disables syscall restart on interrupt with clear signal mask 26*b30d1939SAndy Fiddaman * fun==SIG_DFL also unblocks signal 27*b30d1939SAndy Fiddaman */ 28*b30d1939SAndy Fiddaman 29*b30d1939SAndy Fiddaman #if !_UWIN 30*b30d1939SAndy Fiddaman 31*b30d1939SAndy Fiddaman #undef signal 32*b30d1939SAndy Fiddaman #define signal ______signal 33*b30d1939SAndy Fiddaman 34*b30d1939SAndy Fiddaman #endif 35*b30d1939SAndy Fiddaman 36*b30d1939SAndy Fiddaman #include <ast.h> 37*b30d1939SAndy Fiddaman #include <sig.h> 38*b30d1939SAndy Fiddaman 39*b30d1939SAndy Fiddaman #if !_UWIN 40*b30d1939SAndy Fiddaman 41*b30d1939SAndy Fiddaman #undef signal 42*b30d1939SAndy Fiddaman 43*b30d1939SAndy Fiddaman #undef _def_map_ast 44*b30d1939SAndy Fiddaman #include <ast_map.h> 45*b30d1939SAndy Fiddaman 46*b30d1939SAndy Fiddaman #if defined(__EXPORT__) 47*b30d1939SAndy Fiddaman #define extern __EXPORT__ 48*b30d1939SAndy Fiddaman #endif 49*b30d1939SAndy Fiddaman 50*b30d1939SAndy Fiddaman #endif 51*b30d1939SAndy Fiddaman 52*b30d1939SAndy Fiddaman #if defined(SV_ABORT) 53*b30d1939SAndy Fiddaman #undef SV_INTERRUPT 54*b30d1939SAndy Fiddaman #define SV_INTERRUPT SV_ABORT 55*b30d1939SAndy Fiddaman #endif 56*b30d1939SAndy Fiddaman 57*b30d1939SAndy Fiddaman #if !_std_signal && (_lib_sigaction && defined(SA_NOCLDSTOP) || _lib_sigvec && defined(SV_INTERRUPT)) 58*b30d1939SAndy Fiddaman 59*b30d1939SAndy Fiddaman #if !defined(SA_NOCLDSTOP) || !defined(SA_INTERRUPT) && defined(SV_INTERRUPT) 60*b30d1939SAndy Fiddaman #undef SA_INTERRUPT 61*b30d1939SAndy Fiddaman #define SA_INTERRUPT SV_INTERRUPT 62*b30d1939SAndy Fiddaman #undef sigaction 63*b30d1939SAndy Fiddaman #define sigaction sigvec 64*b30d1939SAndy Fiddaman #undef sigemptyset 65*b30d1939SAndy Fiddaman #define sigemptyset(p) (*(p)=0) 66*b30d1939SAndy Fiddaman #undef sa_flags 67*b30d1939SAndy Fiddaman #define sa_flags sv_flags 68*b30d1939SAndy Fiddaman #undef sa_handler 69*b30d1939SAndy Fiddaman #define sa_handler sv_handler 70*b30d1939SAndy Fiddaman #undef sa_mask 71*b30d1939SAndy Fiddaman #define sa_mask sv_mask 72*b30d1939SAndy Fiddaman #endif 73*b30d1939SAndy Fiddaman 74*b30d1939SAndy Fiddaman extern Sig_handler_t signal(int sig,Sig_handler_t fun)75*b30d1939SAndy Fiddamansignal(int sig, Sig_handler_t fun) 76*b30d1939SAndy Fiddaman { 77*b30d1939SAndy Fiddaman struct sigaction na; 78*b30d1939SAndy Fiddaman struct sigaction oa; 79*b30d1939SAndy Fiddaman int unblock; 80*b30d1939SAndy Fiddaman #ifdef SIGNO_MASK 81*b30d1939SAndy Fiddaman unsigned int flags; 82*b30d1939SAndy Fiddaman #endif 83*b30d1939SAndy Fiddaman 84*b30d1939SAndy Fiddaman if (sig < 0) 85*b30d1939SAndy Fiddaman { 86*b30d1939SAndy Fiddaman sig = -sig; 87*b30d1939SAndy Fiddaman unblock = 0; 88*b30d1939SAndy Fiddaman } 89*b30d1939SAndy Fiddaman else 90*b30d1939SAndy Fiddaman unblock = fun == SIG_DFL; 91*b30d1939SAndy Fiddaman #ifdef SIGNO_MASK 92*b30d1939SAndy Fiddaman flags = sig & ~SIGNO_MASK; 93*b30d1939SAndy Fiddaman sig &= SIGNO_MASK; 94*b30d1939SAndy Fiddaman #endif 95*b30d1939SAndy Fiddaman memzero(&na, sizeof(na)); 96*b30d1939SAndy Fiddaman na.sa_handler = fun; 97*b30d1939SAndy Fiddaman #if defined(SA_INTERRUPT) || defined(SA_RESTART) 98*b30d1939SAndy Fiddaman switch (sig) 99*b30d1939SAndy Fiddaman { 100*b30d1939SAndy Fiddaman #if defined(SIGIO) || defined(SIGTSTP) || defined(SIGTTIN) || defined(SIGTTOU) 101*b30d1939SAndy Fiddaman #if defined(SIGIO) 102*b30d1939SAndy Fiddaman case SIGIO: 103*b30d1939SAndy Fiddaman #endif 104*b30d1939SAndy Fiddaman #if defined(SIGTSTP) 105*b30d1939SAndy Fiddaman case SIGTSTP: 106*b30d1939SAndy Fiddaman #endif 107*b30d1939SAndy Fiddaman #if defined(SIGTTIN) 108*b30d1939SAndy Fiddaman case SIGTTIN: 109*b30d1939SAndy Fiddaman #endif 110*b30d1939SAndy Fiddaman #if defined(SIGTTOU) 111*b30d1939SAndy Fiddaman case SIGTTOU: 112*b30d1939SAndy Fiddaman #endif 113*b30d1939SAndy Fiddaman #if defined(SA_RESTART) 114*b30d1939SAndy Fiddaman na.sa_flags = SA_RESTART; 115*b30d1939SAndy Fiddaman #endif 116*b30d1939SAndy Fiddaman break; 117*b30d1939SAndy Fiddaman #endif 118*b30d1939SAndy Fiddaman default: 119*b30d1939SAndy Fiddaman #if defined(SA_INTERRUPT) 120*b30d1939SAndy Fiddaman na.sa_flags = SA_INTERRUPT; 121*b30d1939SAndy Fiddaman #endif 122*b30d1939SAndy Fiddaman break; 123*b30d1939SAndy Fiddaman } 124*b30d1939SAndy Fiddaman #endif 125*b30d1939SAndy Fiddaman if (sigaction(sig, &na, &oa)) 126*b30d1939SAndy Fiddaman return 0; 127*b30d1939SAndy Fiddaman if (unblock) 128*b30d1939SAndy Fiddaman sigunblock(sig); 129*b30d1939SAndy Fiddaman return oa.sa_handler; 130*b30d1939SAndy Fiddaman } 131*b30d1939SAndy Fiddaman 132*b30d1939SAndy Fiddaman #else 133*b30d1939SAndy Fiddaman 134*b30d1939SAndy Fiddaman NoN(signal) 135*b30d1939SAndy Fiddaman 136*b30d1939SAndy Fiddaman #endif 137