dup2.cpp 756 B

1234567891011121314151617181920212223242526272829
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/FileSystem/FileDescription.h>
  7. #include <Kernel/Process.h>
  8. namespace Kernel {
  9. KResultOr<FlatPtr> Process::sys$dup2(int old_fd, int new_fd)
  10. {
  11. VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this);
  12. REQUIRE_PROMISE(stdio);
  13. auto description = fds().file_description(old_fd);
  14. if (!description)
  15. return EBADF;
  16. if (old_fd == new_fd)
  17. return new_fd;
  18. if (new_fd < 0 || static_cast<size_t>(new_fd) >= fds().max_open())
  19. return EINVAL;
  20. if (!m_fds.m_fds_metadatas[new_fd].is_allocated())
  21. m_fds.m_fds_metadatas[new_fd].allocate();
  22. m_fds[new_fd].set(*description);
  23. return new_fd;
  24. }
  25. }