Commit fcaa681c authored by Len Brown's avatar Len Brown
Browse files

tools/power turbostat: Fix 32-bit capabilities warning



warning: `turbostat' uses 32-bit capabilities (legacy support in use)

Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 1f81c5ef
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@ override CFLAGS += -D_FORTIFY_SOURCE=2

%: %.c
	@mkdir -p $(BUILD_OUTPUT)
	$(CC) $(CFLAGS) $< -o $(BUILD_OUTPUT)/$@ $(LDFLAGS)
	$(CC) $(CFLAGS) $< -o $(BUILD_OUTPUT)/$@ $(LDFLAGS) -lcap

.PHONY : clean
clean :
+30 −16
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@
#include <sched.h>
#include <time.h>
#include <cpuid.h>
#include <linux/capability.h>
#include <sys/capability.h>
#include <errno.h>
#include <math.h>

@@ -3150,28 +3150,42 @@ void check_dev_msr()
			err(-5, "no /dev/cpu/0/msr, Try \"# modprobe msr\" ");
}

void check_permissions()
/*
 * check for CAP_SYS_RAWIO
 * return 0 on success
 * return 1 on fail
 */
int check_for_cap_sys_rawio(void)
{
	struct __user_cap_header_struct cap_header_data;
	cap_user_header_t cap_header = &cap_header_data;
	struct __user_cap_data_struct cap_data_data;
	cap_user_data_t cap_data = &cap_data_data;
	extern int capget(cap_user_header_t hdrp, cap_user_data_t datap);
	int do_exit = 0;
	char pathname[32];
	cap_t caps;
	cap_flag_value_t cap_flag_value;

	/* check for CAP_SYS_RAWIO */
	cap_header->pid = getpid();
	cap_header->version = _LINUX_CAPABILITY_VERSION;
	if (capget(cap_header, cap_data) < 0)
		err(-6, "capget(2) failed");
	caps = cap_get_proc();
	if (caps == NULL)
		err(-6, "cap_get_proc\n");

	if ((cap_data->effective & (1 << CAP_SYS_RAWIO)) == 0) {
		do_exit++;
	if (cap_get_flag(caps, CAP_SYS_RAWIO, CAP_EFFECTIVE, &cap_flag_value))
		err(-6, "cap_get\n");

	if (cap_flag_value != CAP_SET) {
		warnx("capget(CAP_SYS_RAWIO) failed,"
			" try \"# setcap cap_sys_rawio=ep %s\"", progname);
		return 1;
	}

	if (cap_free(caps) == -1)
		err(-6, "cap_free\n");

	return 0;
}
void check_permissions(void)
{
	int do_exit = 0;
	char pathname[32];

	/* check for CAP_SYS_RAWIO */
	do_exit += check_for_cap_sys_rawio();

	/* test file permissions */
	sprintf(pathname, "/dev/cpu/%d/msr", base_cpu);
	if (euidaccess(pathname, R_OK)) {