1*47dd1d1bSDag-Erling Smørgrav /* 2*47dd1d1bSDag-Erling Smørgrav * Copyright (c) 1999-2004 Damien Miller <djm@mindrot.org> 3*47dd1d1bSDag-Erling Smørgrav * 4*47dd1d1bSDag-Erling Smørgrav * Permission to use, copy, modify, and distribute this software for any 5*47dd1d1bSDag-Erling Smørgrav * purpose with or without fee is hereby granted, provided that the above 6*47dd1d1bSDag-Erling Smørgrav * copyright notice and this permission notice appear in all copies. 7*47dd1d1bSDag-Erling Smørgrav * 8*47dd1d1bSDag-Erling Smørgrav * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9*47dd1d1bSDag-Erling Smørgrav * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10*47dd1d1bSDag-Erling Smørgrav * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11*47dd1d1bSDag-Erling Smørgrav * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12*47dd1d1bSDag-Erling Smørgrav * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13*47dd1d1bSDag-Erling Smørgrav * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14*47dd1d1bSDag-Erling Smørgrav * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15*47dd1d1bSDag-Erling Smørgrav */ 16*47dd1d1bSDag-Erling Smørgrav 17*47dd1d1bSDag-Erling Smørgrav #include "includes.h" 18*47dd1d1bSDag-Erling Smørgrav 19*47dd1d1bSDag-Erling Smørgrav #include <signal.h> 20*47dd1d1bSDag-Erling Smørgrav #include <string.h> 21*47dd1d1bSDag-Erling Smørgrav #include <unistd.h> 22*47dd1d1bSDag-Erling Smørgrav 23*47dd1d1bSDag-Erling Smørgrav #include "openbsd-compat/bsd-signal.h" 24*47dd1d1bSDag-Erling Smørgrav 25*47dd1d1bSDag-Erling Smørgrav #undef signal 26*47dd1d1bSDag-Erling Smørgrav 27*47dd1d1bSDag-Erling Smørgrav mysig_t 28*47dd1d1bSDag-Erling Smørgrav mysignal(int sig, mysig_t act) 29*47dd1d1bSDag-Erling Smørgrav { 30*47dd1d1bSDag-Erling Smørgrav #ifdef HAVE_SIGACTION 31*47dd1d1bSDag-Erling Smørgrav struct sigaction sa, osa; 32*47dd1d1bSDag-Erling Smørgrav 33*47dd1d1bSDag-Erling Smørgrav if (sigaction(sig, NULL, &osa) == -1) 34*47dd1d1bSDag-Erling Smørgrav return (mysig_t) -1; 35*47dd1d1bSDag-Erling Smørgrav if (osa.sa_handler != act) { 36*47dd1d1bSDag-Erling Smørgrav memset(&sa, 0, sizeof(sa)); 37*47dd1d1bSDag-Erling Smørgrav sigemptyset(&sa.sa_mask); 38*47dd1d1bSDag-Erling Smørgrav sa.sa_flags = 0; 39*47dd1d1bSDag-Erling Smørgrav #ifdef SA_INTERRUPT 40*47dd1d1bSDag-Erling Smørgrav if (sig == SIGALRM) 41*47dd1d1bSDag-Erling Smørgrav sa.sa_flags |= SA_INTERRUPT; 42*47dd1d1bSDag-Erling Smørgrav #endif 43*47dd1d1bSDag-Erling Smørgrav sa.sa_handler = act; 44*47dd1d1bSDag-Erling Smørgrav if (sigaction(sig, &sa, NULL) == -1) 45*47dd1d1bSDag-Erling Smørgrav return (mysig_t) -1; 46*47dd1d1bSDag-Erling Smørgrav } 47*47dd1d1bSDag-Erling Smørgrav return (osa.sa_handler); 48*47dd1d1bSDag-Erling Smørgrav #else 49*47dd1d1bSDag-Erling Smørgrav return (signal(sig, act)); 50*47dd1d1bSDag-Erling Smørgrav #endif 51*47dd1d1bSDag-Erling Smørgrav } 52*47dd1d1bSDag-Erling Smørgrav 53*47dd1d1bSDag-Erling Smørgrav #if !defined(HAVE_STRSIGNAL) 54*47dd1d1bSDag-Erling Smørgrav char *strsignal(int sig) 55*47dd1d1bSDag-Erling Smørgrav { 56*47dd1d1bSDag-Erling Smørgrav static char buf[16]; 57*47dd1d1bSDag-Erling Smørgrav 58*47dd1d1bSDag-Erling Smørgrav (void)snprintf(buf, sizeof(buf), "%d", sig); 59*47dd1d1bSDag-Erling Smørgrav return buf; 60*47dd1d1bSDag-Erling Smørgrav } 61*47dd1d1bSDag-Erling Smørgrav #endif 62*47dd1d1bSDag-Erling Smørgrav 63