1 // SPDX-License-Identifier: GPL-2.0-only 2 /* Copyright (c) 2025 Meta Platforms, Inc. and affiliates. */ 3 4 #include <errno.h> 5 #include <fcntl.h> 6 #include <sys/stat.h> 7 #include <string.h> 8 #include <unistd.h> 9 #include <sys/socket.h> 10 #include <test_progs.h> 11 #include "cgroup_helpers.h" 12 13 #include "read_cgroupfs_xattr.skel.h" 14 #include "cgroup_read_xattr.skel.h" 15 16 #define CGROUP_FS_PARENT "foo/" 17 #define CGROUP_FS_CHILD CGROUP_FS_PARENT "bar/" 18 #define TMP_FILE "/tmp/selftests_cgroup_xattr" 19 20 static const char xattr_value_a[] = "bpf_selftest_value_a"; 21 static const char xattr_value_b[] = "bpf_selftest_value_b"; 22 static const char xattr_name[] = "user.bpf_test"; 23 24 static void test_read_cgroup_xattr(void) 25 { 26 int tmp_fd, parent_cgroup_fd = -1, child_cgroup_fd = -1; 27 struct read_cgroupfs_xattr *skel = NULL; 28 29 parent_cgroup_fd = test__join_cgroup(CGROUP_FS_PARENT); 30 if (!ASSERT_OK_FD(parent_cgroup_fd, "create parent cgroup")) 31 return; 32 if (!ASSERT_OK(set_cgroup_xattr(CGROUP_FS_PARENT, xattr_name, xattr_value_a), 33 "set parent xattr")) 34 goto out; 35 36 child_cgroup_fd = test__join_cgroup(CGROUP_FS_CHILD); 37 if (!ASSERT_OK_FD(child_cgroup_fd, "create child cgroup")) 38 goto out; 39 if (!ASSERT_OK(set_cgroup_xattr(CGROUP_FS_CHILD, xattr_name, xattr_value_b), 40 "set child xattr")) 41 goto out; 42 43 skel = read_cgroupfs_xattr__open_and_load(); 44 if (!ASSERT_OK_PTR(skel, "read_cgroupfs_xattr__open_and_load")) 45 goto out; 46 47 skel->bss->target_pid = gettid(); 48 49 if (!ASSERT_OK(read_cgroupfs_xattr__attach(skel), "read_cgroupfs_xattr__attach")) 50 goto out; 51 52 tmp_fd = open(TMP_FILE, O_RDONLY | O_CREAT); 53 ASSERT_OK_FD(tmp_fd, "open tmp file"); 54 close(tmp_fd); 55 56 ASSERT_TRUE(skel->bss->found_value_a, "found_value_a"); 57 ASSERT_TRUE(skel->bss->found_value_b, "found_value_b"); 58 59 out: 60 close(child_cgroup_fd); 61 close(parent_cgroup_fd); 62 read_cgroupfs_xattr__destroy(skel); 63 unlink(TMP_FILE); 64 } 65 66 void test_cgroup_xattr(void) 67 { 68 RUN_TESTS(cgroup_read_xattr); 69 70 if (test__start_subtest("read_cgroupfs_xattr")) 71 test_read_cgroup_xattr(); 72 } 73