]>
Commit | Line | Data |
---|---|---|
c07f9fc5 FG |
1 | #pragma once |
2 | ||
7c673cae FG |
3 | #ifdef HAVE_SYS_PRCTL_H |
4 | #include <iostream> | |
5 | #include <sys/prctl.h> | |
6 | #include "common/errno.h" | |
7 | ||
8 | struct PrCtl { | |
9 | int saved_state = -1; | |
10 | int set_dumpable(int new_state) { | |
11 | int r = prctl(PR_SET_DUMPABLE, new_state); | |
12 | if (r) { | |
13 | r = -errno; | |
14 | std::cerr << "warning: unable to " << (new_state ? "set" : "unset") | |
15 | << " dumpable flag: " << cpp_strerror(r) | |
16 | << std::endl; | |
17 | } | |
18 | return r; | |
19 | } | |
20 | PrCtl(int new_state = 0) { | |
21 | int r = prctl(PR_GET_DUMPABLE); | |
22 | if (r == -1) { | |
23 | r = errno; | |
24 | std::cerr << "warning: unable to get dumpable flag: " << cpp_strerror(r) | |
25 | << std::endl; | |
26 | } else if (r != new_state) { | |
27 | if (!set_dumpable(new_state)) { | |
28 | saved_state = r; | |
29 | } | |
30 | } | |
31 | } | |
32 | ~PrCtl() { | |
33 | if (saved_state < 0) { | |
34 | return; | |
35 | } | |
36 | set_dumpable(saved_state); | |
37 | } | |
38 | }; | |
c07f9fc5 | 39 | |
7c673cae | 40 | #else |
c07f9fc5 FG |
41 | |
42 | struct PrCtl { | |
43 | // to silence the Wunused-variable warning | |
44 | PrCtl() {} | |
45 | }; | |
46 | ||
7c673cae | 47 | #endif |