modules/up/src/Core/sys/Signal.cc

/* [<][>]
[^][v][top][bottom][index][help] */

FUNCTIONS

This source file includes following functions.
  1. sysSignalFromKernel
  2. Signal
  3. Signal

   1 //
   2 // $Id: Signal.cc,v 1.2 2001/09/07 11:42:28 shane Exp $
   3 //
   4 // Signal.cc
   5 // Author: Ramesh Govindan <govindan@isi.edu>
   6 
   7 #ifdef HAVE_CONFIG_H
   8 #include <config.h>
   9 #endif
  10 
  11 #include <cstdio>
  12 #include <cstdlib>
  13 #include <cerrno>
  14 
  15 extern "C" {
  16 #if HAVE_UNISTD_H
  17 #include <unistd.h>
  18 #endif // HAVE_UNISTD_H
  19 
  20 #include <sys/types.h>
  21 #include <signal.h>
  22 }
  23 
  24 #include "util/Types.hh"
  25 #include "util/List.hh"
  26 #include "util/Trail.hh"
  27 
  28 #include "sys/Signal.hh"
  29 #include "sched/Dispatcher.hh"
  30 
  31 extern "C" {
  32 #ifndef STDC_HEADERS
  33 #ifdef HAVE_SIGVEC
  34 extern void sigvec(...);
  35 #endif
  36 #ifdef HAVE_SIGACTION
  37 extern int sigaction(...);
  38 extern int sigemptyset(...);
  39 #endif
  40 #ifdef HAVE_SIGSET
  41 extern int sigset(...);
  42 #endif
  43 #endif
  44 }
  45 
  46 // File local stuff
  47 static struct _sigTypeToName {
  48     int sigtype;
  49     const char* signame;
  50 } sigTypeToName[] = {
  51     {SIGTERM, "terminate"},
  52     {SIGHUP,  "hup"},
  53     {SIGINT,  "int"},
  54     {SIGQUIT, "quit"},
  55     {SIGPIPE, "pipe"},
  56 #ifdef SIGTTOU
  57     {SIGTTOU, "ttou"},
  58 #endif // SIGTTOU
  59 #ifdef SIGTTIN
  60     {SIGTTIN, "ttin"},
  61 #endif // SIGTTIN
  62 #ifdef SIGTSTP
  63     {SIGTSTP, "tstp"},
  64 #endif // SIGTSTP
  65     {SIGHUP, "hup"},
  66     {0},
  67 };
  68 static TraceCode traceSignal("signal");
  69 
  70 // The Signal class represents a specific signal.
  71 // Usually, the main program:
  72 //      creates one or more Signal objects (of which three types
  73 //              are recognized - terminate, restart, dump)
  74 //      this automatically registers the object with the dispatcher
  75 
  76 static void
  77 sysSignalFromKernel(int sigtype)
     /* [<][>][^][v][top][bottom][index][help] */
  78 {
  79     struct _sigTypeToName       *st;
  80 
  81     for (st = &sigTypeToName[0]; st->sigtype != 0; st++) {
  82         if (st->sigtype == sigtype) {
  83             TRACE(traceSignal,
  84                   "received %s signal, number %d\n",
  85                   st->signame,
  86                   st->sigtype);
  87 #ifdef HAVE_SIGSET
  88             // Re-arm signal
  89             sigset(sigtype, sysSignalFromKernel);
  90 #endif // HAVE_SIGSET            
  91             dispatcher.signals.mark(st->signame);
  92             return;
  93         }
  94     }
  95 
  96     ERROR("received unrecognized signal %d\n",
  97           sigtype);
  98     return;
  99 }
 100 
 101 Signal::Signal(const char* p,
     /* [<][>][^][v][top][bottom][index][help] */
 102                const Handler* h)
 103         : ListNode()
 104 {
 105     struct _sigTypeToName       *st;
 106 
 107     pending_ = false;
 108     for (st = &sigTypeToName[0]; st->sigtype != 0; st++) {
 109         if (!strcmp(st->signame, p)) { 
 110             name_ = st->signame;
 111             if (h == NULL) {
 112                 goto Ignore;
 113             }
 114             handler_ = *h;
 115             dispatcher.signals.append(this);
 116             goto Arm;
 117         }
 118     }
 119     ERROR("signal %s not defined on this system, ignoring\n", name_);
 120     return;
 121 
 122   Ignore:
 123     {
 124 #ifdef HAVE_SIGACTION
 125         struct sigaction act;
 126 
 127         TRACE(traceSignal,
 128               "asking kernel to ignore signal number %d\n",
 129               st->sigtype);
 130     
 131         sigemptyset(&act.sa_mask);
 132         act.sa_handler = SIG_IGN;
 133         act.sa_flags = 0;
 134 
 135         if (sigaction(st->sigtype, &act, NULL) < 0) {
 136             FATAL("sigaction ignore failed on %d: %s\n",
 137                   st->sigtype,
 138                   strerror(errno));
 139         }
 140 #else // HAVE_SIGACTION
 141         signal(st->sigtype, SIG_IGN);
 142 #endif // HAVE_SIGACTION
 143 
 144         return;
 145     }
 146 
 147   Arm:
 148     {
 149 #ifdef HAVE_SIGACTION
 150         struct sigaction act;
 151 
 152         sigemptyset(&act.sa_mask);
 153         act.sa_handler = sysSignalFromKernel;
 154         act.sa_flags = 0;
 155 
 156         TRACE(traceSignal,
 157               "arming %s signal\n",
 158               name_);
 159         
 160         if (sigaction(st->sigtype, &act, NULL) < 0) {
 161             FATAL("sigaction failed on %d: %s\n",
 162                   st->sigtype,
 163                   strerror(errno));
 164         }
 165 #endif // HAVE_SIGACTION
 166 
 167 #ifdef HAVE_SIGVEC
 168         struct sigvec   vec, ovec;
 169 
 170         memset((char*) &vec, 0, sizeof(vec));
 171         vec.sv_handler = sysSignalFromKernel;
 172 
 173         TRACE(traceSignal,
 174               "arming %s signal\n",
 175               name_);
 176         if (sigvec(st->sigtype, &vec, &ovec) < 0) {
 177             FATAL("sigvec failed on %d: %s\n",
 178                   st->sigtype,
 179                   strerror(errno));
 180         }
 181 #endif // HAVE_SIGVEC
 182 
 183 #ifdef HAVE_SIGSET
 184         TRACE(traceSignal,
 185               "arming %s signal\n",
 186               name_);
 187         sigset(st->sigtype, sysSignalFromKernel);
 188 #endif // HAVE_SIGSET
 189 
 190         return;
 191     }
 192 }
 193 
 194 Signal::~Signal() {
     /* [<][>][^][v][top][bottom][index][help] */
 195     dispatcher.signals.remove(this);
 196 }
 197 //
 198 //  Copyright (c) 1994 by the University of Southern California.
 199 //  All rights reserved.
 200 //
 201 //  Permission to use, copy, modify, and distribute this software and
 202 //  its documentation in source and binary forms for lawful
 203 //  non-commercial purposes and without fee is hereby granted, provided
 204 //  that the above copyright notice appear in all copies and that both
 205 //  the copyright notice and this permission notice appear in supporting
 206 //  documentation, and that any documentation, advertising materials,
 207 //  and other materials related to such distribution and use acknowledge
 208 //  that the software was developed by the University of Southern
 209 //  California and/or Information Sciences Institute.
 210 //  The name of the University of Southern California may not
 211 //  be used to endorse or promote products derived from this software
 212 //  without specific prior written permission.
 213 //
 214 //  THE UNIVERSITY OF SOUTHERN CALIFORNIA DOES NOT MAKE ANY REPRESENTATIONS
 215 //  ABOUT THE SUITABILITY OF THIS SOFTWARE FOR ANY PURPOSE.  THIS SOFTWARE IS
 216 //  PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
 217 //  INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
 218 //  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND 
 219 //  NON-INFRINGEMENT.
 220 //
 221 //  IN NO EVENT SHALL USC, OR ANY OTHER CONTRIBUTOR BE LIABLE FOR ANY
 222 //  SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES, WHETHER IN CONTRACT,
 223 //  TORT, OR OTHER FORM OF ACTION, ARISING OUT OF OR IN CONNECTION WITH,
 224 //  THE USE OR PERFORMANCE OF THIS SOFTWARE.
 225 //
 226 //  Questions concerning this software should be directed to 
 227 //  info-ra@isi.edu.
 228 //

/* [<][>][^][v][top][bottom][index][help] */