@@ -4,14 +4,17 @@ use linux_raw_sys::general::{
44 CLONE_NEWTIME , CLONE_NEWUSER , CLONE_NEWUTS , CLONE_SYSVSEM ,
55} ;
66
7- use crate :: backend:: c:: { c_int, NS_GET_NSTYPE , NS_GET_OWNER_UID , NS_GET_PARENT , NS_GET_USERNS } ;
7+ use crate :: backend:: c:: {
8+ c_int, NS_GET_NSTYPE , NS_GET_OWNER_UID , NS_GET_PARENT , NS_GET_PID_FROM_PIDNS ,
9+ NS_GET_PID_IN_PIDNS , NS_GET_TGID_FROM_PIDNS , NS_GET_TGID_IN_PIDNS , NS_GET_USERNS ,
10+ } ;
811use crate :: backend:: thread:: syscalls;
912use crate :: fd:: BorrowedFd ;
1013use crate :: fd:: { AsFd , FromRawFd , OwnedFd } ;
11- use crate :: io;
14+ use crate :: io:: { self , Errno } ;
1215use crate :: ioctl;
1316
14- use super :: { RawUid , Uid } ;
17+ use super :: { Pid , RawUid , Uid } ;
1518
1619bitflags ! {
1720 /// Namespace type.
@@ -213,7 +216,7 @@ pub fn unshare(flags: UnshareFlags) -> io::Result<()> {
213216///
214217/// # Safety
215218///
216- /// `fd` must refer to a `/proc/pid/ns/*` file.
219+ /// `fd` must refer to a `/proc/{ pid} /ns/*` file.
217220#[ inline]
218221#[ doc( alias = "NS_GET_USERNS" ) ]
219222pub fn ioctl_ns_get_userns < FD : AsFd > ( fd : FD ) -> io:: Result < OwnedFd > {
@@ -228,7 +231,7 @@ pub fn ioctl_ns_get_userns<FD: AsFd>(fd: FD) -> io::Result<OwnedFd> {
228231///
229232/// # Safety
230233///
231- /// `fd` must refer to a `/proc/pid/ns/*` file.
234+ /// `fd` must refer to a `/proc/{ pid} /ns/*` file.
232235#[ inline]
233236#[ doc( alias = "NS_GET_PARENT" ) ]
234237pub fn ioctl_ns_get_parent < FD : AsFd > ( fd : FD ) -> io:: Result < OwnedFd > {
@@ -243,7 +246,7 @@ pub fn ioctl_ns_get_parent<FD: AsFd>(fd: FD) -> io::Result<OwnedFd> {
243246///
244247/// # Safety
245248///
246- /// `fd` must refer to a `/proc/pid/ns/*` file.
249+ /// `fd` must refer to a `/proc/{ pid} /ns/*` file.
247250#[ inline]
248251#[ doc( alias = "NS_GET_NSTYPE" ) ]
249252pub fn ioctl_ns_get_nstype < FD : AsFd > ( fd : FD ) -> io:: Result < NamespaceType > {
@@ -258,7 +261,7 @@ pub fn ioctl_ns_get_nstype<FD: AsFd>(fd: FD) -> io::Result<NamespaceType> {
258261///
259262/// # Safety
260263///
261- /// `fd` must refer to a `/proc/pid/ns/*` file.
264+ /// `fd` must refer to a `/proc/{ pid} /ns/*` file.
262265#[ inline]
263266#[ doc( alias = "NS_GET_OWNER_UID" ) ]
264267pub fn ioctl_ns_get_owner_uid < FD : AsFd > ( fd : FD ) -> io:: Result < Uid > {
@@ -268,3 +271,71 @@ pub fn ioctl_ns_get_owner_uid<FD: AsFd>(fd: FD) -> io::Result<Uid> {
268271 ioctl:: ioctl ( fd, ctl) . map ( Uid :: from_raw)
269272 }
270273}
274+
275+ /// `ioctl(ns_fd, NS_GET_PID_FROM_PIDNS, pid)`
276+ ///
277+ /// # Safety
278+ ///
279+ /// `fd` must refer to a `/proc/{pid}/ns/pid` file.
280+ #[ inline]
281+ #[ doc( alias = "NS_GET_PID_FROM_PIDNS" ) ]
282+ pub fn ioctl_ns_get_pid_from_pidns < FD : AsFd > ( fd : FD , pid : Pid ) -> io:: Result < Pid > {
283+ #[ allow( unsafe_code) ]
284+ unsafe {
285+ let ctl = ioctl:: ParameterizedReturnGetter :: < { NS_GET_PID_FROM_PIDNS } > :: new (
286+ pid. as_raw_pid ( ) as usize ,
287+ ) ;
288+ ioctl:: ioctl ( fd, ctl) . and_then ( |pid| Pid :: from_raw ( pid) . ok_or ( Errno :: INVAL ) )
289+ }
290+ }
291+
292+ /// `ioctl(ns_fd, NS_GET_TGID_FROM_PIDNS, tgid)`
293+ ///
294+ /// # Safety
295+ ///
296+ /// `fd` must refer to a `/proc/{pid}/ns/pid` file.
297+ #[ inline]
298+ #[ doc( alias = "NS_GET_TGID_FROM_PIDNS" ) ]
299+ pub fn ioctl_ns_get_tgid_from_pidns < FD : AsFd > ( fd : FD , tgid : Pid ) -> io:: Result < Pid > {
300+ #[ allow( unsafe_code) ]
301+ unsafe {
302+ let ctl = ioctl:: ParameterizedReturnGetter :: < { NS_GET_TGID_FROM_PIDNS } > :: new (
303+ tgid. as_raw_pid ( ) as usize ,
304+ ) ;
305+ ioctl:: ioctl ( fd, ctl) . and_then ( |tgid| Pid :: from_raw ( tgid) . ok_or ( Errno :: INVAL ) )
306+ }
307+ }
308+
309+ /// `ioctl(ns_fd, NS_GET_PID_IN_PIDNS, pid)`
310+ ///
311+ /// # Safety
312+ ///
313+ /// `fd` must refer to a `/proc/{pid}/ns/pid` file.
314+ #[ inline]
315+ #[ doc( alias = "NS_GET_PID_IN_PIDNS" ) ]
316+ pub fn ioctl_ns_get_pid_in_pidns < FD : AsFd > ( fd : FD , pid : Pid ) -> io:: Result < Pid > {
317+ #[ allow( unsafe_code) ]
318+ unsafe {
319+ let ctl = ioctl:: ParameterizedReturnGetter :: < { NS_GET_PID_IN_PIDNS } > :: new (
320+ pid. as_raw_pid ( ) as usize ,
321+ ) ;
322+ ioctl:: ioctl ( fd, ctl) . and_then ( |pid| Pid :: from_raw ( pid) . ok_or ( Errno :: INVAL ) )
323+ }
324+ }
325+
326+ /// `ioctl(ns_fd, NS_GET_TGID_IN_PIDNS, tgid)`
327+ ///
328+ /// # Safety
329+ ///
330+ /// `fd` must refer to a `/proc/{pid}/ns/pid` file.
331+ #[ inline]
332+ #[ doc( alias = "NS_GET_TGID_IN_PIDNS" ) ]
333+ pub fn ioctl_ns_get_tgid_in_pidns < FD : AsFd > ( fd : FD , tgid : Pid ) -> io:: Result < Pid > {
334+ #[ allow( unsafe_code) ]
335+ unsafe {
336+ let ctl = ioctl:: ParameterizedReturnGetter :: < { NS_GET_TGID_IN_PIDNS } > :: new (
337+ tgid. as_raw_pid ( ) as usize ,
338+ ) ;
339+ ioctl:: ioctl ( fd, ctl) . and_then ( |tgid| Pid :: from_raw ( tgid) . ok_or ( Errno :: INVAL ) )
340+ }
341+ }
0 commit comments