目标:仅当使用O_RDONLY标志调用openat时,才在trace_pipe中写入。我已经构建了结构,以查找此处包含的格式/ sys / kernel / debug / tracing / events / syscalls / sys_enter_open / format
问题,我认为我没有访问flags字段,因为看起来第二个if语句始终为false。 问题:我是否正确访问了标志字段?有没有办法打印标志变量内容?
struct syscalls_enter_openat_args {
__u64 pad;
int __syscall_nr;
const char * filename;
int flags;
unsigned short modep;
};
SEC("tracepoint/syscalls/sys_enter_openat")
int bpf_sys(struct syscalls_enter_openat_args *ctx)
{
char fmt[] = "llo\n";
int flags = ctx->flags;
if (flags){
if (flags == O_RDONLY)
bpf_trace_printk(fmt, sizeof(fmt));
}
return 0;
}
char _license[] SEC("license") = "GPL";
答案 0 :(得分:1)
因此您提到以下检查始终评估为false:
if (flags == O_RDONLY)
这可能是因为通过变量O_RDONLY
传递给openat()
的标志不仅限于flags
。在openat()
手册页上:
参数 flags 必须包含以下访问模式之一:
O_RDONLY
,O_WRONLY
或O_RDWR
。这些请求分别打开文件为只读,只写或读/写。此外,可以在标志中按位-或添加零个或多个文件创建标志和文件状态标志。 文件创建标志为
O_CLOEXEC
,O_CREAT
,O_DIRECTORY
,O_EXCL
,O_NOCTTY
,O_NOFOLLOW
,{{ 1}}和O_TMPFILE
。文件状态标志是下面列出的所有其余标志。这两组标志之间的区别在于,文件创建标志会影响打开操作本身的语义,而文件状态标志会影响后续I / O操作的语义。可以检索和修改文件状态标志(在某些情况下);有关详情,请参见O_TRUNC
。
因此,与其检查您的fcntl(2)
是否等于flags
,不如检查一下它们是否包括标志-这样掩盖它:
O_RDONLY
对于打印if (flags & O_RDONLY)
的值,可能可以通过以下方式进行(未经测试):
flags