OpenVPN 3 Core Library
Loading...
Searching...
No Matches
signal.hpp
Go to the documentation of this file.
1// OpenVPN -- An application to securely tunnel IP networks
2// over a single port, with support for SSL/TLS-based
3// session authentication and key exchange,
4// packet encryption, packet authentication, and
5// packet compression.
6//
7// Copyright (C) 2012- OpenVPN Inc.
8//
9// SPDX-License-Identifier: MPL-2.0 OR AGPL-3.0-only WITH openvpn3-openssl-exception
10//
11
12#ifndef OPENVPN_COMMON_SIGNAL_H
13#define OPENVPN_COMMON_SIGNAL_H
14
16
17#ifndef OPENVPN_PLATFORM_WIN
18
19#include <signal.h>
20
23
24namespace openvpn {
25class Signal
26{
27 public:
29
30 using handler_t = void (*)(int signum);
31
32 enum
33 {
34 F_SIGINT = (1 << 0),
35 F_SIGTERM = (1 << 1),
36 F_SIGHUP = (1 << 2),
37 F_SIGUSR1 = (1 << 3),
38 F_SIGUSR2 = (1 << 4),
39 F_SIGPIPE = (1 << 5),
40 };
41
49 Signal(const handler_t handler, const unsigned int flags)
50 {
51 struct sigaction sa;
52 sa.sa_handler = handler;
53 sigemptyset(&sa.sa_mask);
54 sa.sa_flags = SA_RESTART; // restart functions if interrupted by handler
55 sigconf(sa, flags_ = flags);
56 }
57
58 ~Signal() noexcept(false)
59 {
61 }
62
67
68 static void reset_to_defaults(const unsigned int flags)
69 {
70 struct sigaction sa;
71 sa.sa_handler = SIG_DFL;
72 sigemptyset(&sa.sa_mask);
73 sa.sa_flags = 0;
74 sigconf(sa, flags);
75 }
76
77 private:
78 static void sigconf(struct sigaction &sa, const unsigned int flags)
79 {
80 if (flags & F_SIGINT)
81 sigact(sa, SIGINT);
82 if (flags & F_SIGTERM)
83 sigact(sa, SIGTERM);
84 if (flags & F_SIGHUP)
85 sigact(sa, SIGHUP);
86 if (flags & F_SIGUSR1)
87 sigact(sa, SIGUSR1);
88 if (flags & F_SIGUSR2)
89 sigact(sa, SIGUSR2);
90 if (flags & F_SIGPIPE)
91 sigact(sa, SIGPIPE);
92 }
93
94 static void sigact(struct sigaction &sa, const int sig)
95 {
96 if (sigaction(sig, &sa, nullptr) == -1)
97 throw signal_error();
98 }
99
100 unsigned int flags_;
101};
102
103// Like Asio posix_signal_blocker, but only block certain signals
105{
106 SignalBlocker(const SignalBlocker &) = delete;
108
109 public:
110 SignalBlocker(const unsigned int flags) // use signal mask from class Signal
111 : blocked_(false)
112 {
113 sigset_t new_mask;
114 sigemptyset(&new_mask);
116 sigaddset(&new_mask, SIGINT);
118 sigaddset(&new_mask, SIGTERM);
120 sigaddset(&new_mask, SIGHUP);
122 sigaddset(&new_mask, SIGUSR1);
124 sigaddset(&new_mask, SIGUSR2);
126 sigaddset(&new_mask, SIGPIPE);
127 blocked_ = (pthread_sigmask(SIG_BLOCK, &new_mask, &old_mask_) == 0);
128 }
129
130 const sigset_t *orig_sigset() const
131 {
132 if (blocked_)
133 return &old_mask_;
134 return nullptr;
135 }
136
137 // Destructor restores the previous signal mask.
139 {
140 if (blocked_)
141 pthread_sigmask(SIG_SETMASK, &old_mask_, 0);
142 }
143
144 private:
145 // Have signals been blocked.
147
148 // The previous signal mask.
149 sigset_t old_mask_;
150};
151
152// Like SignalBlocker, but block specific signals in default constructor
154{
156 : SignalBlocker( // these signals should be handled by parent thread
157 Signal::F_SIGINT
158 | Signal::F_SIGTERM
159 | Signal::F_SIGHUP
160 | Signal::F_SIGUSR1
161 | Signal::F_SIGUSR2
162 | Signal::F_SIGPIPE)
163 {
164 }
165};
166
168{
170 : SignalBlocker(Signal::F_SIGPIPE)
171 {
172 }
173};
174
175} // namespace openvpn
176#endif
177#endif
const sigset_t * orig_sigset() const
Definition signal.hpp:130
SignalBlocker(const SignalBlocker &)=delete
SignalBlocker(const unsigned int flags)
Definition signal.hpp:110
SignalBlocker & operator=(const SignalBlocker &)=delete
static void reset_to_defaults(const unsigned int flags)
Definition signal.hpp:68
unsigned int flags_
Definition signal.hpp:100
void(*)(int signum) handler_t
Definition signal.hpp:30
Signal(const handler_t handler, const unsigned int flags)
Definition signal.hpp:49
static void reset_all_to_defaults()
Definition signal.hpp:63
static void sigact(struct sigaction &sa, const int sig)
Definition signal.hpp:94
static void sigconf(struct sigaction &sa, const unsigned int flags)
Definition signal.hpp:78
OPENVPN_SIMPLE_EXCEPTION(signal_error)
~Signal() noexcept(false)
Definition signal.hpp:58
static void handler(int signum)
Definition cli.cpp:959
reroute_gw flags