syscall.rs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. use system_error::SystemError;
  2. use crate::{
  3. process::{fork::CloneFlags, ProcessManager},
  4. syscall::Syscall,
  5. };
  6. use super::namespace::{
  7. check_unshare_flags, commit_nsset, prepare_nsset, unshare_nsproxy_namespaces,
  8. };
  9. impl Syscall {
  10. pub fn sys_unshare(mut unshare_flags: u64) -> Result<usize, SystemError> {
  11. if unshare_flags & CloneFlags::CLONE_NEWUSER.bits() != 0 {
  12. unshare_flags |= CloneFlags::CLONE_THREAD.bits() | CloneFlags::CLONE_FS.bits();
  13. }
  14. if unshare_flags & CloneFlags::CLONE_VM.bits() != 0 {
  15. unshare_flags |= CloneFlags::CLONE_SIGHAND.bits();
  16. }
  17. if unshare_flags & CloneFlags::CLONE_SIGHAND.bits() != 0 {
  18. unshare_flags |= CloneFlags::CLONE_THREAD.bits();
  19. }
  20. if unshare_flags & CloneFlags::CLONE_NEWNS.bits() != 0 {
  21. unshare_flags |= CloneFlags::CLONE_FS.bits();
  22. }
  23. let check = check_unshare_flags(unshare_flags)?;
  24. let current = ProcessManager::current_pcb();
  25. if let Some(nsproxy) = unshare_nsproxy_namespaces(unshare_flags)? {
  26. *current.get_nsproxy().write() = nsproxy;
  27. }
  28. Ok(check)
  29. }
  30. #[allow(dead_code)]
  31. pub fn sys_setns(_fd: i32, flags: u64) -> Result<usize, SystemError> {
  32. let check = check_unshare_flags(flags)?;
  33. let nsset = prepare_nsset(flags)?;
  34. if check == 0 {
  35. commit_nsset(nsset)
  36. };
  37. Ok(0)
  38. }
  39. }