def for_each_pid(prog_or_ns): """ .. c:function:: for_each_pid(struct pid_namespace *ns) Iterate over all of the PIDs in the given namespace. If given a :class:`Program` instead, the initial PID namespace is used. :return: Iterator of ``struct pid *`` objects. """ if isinstance(prog_or_ns, Program): prog = prog_or_ns ns = prog_or_ns['init_pid_ns'].address_of_() else: prog = prog_or_ns.prog_ ns = prog_or_ns if hasattr(ns, 'idr'): for nr, entry in idr_for_each(ns.idr): yield cast('struct pid *', entry) else: pid_hash = prog['pid_hash'] for i in range(1 << prog['pidhash_shift'].value_()): for upid in hlist_for_each_entry('struct upid', pid_hash[i].address_of_(), 'pid_chain'): if upid.ns == ns: yield container_of(upid, 'struct pid', f'numbers[{int(ns.level)}]')
def for_each_pid(prog_or_ns: Union[Program, Object]) -> Iterator[Object]: """ Iterate over all PIDs in a namespace. :param prog_or_ns: ``struct pid_namespace *`` to iterate over, or :class:`Program` to iterate over initial PID namespace. :return: Iterator of ``struct pid *`` objects. """ if isinstance(prog_or_ns, Program): prog = prog_or_ns ns = prog_or_ns["init_pid_ns"].address_of_() else: prog = prog_or_ns.prog_ ns = prog_or_ns if hasattr(ns, "idr"): for nr, entry in idr_for_each(ns.idr): yield cast("struct pid *", entry) else: pid_hash = prog["pid_hash"] for i in range(1 << prog["pidhash_shift"].value_()): for upid in hlist_for_each_entry("struct upid", pid_hash[i].address_of_(), "pid_chain"): if upid.ns == ns: yield container_of(upid, "struct pid", f"numbers[{int(ns.level)}]")
def bpf_prog_for_each(prog: Program) -> Iterator[Object]: """ Iterate over all BPF programs. :return: Iterator of ``struct bpf_prog *`` objects. """ for nr, entry in idr_for_each(prog["prog_idr"]): yield cast("struct bpf_prog *", entry)
def bpf_prog_for_each(prog): """ .. c:function:: bpf_prog_for_each(prog) Iterate over all bpf programs. :return: Iterator of ``struct bpf_prog *`` objects. """ for nr, entry in idr_for_each(prog["prog_idr"]): yield cast("struct bpf_prog *", entry)