24RCSID(
"$Id: 1c0c1f48a6857d41442f86ba3d80cbebf960d6fe $")
26#ifdef HAVE_CAPABILITY_H
27#include <freeradius-devel/util/cap.h>
28#include <freeradius-devel/util/strerror.h>
29#include <freeradius-devel/util/syserror.h>
30#include <freeradius-devel/util/table.h>
35 {
L(
"effective"), CAP_EFFECTIVE },
36 {
L(
"inherited"), CAP_INHERITABLE },
37 {
L(
"permitted"), CAP_PERMITTED }
39static size_t cap_set_table_len =
NUM_ELEMENTS(cap_set_table);
58bool fr_cap_is_enabled(cap_value_t cap, cap_flag_t set)
61 cap_flag_value_t state = CAP_CLEAR;
63 pthread_mutex_lock(&cap_mutex);
65 caps = cap_get_proc();
71 if (cap_get_flag(caps, cap, CAP_EFFECTIVE, &state) < 0) {
72 char *cap_name = cap_to_name(cap);
82 pthread_mutex_unlock(&cap_mutex);
84 if (caps) cap_free(caps);
86 return (state == CAP_SET);
105int fr_cap_enable(cap_value_t cap, cap_flag_t set)
109 cap_flag_value_t state;
119 pthread_mutex_lock(&cap_mutex);
121 if (set == CAP_PERMITTED) {
126 caps = cap_get_proc();
132 if (cap_get_flag(caps, cap, CAP_PERMITTED, &state) < 0) {
133 char *cap_name = cap_to_name(cap);
142 if (state == CAP_CLEAR) {
143 char *cap_name = cap_to_name(cap);
148 fr_strerror_printf(
"Use \"setcap %s+ep <path_to_binary>\" to grant the %s capability",
154 if (cap_get_flag(caps, cap, set, &state) < 0) {
155 char *cap_name = cap_to_name(cap);
169 if (state == CAP_CLEAR) {
170 cap_value_t
const to_set[] = {
174 if (cap_set_flag(caps, set,
NUM_ELEMENTS(to_set), to_set, CAP_SET) < 0) {
175 char *cap_name = cap_to_name(cap);
184 if (cap_set_proc(caps) < 0) {
185 char *cap_name = cap_to_name(cap);
198 }
else if (state == CAP_SET) {
203 pthread_mutex_unlock(&cap_mutex);
205 if (caps) cap_free(caps);
221int fr_cap_disable(cap_value_t cap, cap_flag_t set)
225 cap_flag_value_t state;
235 pthread_mutex_lock(&cap_mutex);
237 caps = cap_get_proc();
243 if (cap_get_flag(caps, cap, set, &state) < 0) {
244 char *cap_name = cap_to_name(cap);
253 if (state == CAP_SET) {
254 if (cap_clear_flag(caps, set) < 0) {
255 char *cap_name = cap_to_name(cap);
264 if (cap_set_proc(caps) < 0) {
265 char *cap_name = cap_to_name(cap);
280 pthread_mutex_unlock(&cap_mutex);
282 if (caps) cap_free(caps);
292ssize_t fr_cap_set_to_str(TALLOC_CTX *ctx,
char **
out)
298 caps = cap_get_proc();
303 tmp = cap_to_text(caps, &slen);
#define L(_str)
Helper for initialising arrays of string literals.
char const * fr_syserror(int num)
Guaranteed to be thread-safe version of strerror.
#define fr_table_str_by_value(_table, _number, _def)
Convert an integer to a string.
An element in a lexicographically sorted array of name to num mappings.
char * talloc_bstrndup(TALLOC_CTX *ctx, char const *in, size_t inlen)
Binary safe strndup function.
#define fr_strerror_printf(_fmt,...)
Log to thread local error buffer.
#define fr_strerror_const(_msg)
static size_t char ** out