1*7c478bd9Sstevel@tonic-gate /* 2*7c478bd9Sstevel@tonic-gate * Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers. 3*7c478bd9Sstevel@tonic-gate * All rights reserved. 4*7c478bd9Sstevel@tonic-gate * 5*7c478bd9Sstevel@tonic-gate * By using this file, you agree to the terms and conditions set 6*7c478bd9Sstevel@tonic-gate * forth in the LICENSE file which can be found at the top level of 7*7c478bd9Sstevel@tonic-gate * the sendmail distribution. 8*7c478bd9Sstevel@tonic-gate */ 9*7c478bd9Sstevel@tonic-gate 10*7c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 11*7c478bd9Sstevel@tonic-gate 12*7c478bd9Sstevel@tonic-gate #include <sm/gen.h> 13*7c478bd9Sstevel@tonic-gate SM_RCSID("@(#)$Id: signal.c,v 1.13 2001/08/14 16:05:47 ca Exp $") 14*7c478bd9Sstevel@tonic-gate 15*7c478bd9Sstevel@tonic-gate #if SM_CONF_SETITIMER 16*7c478bd9Sstevel@tonic-gate # include <sys/time.h> 17*7c478bd9Sstevel@tonic-gate #endif /* SM_CONF_SETITIMER */ 18*7c478bd9Sstevel@tonic-gate #include <errno.h> 19*7c478bd9Sstevel@tonic-gate #include <stdlib.h> 20*7c478bd9Sstevel@tonic-gate #include <time.h> 21*7c478bd9Sstevel@tonic-gate #include <unistd.h> 22*7c478bd9Sstevel@tonic-gate #include <sm/clock.h> 23*7c478bd9Sstevel@tonic-gate #include <sm/signal.h> 24*7c478bd9Sstevel@tonic-gate #include <signal.h> 25*7c478bd9Sstevel@tonic-gate #include <sm/string.h> 26*7c478bd9Sstevel@tonic-gate 27*7c478bd9Sstevel@tonic-gate unsigned int volatile InCriticalSection; /* >0 if inside critical section */ 28*7c478bd9Sstevel@tonic-gate int volatile PendingSignal; /* pending signal to resend */ 29*7c478bd9Sstevel@tonic-gate 30*7c478bd9Sstevel@tonic-gate /* 31*7c478bd9Sstevel@tonic-gate ** SM_SIGNAL -- set a signal handler 32*7c478bd9Sstevel@tonic-gate ** 33*7c478bd9Sstevel@tonic-gate ** This is essentially old BSD "signal(3)". 34*7c478bd9Sstevel@tonic-gate ** 35*7c478bd9Sstevel@tonic-gate ** NOTE: THIS CAN BE CALLED FROM A SIGNAL HANDLER. DO NOT ADD 36*7c478bd9Sstevel@tonic-gate ** ANYTHING TO THIS ROUTINE UNLESS YOU KNOW WHAT YOU ARE 37*7c478bd9Sstevel@tonic-gate ** DOING. 38*7c478bd9Sstevel@tonic-gate */ 39*7c478bd9Sstevel@tonic-gate 40*7c478bd9Sstevel@tonic-gate sigfunc_t 41*7c478bd9Sstevel@tonic-gate sm_signal(sig, handler) 42*7c478bd9Sstevel@tonic-gate int sig; 43*7c478bd9Sstevel@tonic-gate sigfunc_t handler; 44*7c478bd9Sstevel@tonic-gate { 45*7c478bd9Sstevel@tonic-gate # if defined(SA_RESTART) || (!defined(SYS5SIGNALS) && !defined(BSD4_3)) 46*7c478bd9Sstevel@tonic-gate struct sigaction n, o; 47*7c478bd9Sstevel@tonic-gate # endif /* defined(SA_RESTART) || (!defined(SYS5SIGNALS) && !defined(BSD4_3)) */ 48*7c478bd9Sstevel@tonic-gate 49*7c478bd9Sstevel@tonic-gate /* 50*7c478bd9Sstevel@tonic-gate ** First, try for modern signal calls 51*7c478bd9Sstevel@tonic-gate ** and restartable syscalls 52*7c478bd9Sstevel@tonic-gate */ 53*7c478bd9Sstevel@tonic-gate 54*7c478bd9Sstevel@tonic-gate # ifdef SA_RESTART 55*7c478bd9Sstevel@tonic-gate (void) memset(&n, '\0', sizeof n); 56*7c478bd9Sstevel@tonic-gate # if USE_SA_SIGACTION 57*7c478bd9Sstevel@tonic-gate n.sa_sigaction = (void(*)(int, siginfo_t *, void *)) handler; 58*7c478bd9Sstevel@tonic-gate n.sa_flags = SA_RESTART|SA_SIGINFO; 59*7c478bd9Sstevel@tonic-gate # else /* USE_SA_SIGACTION */ 60*7c478bd9Sstevel@tonic-gate n.sa_handler = handler; 61*7c478bd9Sstevel@tonic-gate n.sa_flags = SA_RESTART; 62*7c478bd9Sstevel@tonic-gate # endif /* USE_SA_SIGACTION */ 63*7c478bd9Sstevel@tonic-gate if (sigaction(sig, &n, &o) < 0) 64*7c478bd9Sstevel@tonic-gate return SIG_ERR; 65*7c478bd9Sstevel@tonic-gate return o.sa_handler; 66*7c478bd9Sstevel@tonic-gate # else /* SA_RESTART */ 67*7c478bd9Sstevel@tonic-gate 68*7c478bd9Sstevel@tonic-gate /* 69*7c478bd9Sstevel@tonic-gate ** Else check for SYS5SIGNALS or 70*7c478bd9Sstevel@tonic-gate ** BSD4_3 signals 71*7c478bd9Sstevel@tonic-gate */ 72*7c478bd9Sstevel@tonic-gate 73*7c478bd9Sstevel@tonic-gate # if defined(SYS5SIGNALS) || defined(BSD4_3) 74*7c478bd9Sstevel@tonic-gate # ifdef BSD4_3 75*7c478bd9Sstevel@tonic-gate return signal(sig, handler); 76*7c478bd9Sstevel@tonic-gate # else /* BSD4_3 */ 77*7c478bd9Sstevel@tonic-gate return sigset(sig, handler); 78*7c478bd9Sstevel@tonic-gate # endif /* BSD4_3 */ 79*7c478bd9Sstevel@tonic-gate # else /* defined(SYS5SIGNALS) || defined(BSD4_3) */ 80*7c478bd9Sstevel@tonic-gate 81*7c478bd9Sstevel@tonic-gate /* 82*7c478bd9Sstevel@tonic-gate ** Finally, if nothing else is available, 83*7c478bd9Sstevel@tonic-gate ** go for a default 84*7c478bd9Sstevel@tonic-gate */ 85*7c478bd9Sstevel@tonic-gate 86*7c478bd9Sstevel@tonic-gate (void) memset(&n, '\0', sizeof n); 87*7c478bd9Sstevel@tonic-gate n.sa_handler = handler; 88*7c478bd9Sstevel@tonic-gate if (sigaction(sig, &n, &o) < 0) 89*7c478bd9Sstevel@tonic-gate return SIG_ERR; 90*7c478bd9Sstevel@tonic-gate return o.sa_handler; 91*7c478bd9Sstevel@tonic-gate # endif /* defined(SYS5SIGNALS) || defined(BSD4_3) */ 92*7c478bd9Sstevel@tonic-gate # endif /* SA_RESTART */ 93*7c478bd9Sstevel@tonic-gate } 94*7c478bd9Sstevel@tonic-gate /* 95*7c478bd9Sstevel@tonic-gate ** SM_BLOCKSIGNAL -- hold a signal to prevent delivery 96*7c478bd9Sstevel@tonic-gate ** 97*7c478bd9Sstevel@tonic-gate ** Parameters: 98*7c478bd9Sstevel@tonic-gate ** sig -- the signal to block. 99*7c478bd9Sstevel@tonic-gate ** 100*7c478bd9Sstevel@tonic-gate ** Returns: 101*7c478bd9Sstevel@tonic-gate ** 1 signal was previously blocked 102*7c478bd9Sstevel@tonic-gate ** 0 signal was not previously blocked 103*7c478bd9Sstevel@tonic-gate ** -1 on failure. 104*7c478bd9Sstevel@tonic-gate */ 105*7c478bd9Sstevel@tonic-gate 106*7c478bd9Sstevel@tonic-gate int 107*7c478bd9Sstevel@tonic-gate sm_blocksignal(sig) 108*7c478bd9Sstevel@tonic-gate int sig; 109*7c478bd9Sstevel@tonic-gate { 110*7c478bd9Sstevel@tonic-gate # ifdef BSD4_3 111*7c478bd9Sstevel@tonic-gate # ifndef sigmask 112*7c478bd9Sstevel@tonic-gate # define sigmask(s) (1 << ((s) - 1)) 113*7c478bd9Sstevel@tonic-gate # endif /* ! sigmask */ 114*7c478bd9Sstevel@tonic-gate return (sigblock(sigmask(sig)) & sigmask(sig)) != 0; 115*7c478bd9Sstevel@tonic-gate # else /* BSD4_3 */ 116*7c478bd9Sstevel@tonic-gate # ifdef ALTOS_SYSTEM_V 117*7c478bd9Sstevel@tonic-gate sigfunc_t handler; 118*7c478bd9Sstevel@tonic-gate 119*7c478bd9Sstevel@tonic-gate handler = sigset(sig, SIG_HOLD); 120*7c478bd9Sstevel@tonic-gate if (handler == SIG_ERR) 121*7c478bd9Sstevel@tonic-gate return -1; 122*7c478bd9Sstevel@tonic-gate else 123*7c478bd9Sstevel@tonic-gate return handler == SIG_HOLD; 124*7c478bd9Sstevel@tonic-gate # else /* ALTOS_SYSTEM_V */ 125*7c478bd9Sstevel@tonic-gate sigset_t sset, oset; 126*7c478bd9Sstevel@tonic-gate 127*7c478bd9Sstevel@tonic-gate (void) sigemptyset(&sset); 128*7c478bd9Sstevel@tonic-gate (void) sigaddset(&sset, sig); 129*7c478bd9Sstevel@tonic-gate if (sigprocmask(SIG_BLOCK, &sset, &oset) < 0) 130*7c478bd9Sstevel@tonic-gate return -1; 131*7c478bd9Sstevel@tonic-gate else 132*7c478bd9Sstevel@tonic-gate return sigismember(&oset, sig); 133*7c478bd9Sstevel@tonic-gate # endif /* ALTOS_SYSTEM_V */ 134*7c478bd9Sstevel@tonic-gate # endif /* BSD4_3 */ 135*7c478bd9Sstevel@tonic-gate } 136*7c478bd9Sstevel@tonic-gate /* 137*7c478bd9Sstevel@tonic-gate ** SM_RELEASESIGNAL -- release a held signal 138*7c478bd9Sstevel@tonic-gate ** 139*7c478bd9Sstevel@tonic-gate ** Parameters: 140*7c478bd9Sstevel@tonic-gate ** sig -- the signal to release. 141*7c478bd9Sstevel@tonic-gate ** 142*7c478bd9Sstevel@tonic-gate ** Returns: 143*7c478bd9Sstevel@tonic-gate ** 1 signal was previously blocked 144*7c478bd9Sstevel@tonic-gate ** 0 signal was not previously blocked 145*7c478bd9Sstevel@tonic-gate ** -1 on failure. 146*7c478bd9Sstevel@tonic-gate */ 147*7c478bd9Sstevel@tonic-gate 148*7c478bd9Sstevel@tonic-gate int 149*7c478bd9Sstevel@tonic-gate sm_releasesignal(sig) 150*7c478bd9Sstevel@tonic-gate int sig; 151*7c478bd9Sstevel@tonic-gate { 152*7c478bd9Sstevel@tonic-gate # ifdef BSD4_3 153*7c478bd9Sstevel@tonic-gate return (sigsetmask(sigblock(0) & ~sigmask(sig)) & sigmask(sig)) != 0; 154*7c478bd9Sstevel@tonic-gate # else /* BSD4_3 */ 155*7c478bd9Sstevel@tonic-gate # ifdef ALTOS_SYSTEM_V 156*7c478bd9Sstevel@tonic-gate sigfunc_t handler; 157*7c478bd9Sstevel@tonic-gate 158*7c478bd9Sstevel@tonic-gate handler = sigset(sig, SIG_HOLD); 159*7c478bd9Sstevel@tonic-gate if (sigrelse(sig) < 0) 160*7c478bd9Sstevel@tonic-gate return -1; 161*7c478bd9Sstevel@tonic-gate else 162*7c478bd9Sstevel@tonic-gate return handler == SIG_HOLD; 163*7c478bd9Sstevel@tonic-gate # else /* ALTOS_SYSTEM_V */ 164*7c478bd9Sstevel@tonic-gate sigset_t sset, oset; 165*7c478bd9Sstevel@tonic-gate 166*7c478bd9Sstevel@tonic-gate (void) sigemptyset(&sset); 167*7c478bd9Sstevel@tonic-gate (void) sigaddset(&sset, sig); 168*7c478bd9Sstevel@tonic-gate if (sigprocmask(SIG_UNBLOCK, &sset, &oset) < 0) 169*7c478bd9Sstevel@tonic-gate return -1; 170*7c478bd9Sstevel@tonic-gate else 171*7c478bd9Sstevel@tonic-gate return sigismember(&oset, sig); 172*7c478bd9Sstevel@tonic-gate # endif /* ALTOS_SYSTEM_V */ 173*7c478bd9Sstevel@tonic-gate # endif /* BSD4_3 */ 174*7c478bd9Sstevel@tonic-gate } 175*7c478bd9Sstevel@tonic-gate /* 176*7c478bd9Sstevel@tonic-gate ** PEND_SIGNAL -- Add a signal to the pending signal list 177*7c478bd9Sstevel@tonic-gate ** 178*7c478bd9Sstevel@tonic-gate ** Parameters: 179*7c478bd9Sstevel@tonic-gate ** sig -- signal to add 180*7c478bd9Sstevel@tonic-gate ** 181*7c478bd9Sstevel@tonic-gate ** Returns: 182*7c478bd9Sstevel@tonic-gate ** none. 183*7c478bd9Sstevel@tonic-gate ** 184*7c478bd9Sstevel@tonic-gate ** NOTE: THIS CAN BE CALLED FROM A SIGNAL HANDLER. DO NOT ADD 185*7c478bd9Sstevel@tonic-gate ** ANYTHING TO THIS ROUTINE UNLESS YOU KNOW WHAT YOU ARE 186*7c478bd9Sstevel@tonic-gate ** DOING. 187*7c478bd9Sstevel@tonic-gate */ 188*7c478bd9Sstevel@tonic-gate 189*7c478bd9Sstevel@tonic-gate void 190*7c478bd9Sstevel@tonic-gate pend_signal(sig) 191*7c478bd9Sstevel@tonic-gate int sig; 192*7c478bd9Sstevel@tonic-gate { 193*7c478bd9Sstevel@tonic-gate int sigbit; 194*7c478bd9Sstevel@tonic-gate int save_errno = errno; 195*7c478bd9Sstevel@tonic-gate #if SM_CONF_SETITIMER 196*7c478bd9Sstevel@tonic-gate struct itimerval clr; 197*7c478bd9Sstevel@tonic-gate #endif /* SM_CONF_SETITIMER */ 198*7c478bd9Sstevel@tonic-gate 199*7c478bd9Sstevel@tonic-gate /* 200*7c478bd9Sstevel@tonic-gate ** Don't want to interrupt something critical, hence delay 201*7c478bd9Sstevel@tonic-gate ** the alarm for one second. Hopefully, by then we 202*7c478bd9Sstevel@tonic-gate ** will be out of the critical section. If not, then 203*7c478bd9Sstevel@tonic-gate ** we will just delay again. The events to be run will 204*7c478bd9Sstevel@tonic-gate ** still all be run, maybe just a little bit late. 205*7c478bd9Sstevel@tonic-gate */ 206*7c478bd9Sstevel@tonic-gate 207*7c478bd9Sstevel@tonic-gate switch (sig) 208*7c478bd9Sstevel@tonic-gate { 209*7c478bd9Sstevel@tonic-gate case SIGHUP: 210*7c478bd9Sstevel@tonic-gate sigbit = PEND_SIGHUP; 211*7c478bd9Sstevel@tonic-gate break; 212*7c478bd9Sstevel@tonic-gate 213*7c478bd9Sstevel@tonic-gate case SIGINT: 214*7c478bd9Sstevel@tonic-gate sigbit = PEND_SIGINT; 215*7c478bd9Sstevel@tonic-gate break; 216*7c478bd9Sstevel@tonic-gate 217*7c478bd9Sstevel@tonic-gate case SIGTERM: 218*7c478bd9Sstevel@tonic-gate sigbit = PEND_SIGTERM; 219*7c478bd9Sstevel@tonic-gate break; 220*7c478bd9Sstevel@tonic-gate 221*7c478bd9Sstevel@tonic-gate case SIGUSR1: 222*7c478bd9Sstevel@tonic-gate sigbit = PEND_SIGUSR1; 223*7c478bd9Sstevel@tonic-gate break; 224*7c478bd9Sstevel@tonic-gate 225*7c478bd9Sstevel@tonic-gate case SIGALRM: 226*7c478bd9Sstevel@tonic-gate /* don't have to pend these */ 227*7c478bd9Sstevel@tonic-gate sigbit = 0; 228*7c478bd9Sstevel@tonic-gate break; 229*7c478bd9Sstevel@tonic-gate 230*7c478bd9Sstevel@tonic-gate default: 231*7c478bd9Sstevel@tonic-gate /* If we get here, we are in trouble */ 232*7c478bd9Sstevel@tonic-gate abort(); 233*7c478bd9Sstevel@tonic-gate 234*7c478bd9Sstevel@tonic-gate /* NOTREACHED */ 235*7c478bd9Sstevel@tonic-gate /* shut up stupid compiler warning on HP-UX 11 */ 236*7c478bd9Sstevel@tonic-gate sigbit = 0; 237*7c478bd9Sstevel@tonic-gate break; 238*7c478bd9Sstevel@tonic-gate } 239*7c478bd9Sstevel@tonic-gate 240*7c478bd9Sstevel@tonic-gate if (sigbit != 0) 241*7c478bd9Sstevel@tonic-gate PendingSignal |= sigbit; 242*7c478bd9Sstevel@tonic-gate (void) sm_signal(SIGALRM, sm_tick); 243*7c478bd9Sstevel@tonic-gate #if SM_CONF_SETITIMER 244*7c478bd9Sstevel@tonic-gate clr.it_interval.tv_sec = 0; 245*7c478bd9Sstevel@tonic-gate clr.it_interval.tv_usec = 0; 246*7c478bd9Sstevel@tonic-gate clr.it_value.tv_sec = 1; 247*7c478bd9Sstevel@tonic-gate clr.it_value.tv_usec = 0; 248*7c478bd9Sstevel@tonic-gate (void) setitimer(ITIMER_REAL, &clr, NULL); 249*7c478bd9Sstevel@tonic-gate #else /* SM_CONF_SETITIMER */ 250*7c478bd9Sstevel@tonic-gate (void) alarm(1); 251*7c478bd9Sstevel@tonic-gate #endif /* SM_CONF_SETITIMER */ 252*7c478bd9Sstevel@tonic-gate errno = save_errno; 253*7c478bd9Sstevel@tonic-gate } 254*7c478bd9Sstevel@tonic-gate /* 255*7c478bd9Sstevel@tonic-gate ** SM_ALLSIGNALS -- act on all signals 256*7c478bd9Sstevel@tonic-gate ** 257*7c478bd9Sstevel@tonic-gate ** Parameters: 258*7c478bd9Sstevel@tonic-gate ** block -- whether to block or release all signals. 259*7c478bd9Sstevel@tonic-gate ** 260*7c478bd9Sstevel@tonic-gate ** Returns: 261*7c478bd9Sstevel@tonic-gate ** none. 262*7c478bd9Sstevel@tonic-gate */ 263*7c478bd9Sstevel@tonic-gate 264*7c478bd9Sstevel@tonic-gate void 265*7c478bd9Sstevel@tonic-gate sm_allsignals(block) 266*7c478bd9Sstevel@tonic-gate bool block; 267*7c478bd9Sstevel@tonic-gate { 268*7c478bd9Sstevel@tonic-gate # ifdef BSD4_3 269*7c478bd9Sstevel@tonic-gate # ifndef sigmask 270*7c478bd9Sstevel@tonic-gate # define sigmask(s) (1 << ((s) - 1)) 271*7c478bd9Sstevel@tonic-gate # endif /* ! sigmask */ 272*7c478bd9Sstevel@tonic-gate if (block) 273*7c478bd9Sstevel@tonic-gate { 274*7c478bd9Sstevel@tonic-gate int mask = 0; 275*7c478bd9Sstevel@tonic-gate 276*7c478bd9Sstevel@tonic-gate mask |= sigmask(SIGALRM); 277*7c478bd9Sstevel@tonic-gate mask |= sigmask(SIGCHLD); 278*7c478bd9Sstevel@tonic-gate mask |= sigmask(SIGHUP); 279*7c478bd9Sstevel@tonic-gate mask |= sigmask(SIGINT); 280*7c478bd9Sstevel@tonic-gate mask |= sigmask(SIGTERM); 281*7c478bd9Sstevel@tonic-gate mask |= sigmask(SIGUSR1); 282*7c478bd9Sstevel@tonic-gate 283*7c478bd9Sstevel@tonic-gate (void) sigblock(mask); 284*7c478bd9Sstevel@tonic-gate } 285*7c478bd9Sstevel@tonic-gate else 286*7c478bd9Sstevel@tonic-gate sigsetmask(0); 287*7c478bd9Sstevel@tonic-gate # else /* BSD4_3 */ 288*7c478bd9Sstevel@tonic-gate # ifdef ALTOS_SYSTEM_V 289*7c478bd9Sstevel@tonic-gate if (block) 290*7c478bd9Sstevel@tonic-gate { 291*7c478bd9Sstevel@tonic-gate (void) sigset(SIGALRM, SIG_HOLD); 292*7c478bd9Sstevel@tonic-gate (void) sigset(SIGCHLD, SIG_HOLD); 293*7c478bd9Sstevel@tonic-gate (void) sigset(SIGHUP, SIG_HOLD); 294*7c478bd9Sstevel@tonic-gate (void) sigset(SIGINT, SIG_HOLD); 295*7c478bd9Sstevel@tonic-gate (void) sigset(SIGTERM, SIG_HOLD); 296*7c478bd9Sstevel@tonic-gate (void) sigset(SIGUSR1, SIG_HOLD); 297*7c478bd9Sstevel@tonic-gate } 298*7c478bd9Sstevel@tonic-gate else 299*7c478bd9Sstevel@tonic-gate { 300*7c478bd9Sstevel@tonic-gate (void) sigset(SIGALRM, SIG_DFL); 301*7c478bd9Sstevel@tonic-gate (void) sigset(SIGCHLD, SIG_DFL); 302*7c478bd9Sstevel@tonic-gate (void) sigset(SIGHUP, SIG_DFL); 303*7c478bd9Sstevel@tonic-gate (void) sigset(SIGINT, SIG_DFL); 304*7c478bd9Sstevel@tonic-gate (void) sigset(SIGTERM, SIG_DFL); 305*7c478bd9Sstevel@tonic-gate (void) sigset(SIGUSR1, SIG_DFL); 306*7c478bd9Sstevel@tonic-gate } 307*7c478bd9Sstevel@tonic-gate # else /* ALTOS_SYSTEM_V */ 308*7c478bd9Sstevel@tonic-gate sigset_t sset; 309*7c478bd9Sstevel@tonic-gate 310*7c478bd9Sstevel@tonic-gate (void) sigemptyset(&sset); 311*7c478bd9Sstevel@tonic-gate (void) sigaddset(&sset, SIGALRM); 312*7c478bd9Sstevel@tonic-gate (void) sigaddset(&sset, SIGCHLD); 313*7c478bd9Sstevel@tonic-gate (void) sigaddset(&sset, SIGHUP); 314*7c478bd9Sstevel@tonic-gate (void) sigaddset(&sset, SIGINT); 315*7c478bd9Sstevel@tonic-gate (void) sigaddset(&sset, SIGTERM); 316*7c478bd9Sstevel@tonic-gate (void) sigaddset(&sset, SIGUSR1); 317*7c478bd9Sstevel@tonic-gate (void) sigprocmask(block ? SIG_BLOCK : SIG_UNBLOCK, &sset, NULL); 318*7c478bd9Sstevel@tonic-gate # endif /* ALTOS_SYSTEM_V */ 319*7c478bd9Sstevel@tonic-gate # endif /* BSD4_3 */ 320*7c478bd9Sstevel@tonic-gate } 321*7c478bd9Sstevel@tonic-gate /* 322*7c478bd9Sstevel@tonic-gate ** SM_SIGNAL_NOOP -- A signal no-op function 323*7c478bd9Sstevel@tonic-gate ** 324*7c478bd9Sstevel@tonic-gate ** Parameters: 325*7c478bd9Sstevel@tonic-gate ** sig -- signal received 326*7c478bd9Sstevel@tonic-gate ** 327*7c478bd9Sstevel@tonic-gate ** Returns: 328*7c478bd9Sstevel@tonic-gate ** SIGFUNC_RETURN 329*7c478bd9Sstevel@tonic-gate */ 330*7c478bd9Sstevel@tonic-gate 331*7c478bd9Sstevel@tonic-gate /* ARGSUSED */ 332*7c478bd9Sstevel@tonic-gate SIGFUNC_DECL 333*7c478bd9Sstevel@tonic-gate sm_signal_noop(sig) 334*7c478bd9Sstevel@tonic-gate int sig; 335*7c478bd9Sstevel@tonic-gate { 336*7c478bd9Sstevel@tonic-gate int save_errno = errno; 337*7c478bd9Sstevel@tonic-gate 338*7c478bd9Sstevel@tonic-gate FIX_SYSV_SIGNAL(sig, sm_signal_noop); 339*7c478bd9Sstevel@tonic-gate errno = save_errno; 340*7c478bd9Sstevel@tonic-gate return SIGFUNC_RETURN; 341*7c478bd9Sstevel@tonic-gate } 342*7c478bd9Sstevel@tonic-gate 343