]> git.proxmox.com Git - pve-lxc-syscalld.git/blame - src/sys_mknod.rs
Some CStr related changes
[pve-lxc-syscalld.git] / src / sys_mknod.rs
CommitLineData
937921aa 1use std::ffi::CString;
275009ec 2use std::os::unix::io::{AsRawFd, FromRawFd};
937921aa 3
e420f6f9 4use failure::Error;
937921aa
WB
5use nix::errno::Errno;
6use nix::sys::stat;
e420f6f9 7
61bfa355 8use crate::fork::forking_syscall;
e420f6f9 9use crate::lxcseccomp::ProxyMessageBuffer;
275009ec 10use crate::pidfd::PidFd;
c95be5f6 11use crate::syscall::SyscallStatus;
937921aa 12use crate::tools::Fd;
e420f6f9 13
c95be5f6 14pub async fn mknod(msg: &ProxyMessageBuffer) -> Result<SyscallStatus, Error> {
937921aa
WB
15 let pathname = msg.arg_c_string(0)?;
16 let mode = msg.arg_mode_t(1)?;
17 let dev = msg.arg_dev_t(2)?;
18 let cwd = msg.pid_fd().fd_cwd()?;
275009ec
WB
19
20 let pidfd = unsafe { PidFd::from_raw_fd(msg.pid_fd().as_raw_fd()) };
21 do_mknodat(pidfd, cwd, pathname, mode, dev).await
937921aa
WB
22}
23
24pub async fn mknodat(msg: &ProxyMessageBuffer) -> Result<SyscallStatus, Error> {
25 let dirfd = msg.arg_fd(0, libc::O_DIRECTORY)?;
26 let pathname = msg.arg_c_string(1)?;
27 let mode = msg.arg_mode_t(2)?;
28 let dev = msg.arg_dev_t(3)?;
275009ec
WB
29
30 let pidfd = unsafe { PidFd::from_raw_fd(msg.pid_fd().as_raw_fd()) };
31 do_mknodat(pidfd, dirfd, pathname, mode, dev).await
e420f6f9
WB
32}
33
937921aa 34async fn do_mknodat(
275009ec
WB
35 pidfd: PidFd,
36 dirfd: Fd,
937921aa 37 _pathname: CString,
61bfa355 38 _mode: stat::mode_t,
937921aa
WB
39 _dev: stat::dev_t,
40) -> Result<SyscallStatus, Error> {
41 println!("=> Responding with ENOENT");
61bfa355 42 Ok(forking_syscall(move || {
275009ec
WB
43 pidfd.mount_namespace()?.setns()?;
44 std::mem::drop(pidfd);
45 std::mem::drop(dirfd);
46 Ok(SyscallStatus::Err(libc::ENOENT))
47 })
48 .await?)
e420f6f9 49}