| // SPDX-License-Identifier: GPL-2.0 | 
 | #include <test_progs.h> | 
 |  | 
 | void test_task_fd_query_rawtp(void) | 
 | { | 
 | 	const char *file = "./test_get_stack_rawtp.o"; | 
 | 	__u64 probe_offset, probe_addr; | 
 | 	__u32 len, prog_id, fd_type; | 
 | 	struct bpf_object *obj; | 
 | 	int efd, err, prog_fd; | 
 | 	__u32 duration = 0; | 
 | 	char buf[256]; | 
 |  | 
 | 	err = bpf_prog_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd); | 
 | 	if (CHECK(err, "prog_load raw tp", "err %d errno %d\n", err, errno)) | 
 | 		return; | 
 |  | 
 | 	efd = bpf_raw_tracepoint_open("sys_enter", prog_fd); | 
 | 	if (CHECK(efd < 0, "raw_tp_open", "err %d errno %d\n", efd, errno)) | 
 | 		goto close_prog; | 
 |  | 
 | 	/* query (getpid(), efd) */ | 
 | 	len = sizeof(buf); | 
 | 	err = bpf_task_fd_query(getpid(), efd, 0, buf, &len, &prog_id, | 
 | 				&fd_type, &probe_offset, &probe_addr); | 
 | 	if (CHECK(err < 0, "bpf_task_fd_query", "err %d errno %d\n", err, | 
 | 		  errno)) | 
 | 		goto close_prog; | 
 |  | 
 | 	err = fd_type == BPF_FD_TYPE_RAW_TRACEPOINT && | 
 | 	      strcmp(buf, "sys_enter") == 0; | 
 | 	if (CHECK(!err, "check_results", "fd_type %d tp_name %s\n", | 
 | 		  fd_type, buf)) | 
 | 		goto close_prog; | 
 |  | 
 | 	/* test zero len */ | 
 | 	len = 0; | 
 | 	err = bpf_task_fd_query(getpid(), efd, 0, buf, &len, &prog_id, | 
 | 				&fd_type, &probe_offset, &probe_addr); | 
 | 	if (CHECK(err < 0, "bpf_task_fd_query (len = 0)", "err %d errno %d\n", | 
 | 		  err, errno)) | 
 | 		goto close_prog; | 
 | 	err = fd_type == BPF_FD_TYPE_RAW_TRACEPOINT && | 
 | 	      len == strlen("sys_enter"); | 
 | 	if (CHECK(!err, "check_results", "fd_type %d len %u\n", fd_type, len)) | 
 | 		goto close_prog; | 
 |  | 
 | 	/* test empty buffer */ | 
 | 	len = sizeof(buf); | 
 | 	err = bpf_task_fd_query(getpid(), efd, 0, 0, &len, &prog_id, | 
 | 				&fd_type, &probe_offset, &probe_addr); | 
 | 	if (CHECK(err < 0, "bpf_task_fd_query (buf = 0)", "err %d errno %d\n", | 
 | 		  err, errno)) | 
 | 		goto close_prog; | 
 | 	err = fd_type == BPF_FD_TYPE_RAW_TRACEPOINT && | 
 | 	      len == strlen("sys_enter"); | 
 | 	if (CHECK(!err, "check_results", "fd_type %d len %u\n", fd_type, len)) | 
 | 		goto close_prog; | 
 |  | 
 | 	/* test smaller buffer */ | 
 | 	len = 3; | 
 | 	err = bpf_task_fd_query(getpid(), efd, 0, buf, &len, &prog_id, | 
 | 				&fd_type, &probe_offset, &probe_addr); | 
 | 	if (CHECK(err >= 0 || errno != ENOSPC, "bpf_task_fd_query (len = 3)", | 
 | 		  "err %d errno %d\n", err, errno)) | 
 | 		goto close_prog; | 
 | 	err = fd_type == BPF_FD_TYPE_RAW_TRACEPOINT && | 
 | 	      len == strlen("sys_enter") && | 
 | 	      strcmp(buf, "sy") == 0; | 
 | 	if (CHECK(!err, "check_results", "fd_type %d len %u\n", fd_type, len)) | 
 | 		goto close_prog; | 
 |  | 
 | close_prog: | 
 | 	bpf_object__close(obj); | 
 | } |