Fix string hexdecoding
[platform/upstream/libzypp.git] / zypp / base / Signal.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/base/Signal.h
10  *
11 */
12 #ifndef ZYPP_BASE_SIGNAL_H
13 #define ZYPP_BASE_SIGNAL_H
14
15 #include <csignal>
16 #include <iosfwd>
17
18 ///////////////////////////////////////////////////////////////////
19 namespace zypp
20 { /////////////////////////////////////////////////////////////////
21
22   /** Exception safe signal handler save/restore.
23    * \ingroup g_RAII
24    */
25   class SignalSaver
26   {
27     public:
28       SignalSaver( int signum_r, sighandler_t handler_r )
29       : _signum( signum_r )
30       { _orighandler = ::signal( signum_r, handler_r ); }
31       ~SignalSaver()
32       { ::signal( _signum, _orighandler ); }
33     private:
34       int _signum;
35       ::sighandler_t _orighandler;
36   };
37
38   /** Exception safe sigprocmask save/restore.
39    * \ingroup g_RAII
40    */
41   class SigprocmaskSaver
42   {
43     public:
44       /** Ctor saving the original sigprocmask. */
45       SigprocmaskSaver()
46       { ::sigprocmask( SIG_SETMASK, NULL, &_origmask ); }
47       /** Dtor restoring the original sigprocmask. */
48       ~SigprocmaskSaver()
49       { ::sigprocmask( SIG_SETMASK, &_origmask, NULL ); }
50     public:
51       /** Temporary block signal. */
52       void block( int signum_r )
53       {
54         ::sigset_t mask;
55         ::sigemptyset( & mask );
56         ::sigaddset( & mask, signum_r );
57         ::sigprocmask( SIG_BLOCK, &mask, NULL );
58       }
59       /** Temporary unblock signal. */
60       void unblock( int signum_r )
61       {
62         ::sigset_t mask;
63         ::sigemptyset( & mask );
64         ::sigaddset( & mask, signum_r );
65         ::sigprocmask( SIG_UNBLOCK, &mask, NULL );
66       }
67       /** Whether signal delivery is pending. */
68       bool pending( int signum_r )
69       {
70         ::sigset_t mask;
71         ::sigpending( &mask );
72         return ::sigismember( &mask, signum_r );
73       }
74       /** Wait for signals not blocked in original sigprocmask. */
75       void suspend()
76       { ::sigsuspend( &_origmask ); }
77     private:
78       ::sigset_t _origmask;
79   };
80
81   /////////////////////////////////////////////////////////////////
82 } // namespace zypp
83 ///////////////////////////////////////////////////////////////////
84 #endif // ZYPP_BASE_SIGNAL_H