16#include <sys/capability.h>
21#include <initializer_list>
26#ifndef OPENVPN_PLATFORM_LINUX
27#error SetUserGroupRetainCap requires Linux
36 const std::string &
group,
38 std::initializer_list<cap_value_t> retain_caps_arg)
48 std::initializer_list<cap_value_t> retain_caps_arg)
71 if (::prctl(PR_SET_KEEPCAPS, 1L))
73 const int eno = errno;
91 if (::setresuid(
pw->pw_uid,
pw->pw_uid,
pw->pw_uid))
93 const int eno = errno;
130 title(std::move(title_arg))
139 void set_flag(
const std::vector<cap_value_t> &caps)
141 if (::cap_set_flag(
capabilities, CAP_PERMITTED, numeric_cast<int>(caps.size()), caps.data(), CAP_SET)
142 || ::cap_set_flag(
capabilities, CAP_EFFECTIVE, numeric_cast<int>(caps.size()), caps.data(), CAP_SET))
144 const int eno = errno;
151 caps.push_back(CAP_SETUID);
152 caps.push_back(CAP_SETGID);
160 const int eno = errno;
168 std::string
ret(txt);
184 if (::setresuid(0, 0, 0))
186 const int eno = errno;
void set_flag(const std::vector< cap_value_t > &caps)
Capabilities(const Capabilities &)=delete
Capabilities(std::string title_arg)
std::string to_string() const
void set_flag_with_setuid_setgid(std::vector< cap_value_t > caps)
Capabilities & operator=(const Capabilities &)=delete
virtual void post_thread() const override
SetUserGroupRetainCap(const char *user, const char *group, const bool strict, std::initializer_list< cap_value_t > retain_caps_arg)
SetUserGroupRetainCap(const std::string &user, const std::string &group, const bool strict, std::initializer_list< cap_value_t > retain_caps_arg)
virtual void activate() const override
virtual void pre_thread() const override
const std::vector< cap_value_t > retain_caps
void do_setgid_setgroups() const
const std::string & user() const
const std::string & group() const
void retain_core_dumps() const
virtual void activate() const
#define OPENVPN_THROW(exc, stuff)
#define OPENVPN_LOG(args)
std::string strerror_str(const int errnum)