1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 /*
  26  * @(#)bsd.cc 1.6 06/12/12
  27  */
  28 
  29 #pragma ident   "@(#)bsd.cc     1.6     06/12/12"
  30 
  31 #include <signal.h>
  32 
  33 #include <bsd/bsd.h>
  34 
  35 /* External references.
  36  */
  37 
  38 /* Forward references.
  39  */
  40 
  41 /* Static data.
  42  */
  43 
  44 extern SIG_PF
  45 bsd_signal (int Signal, SIG_PF Handler)
  46 {
  47   auto SIG_PF                   previous_handler;
  48 #ifdef SUN5_0
  49 #ifdef sun
  50   previous_handler = sigset (Signal, Handler);
  51 #else
  52   auto struct sigaction         new_action;
  53   auto struct sigaction         old_action;
  54 
  55   new_action.sa_flags = SA_SIGINFO;
  56   new_action.sa_handler = (void (*) ()) Handler;
  57   (void) sigemptyset (&new_action.sa_mask);
  58   (void) sigaddset (&new_action.sa_mask, Signal);
  59 
  60   (void) sigaction (Signal, &new_action, &old_action);
  61 
  62   previous_handler = (SIG_PF) old_action.sa_handler;
  63 #endif
  64 #elif defined(linux)
  65   previous_handler = sigset (Signal, Handler);
  66 #else
  67   previous_handler = signal (Signal, Handler);
  68 #endif
  69   return previous_handler;
  70 }
  71 
  72 extern void
  73 bsd_signals (void)
  74 {
  75   static int                    initialized = 0;
  76 
  77   if (initialized == 0)
  78     {
  79       initialized = 1;
  80 #if !defined(SUN5_0) && !defined(linux)
  81 #if defined(SIGHUP)
  82       (void) bsd_signal (SIGHUP, SIG_DFL);
  83 #endif
  84 #if defined(SIGINT)
  85       (void) bsd_signal (SIGINT, SIG_DFL);
  86 #endif
  87 #if defined(SIGQUIT)
  88       (void) bsd_signal (SIGQUIT, SIG_DFL);
  89 #endif
  90 #if defined(SIGILL)
  91       (void) bsd_signal (SIGILL, SIG_DFL);
  92 #endif
  93 #if defined(SIGTRAP)
  94       (void) bsd_signal (SIGTRAP, SIG_DFL);
  95 #endif
  96 #if defined(SIGIOT)
  97       (void) bsd_signal (SIGIOT, SIG_DFL);
  98 #endif
  99 #if defined(SIGABRT)
 100       (void) bsd_signal (SIGABRT, SIG_DFL);
 101 #endif
 102 #if defined(SIGEMT)
 103       (void) bsd_signal (SIGEMT, SIG_DFL);
 104 #endif
 105 #if defined(SIGFPE)
 106       (void) bsd_signal (SIGFPE, SIG_DFL);
 107 #endif
 108 #if defined(SIGBUS)
 109       (void) bsd_signal (SIGBUS, SIG_DFL);
 110 #endif
 111 #if defined(SIGSEGV)
 112       (void) bsd_signal (SIGSEGV, SIG_DFL);
 113 #endif
 114 #if defined(SIGSYS)
 115       (void) bsd_signal (SIGSYS, SIG_DFL);
 116 #endif
 117 #if defined(SIGPIPE)
 118       (void) bsd_signal (SIGPIPE, SIG_DFL);
 119 #endif
 120 #if defined(SIGALRM)
 121       (void) bsd_signal (SIGALRM, SIG_DFL);
 122 #endif
 123 #if defined(SIGTERM)
 124       (void) bsd_signal (SIGTERM, SIG_DFL);
 125 #endif
 126 #if defined(SIGUSR1)
 127       (void) bsd_signal (SIGUSR1, SIG_DFL);
 128 #endif
 129 #if defined(SIGUSR2)
 130       (void) bsd_signal (SIGUSR2, SIG_DFL);
 131 #endif
 132 #if defined(SIGCLD)
 133       (void) bsd_signal (SIGCLD, SIG_DFL);
 134 #endif
 135 #if defined(SIGCHLD)
 136       (void) bsd_signal (SIGCHLD, SIG_DFL);
 137 #endif
 138 #if defined(SIGPWR)
 139       (void) bsd_signal (SIGPWR, SIG_DFL);
 140 #endif
 141 #if defined(SIGWINCH)
 142       (void) bsd_signal (SIGWINCH, SIG_DFL);
 143 #endif
 144 #if defined(SIGURG)
 145       (void) bsd_signal (SIGURG, SIG_DFL);
 146 #endif
 147 #if defined(SIGIO)
 148       (void) bsd_signal (SIGIO, SIG_DFL);
 149 #else
 150 #if defined(SIGPOLL)
 151       (void) bsd_signal (SIGPOLL, SIG_DFL);
 152 #endif
 153 #endif
 154 #if defined(SIGTSTP)
 155       (void) bsd_signal (SIGTSTP, SIG_DFL);
 156 #endif
 157 #if defined(SIGCONT)
 158       (void) bsd_signal (SIGCONT, SIG_DFL);
 159 #endif
 160 #if defined(SIGTTIN)
 161       (void) bsd_signal (SIGTTIN, SIG_DFL);
 162 #endif
 163 #if defined(SIGTTOU)
 164       (void) bsd_signal (SIGTTOU, SIG_DFL);
 165 #endif
 166 #if defined(SIGVTALRM)
 167       (void) bsd_signal (SIGVTALRM, SIG_DFL);
 168 #endif
 169 #if defined(SIGPROF)
 170       (void) bsd_signal (SIGPROF, SIG_DFL);
 171 #endif
 172 #if defined(SIGXCPU)
 173       (void) bsd_signal (SIGXCPU, SIG_DFL);
 174 #endif
 175 #if defined(SIGXFSZ)
 176       (void) bsd_signal (SIGXFSZ, SIG_DFL);
 177 #endif
 178 #endif
 179     }
 180 
 181   return;
 182 }