在目录上调用foo.setDefaultRenderer(Integer.class, new FooRenderer());
foo.setDefaultRenderer(Short.class,new FooRenderer());
foo.setDefaultRenderer(String.class, new FooRenderer());
foo.setDefaultRenderer(Object.class, new FooRenderer());
之前,如果调用者不拥有该目录,我想测试调用者是否具有chmod()
能力。
从搜索开始,我似乎应该可以通过调用CAP_FOWNER
来测试CAP_FOWNER
功能 - 但capable(CAP_FOWNER)
不在我的手册页中,似乎不是由capable()
导出。
<linux/capability.h>
的正确包含文件是什么,或者,测试Linux功能的最简单/最佳方法是什么?
答案 0 :(得分:1)
我认为capable()
在内核源代码中可用,但不适用于一般用途。如果您正在编写设备驱动程序或模块,那么它应该可用。
如果您正在编写用户空间程序,那么您可以使用libcap
提供的功能;见man capabilites
和man libcap
。我建议#include <sys/capability.h>
并使用cap_get_proc()
,可能CAP_IS_SUPPORTED(CAP_FOWNER)
。
如果这没有用,那么显而易见的解决方法是在目录上尝试chmod()
并处理可能的失败。
答案 1 :(得分:1)
在目录上调用chmod()之前,...我想测试调用者是否具有CAP_FOWNER功能。
你有理由在申请方面这样做吗?如果进程调用chmod()
(或任何其他系统调用),内核将在任何情况下检查是否允许进程执行该操作,如果没有,则返回EPERM
或EACCES
。在应用程序端检测这是一个非常简单的测试,以及应用程序在任何情况下都需要做的事情,因为应用程序可能不知道内核完成的所有访问控制。 (想想,例如SELinux。)
一般来说,首先测试听起来很像Time of check to time of use问题。使用非特权进程并不是问题,但如果您的进程代表另一个用户执行某些操作(进程实际权限高于它想要授予用户的权限),它很快就会成为一个。