Linux Audio

Check our new training course

Buildroot integration, development and maintenance

Need a Buildroot system for your embedded project?
Loading...
v5.4
 1// SPDX-License-Identifier: GPL-2.0
 2/*
 3 * Capability utilities
 4 */
 5
 6#ifdef HAVE_LIBCAP_SUPPORT
 7
 8#include "cap.h"
 9#include <stdbool.h>
10#include <sys/capability.h>
11
12bool perf_cap__capable(cap_value_t cap)
13{
14	cap_flag_value_t val;
15	cap_t caps = cap_get_proc();
16
17	if (!caps)
18		return false;
19
20	if (cap_get_flag(caps, cap, CAP_EFFECTIVE, &val) != 0)
21		val = CAP_CLEAR;
22
23	if (cap_free(caps) != 0)
24		return false;
25
26	return val == CAP_SET;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27}
28
29#endif  /* HAVE_LIBCAP_SUPPORT */
v6.13.7
 1// SPDX-License-Identifier: GPL-2.0
 2/*
 3 * Capability utilities
 4 */
 5
 
 
 6#include "cap.h"
 7#include "debug.h"
 8#include <errno.h>
 9#include <string.h>
10#include <linux/capability.h>
11#include <sys/syscall.h>
12#include <unistd.h>
 
 
 
 
13
14#define MAX_LINUX_CAPABILITY_U32S _LINUX_CAPABILITY_U32S_3
 
15
16bool perf_cap__capable(int cap, bool *used_root)
17{
18	struct __user_cap_header_struct header = {
19		.version = _LINUX_CAPABILITY_VERSION_3,
20		.pid = 0,
21	};
22	struct __user_cap_data_struct data[MAX_LINUX_CAPABILITY_U32S] = {};
23	__u32 cap_val;
24
25	*used_root = false;
26	while (syscall(SYS_capget, &header, &data[0]) == -1) {
27		/* Retry, first attempt has set the header.version correctly. */
28		if (errno == EINVAL && header.version != _LINUX_CAPABILITY_VERSION_3 &&
29		    header.version == _LINUX_CAPABILITY_VERSION_1)
30			continue;
31
32		pr_debug2("capget syscall failed (%s - %d) fall back on root check\n",
33			  strerror(errno), errno);
34		*used_root = true;
35		return geteuid() == 0;
36	}
37
38	/* Extract the relevant capability bit. */
39	if (cap >= 32) {
40		if (header.version == _LINUX_CAPABILITY_VERSION_3) {
41			cap_val = data[1].effective;
42		} else {
43			/* Capability beyond 32 is requested but only 32 are supported. */
44			return false;
45		}
46	} else {
47		cap_val = data[0].effective;
48	}
49	return (cap_val & (1 << (cap & 0x1f))) != 0;
50}