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