00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef _SigAction_h
00014 #define _SigAction_h
00015
00016
00017
00018 #include <signal.h>
00019 #include <errno.h>
00020
00021 #include "assa/Assure.h"
00022 #include "assa/SigSet.h"
00023
00024
00025
00026 extern "C" {
00027 typedef struct sigaction SIGACTION;
00028 typedef void (*C_SIG_HANDLER)( int );
00029 }
00030
00031 namespace ASSA {
00032
00033 #if !defined(WIN32)
00034
00094 class SigAction
00095 {
00096 public:
00100 SigAction();
00101
00114 SigAction (C_SIG_HANDLER handler_,
00115 SigSet* sig_mask_ = 0,
00116 int flags_ = 0);
00117
00133 SigAction (C_SIG_HANDLER handler_,
00134 int signum_,
00135 SigSet* sig_mask_ = 0,
00136 int flags_ = 0);
00137
00149 int register_action (int signum_, SigAction* oaction_ = 0);
00150
00159 int restore_action (int signum_, SigAction& oaction_);
00160
00167 int retrieve_action (int signum_);
00168
00172 void action (SIGACTION * sa_);
00173
00177 SIGACTION * action ();
00178
00182 void flags (int new_flags_);
00183
00187 int flags ();
00188
00191 void mask (SigSet & mask_set_);
00192
00195 SigSet mask ();
00196
00199 void handler (C_SIG_HANDLER sha_);
00200
00203 C_SIG_HANDLER handler ();
00204
00209 operator SIGACTION *();
00210
00211 private:
00213 SIGACTION m_sa;
00214 };
00215
00216
00217
00218
00219 inline
00220 SigAction::
00221 SigAction ()
00222 {
00223 trace_with_mask("SigAction::SigAction", SIGACT);
00224
00225 m_sa.sa_flags = 0;
00226 sigemptyset(&m_sa.sa_mask);
00227 *(C_SIG_HANDLER*) &m_sa.sa_handler = (C_SIG_HANDLER) 0;
00228 }
00229
00230 inline
00231 SigAction::
00232 SigAction (C_SIG_HANDLER handler_,
00233 SigSet* sig_mask_,
00234 int flags_)
00235 {
00236 trace_with_mask("SigAction::SigAction(,,)", SIGACT);
00237
00238 m_sa.sa_flags = flags_;
00239 if (sig_mask_ == NULL) {
00240 sigemptyset(&m_sa.sa_mask);
00241 }
00242 else {
00243
00244
00245
00246
00247
00248
00249
00250 m_sa.sa_mask = **sig_mask_;
00251 }
00252 *(C_SIG_HANDLER*) &m_sa.sa_handler = (C_SIG_HANDLER) handler_;
00253 }
00254
00255 inline
00256 SigAction::
00257 SigAction (C_SIG_HANDLER handler_,
00258 int signum_,
00259 SigSet* sig_mask_,
00260 int flags_)
00261 {
00262 trace_with_mask("SigAction::SigAction(,,,)", SIGACT);
00263
00264 m_sa.sa_flags = flags_;
00265 if (sig_mask_ == NULL) {
00266 sigemptyset(&m_sa.sa_mask);
00267 }
00268 else {
00269
00270 m_sa.sa_mask = **sig_mask_;
00271 }
00272 *(C_SIG_HANDLER*) &m_sa.sa_handler = (C_SIG_HANDLER) handler_;
00273
00274
00275 sigaction (signum_, &m_sa, 0);
00276 }
00277
00278 inline void
00279 SigAction::
00280 action (SIGACTION* sa_)
00281 {
00282 trace_with_mask("SigAction::action", SIGACT);
00283 m_sa = *sa_;
00284 }
00285
00286 inline SIGACTION *
00287 SigAction::
00288 action ()
00289 {
00290 trace_with_mask("SigAction::action", SIGACT);
00291
00292 return &m_sa;
00293 }
00294
00295 inline void
00296 SigAction::
00297 flags (int new_flags_)
00298 {
00299 trace_with_mask("void SigAction::flags()", SIGACT);
00300
00301 m_sa.sa_flags = new_flags_;
00302 }
00303
00304 inline int
00305 SigAction::
00306 flags ()
00307 {
00308 trace_with_mask("int SigAction::flags()", SIGACT);
00309
00310 return m_sa.sa_flags;
00311 }
00312
00313 inline void
00314 SigAction::
00315 mask (SigSet & mask_set_)
00316 {
00317 trace_with_mask("void SigAction::mask()", SIGACT);
00318
00319 m_sa.sa_mask = *mask_set_;
00320 }
00321
00322 inline SigSet
00323 SigAction::
00324 mask ()
00325 {
00326 trace_with_mask("SigSet SigAction::mask()", SIGACT);
00327
00328 SigSet tmpset(&m_sa.sa_mask);
00329 return tmpset;
00330 }
00331
00332 inline void
00333 SigAction::
00334 handler (C_SIG_HANDLER sha_)
00335 {
00336 trace_with_mask("void SigAction::handler()", SIGACT);
00337
00338 *(C_SIG_HANDLER*) &m_sa.sa_handler = (C_SIG_HANDLER) sha_;
00339 }
00340
00341 inline C_SIG_HANDLER
00342 SigAction::
00343 handler ()
00344 {
00345 trace_with_mask("C_SIG_HANDLER SigAction::handler()", SIGACT);
00346
00347 return (C_SIG_HANDLER) m_sa.sa_handler;
00348 }
00349
00350 inline
00351 SigAction::operator SIGACTION * ()
00352 {
00353 trace_with_mask("SigAction::operator SIGACTION * ()", SIGACT);
00354
00355 return &m_sa;
00356 }
00357
00358 inline int
00359 SigAction::
00360 register_action (int signum_, SigAction* oaction_)
00361 {
00362 trace_with_mask("SigAction::register_action()", SIGACT);
00363
00364
00365 struct sigaction *osa = oaction_ == 0 ? 0 : oaction_->action();
00366 return sigaction(signum_, &m_sa, osa);
00367 }
00368
00369 inline int
00370 SigAction::
00371 restore_action (int signum_, SigAction& oaction_)
00372 {
00373 trace_with_mask("SigAction::restore_action()", SIGACT);
00374
00375 m_sa = *oaction_.action();
00376 return sigaction(signum_, &m_sa, 0);
00377 }
00378
00379 inline int
00380 SigAction::
00381 retrieve_action (int signum_)
00382 {
00383 trace_with_mask("SigAction::retrieve_action()", SIGACT);
00384
00385 return sigaction(signum_, 0, &m_sa);
00386 }
00387
00388 #endif // !defined(WIN32)
00389
00390 }
00391
00392
00393 #endif