Skip to content

Commit

Permalink
tools/power turbostat: Fix 32-bit capabilities warning
Browse files Browse the repository at this point in the history
warning: `turbostat' uses 32-bit capabilities (legacy support in use)

Signed-off-by: Len Brown <[email protected]>
  • Loading branch information
lenb committed Mar 20, 2020
1 parent 1f81c5e commit fcaa681
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 17 deletions.
2 changes: 1 addition & 1 deletion tools/power/x86/turbostat/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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 :
Expand Down
46 changes: 30 additions & 16 deletions tools/power/x86/turbostat/turbostat.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>

Expand Down Expand Up @@ -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)) {
Expand Down

0 comments on commit fcaa681

Please sign in to comment.