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#if !defined(OPENVPN_PLATFORM_WIN)
18
19#include <signal.h>
20
23
24namespace openvpn {
25class Signal
26{
27 public:
29
30 typedef void (*handler_t)(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 else
135 return nullptr;
136 }
137
138 // Destructor restores the previous signal mask.
140 {
141 if (blocked_)
142 pthread_sigmask(SIG_SETMASK, &old_mask_, 0);
143 }
144
145 private:
146 // Have signals been blocked.
148
149 // The previous signal mask.
150 sigset_t old_mask_;
151};
152
153// Like SignalBlocker, but block specific signals in default constructor
155{
157 : SignalBlocker( // these signals should be handled by parent thread
158 Signal::F_SIGINT
159 | Signal::F_SIGTERM
160 | Signal::F_SIGHUP
161 | Signal::F_SIGUSR1
162 | Signal::F_SIGUSR2
163 | Signal::F_SIGPIPE)
164 {
165 }
166};
167
169{
171 : SignalBlocker(Signal::F_SIGPIPE)
172 {
173 }
174};
175
176} // namespace openvpn
177#endif
178#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
Signal(const handler_t handler, const unsigned int flags)
Definition signal.hpp:49
void(* handler_t)(int signum)
Definition signal.hpp:30
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:961
reroute_gw flags