def test_sk_tcpstate(self): with create_socket() as sock: task = find_task(self.prog, os.getpid()) file = fget(task, sock.fileno()) sk = cast("struct socket *", file.private_data).sk self.assertEqual(sk_tcpstate(sk), self.prog["TCP_CLOSE"]) sock.bind(("localhost", 0)) sock.listen() self.assertEqual(sk_tcpstate(sk), self.prog["TCP_LISTEN"]) with socket.create_connection( sock.getsockname()), sock.accept()[0] as sock2: file = fget(task, sock2.fileno()) sk = cast("struct socket *", file.private_data).sk self.assertEqual(sk_tcpstate(sk), self.prog["TCP_ESTABLISHED"])
def get_net_ns_by_fd(task: Object, fd: IntegerLike) -> Object: """ Get a network namespace from a task and a file descriptor referring to a network namespace NSFS inode, e.g. ``/proc/$PID/ns/net`` or ``/var/run/netns/$NAME``. :param task: ``struct task_struct *`` :param fd: File descriptor. :return: ``struct net *`` :raises ValueError: If *fd* does not refer to a network namespace inode """ return get_net_ns_by_inode(fget(task, fd).f_inode)
def test_sk_fullsock(self): with create_socket() as sock: file = fget(find_task(self.prog, os.getpid()), sock.fileno()) sk = cast("struct socket *", file.private_data).sk.read_() self.assertTrue(sk_fullsock(sk))
def test_kernfs_path(self): with open("/sys/kernel/vmcoreinfo", "r") as f: file = fget(find_task(self.prog, os.getpid()), f.fileno()) kn = cast("struct kernfs_node *", file.f_inode.i_private) self.assertEqual(kernfs_path(kn), b"/kernel/vmcoreinfo")
def _call_one(self, obj: drgn.Object) -> Iterable[drgn.Object]: for fd in self.args.fd: yield drgn_fs.fget(obj, fd)
def test_fget(self): with tempfile.NamedTemporaryFile(prefix="drgn-tests-") as f: file = fget(find_task(self.prog, os.getpid()), f.fileno()) self.assertEqual(d_path(file.f_path), os.fsencode(os.path.abspath(f.name)))