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