linux capability编译报错

麦田的守望者1234 2016-05-23 10:46:16
我最近刚开始研究linux capability机制,这是网上一段代码,编译时报错
test3.c: 在函数‘listCaps’中:
test3.c:18:3: 错误: 未知的类型名‘cap_t’
test3.c:21:10: 警告: 格式 ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int’ [-Wformat]
test3.c: 在函数‘main’中:
test3.c:35:3: 错误: 未知的类型名‘cap_t’
test3.c:38:3: 错误: 未知的类型名‘cap_value_t’
test3.c:41:22: 错误: ‘CAP_EFFECTIVE’未声明(在此函数内第一次使用)
test3.c:41:22: 附注: 每个未声明的标识符在其出现的函数内只报告一次
test3.c:41:56: 错误: ‘CAP_SET’未声明(在此函数内第一次使用)
test3.c:42:22: 错误: ‘CAP_INHERITABLE’未声明(在此函数内第一次使用

关键是这些变量声明在哪个头文件里,请各位大神帮忙
如下为源代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#undef _POSIX_SOURCE
#include <linux/capability.h>

extern int errno;

void whoami(void)
{
printf("uid=%i euid=%i gid=%i\n", getuid(), geteuid(), getgid());
}

void listCaps()
{
cap_t caps = cap_get_proc();
ssize_t y = 0;
printf("The process %d was give capabilities %s\n",
(int) getpid(), cap_to_text(caps, &y));
fflush(0);
cap_free(caps);
}

int main(int argc, char **argv)
{
int stat;
whoami();
stat = setuid(geteuid());
pid_t parentPid = getpid();

if(!parentPid)
return 1;
cap_t caps = cap_init();


cap_value_t capList[5] =
{ CAP_NET_RAW, CAP_NET_BIND_SERVICE , CAP_SETUID, CAP_SETGID,CAP_SETPCAP } ;
unsigned num_caps = 5;
cap_set_flag(caps, CAP_EFFECTIVE, num_caps, capList, CAP_SET);
cap_set_flag(caps, CAP_INHERITABLE, num_caps, capList, CAP_SET);
cap_set_flag(caps, CAP_PERMITTED, num_caps, capList, CAP_SET);

if (cap_set_proc(caps)) {
perror("capset()");

return EXIT_FAILURE;
}
listCaps();

printf("dropping caps\n");
cap_clear(caps); // resetting caps storage

if (cap_set_proc(caps)) {
perror("capset()");
return EXIT_FAILURE;
}
listCaps();

cap_free(caps);
return 0;

}
...全文
231 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
小二linux 2018-03-06
  • 打赏
  • 举报
回复
我的也是 你是少安装包了。这是我的libcap-devel-2.16-5.5.el6.x86_64 你可以yum安装 yum install libcap-devel
huan050113 2016-10-13
  • 打赏
  • 举报
回复
在〈sys/capability.h〉里
nightkids_008 2016-05-27
  • 打赏
  • 举报
回复
如果是 configure生成的makefile 在configure的时候带上 CFLAGS=“-g -O2 -Wall”等 把原先的-Wformat -Werror都去掉 如果是子目录里的,修改config.status文件重新成成libtool来编译。 我是编译其他开源软件遇到时的解决方案希望对你有用。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧