| #include <unistd.h> | 
 |  | 
 | #include <stdplus/fd/dupable.hpp> | 
 | #include <stdplus/fd/managed.hpp> | 
 | #include <stdplus/fd/ops.hpp> | 
 | #include <stdplus/util/cexec.hpp> | 
 |  | 
 | #include <utility> | 
 |  | 
 | namespace stdplus | 
 | { | 
 | namespace fd | 
 | { | 
 | namespace detail | 
 | { | 
 |  | 
 | void drop(int&& fd) | 
 | { | 
 |     CHECK_ERRNO(close(fd), "close"); | 
 | } | 
 |  | 
 | } // namespace detail | 
 |  | 
 | ManagedFd::ManagedFd() noexcept : handle(std::nullopt) {} | 
 |  | 
 | ManagedFd::ManagedFd(int&& fd) : handle(std::move(fd)) | 
 | { | 
 |     fd::setFdFlags(*this, fd::getFdFlags(*this).set(fd::FdFlag::CloseOnExec)); | 
 | } | 
 |  | 
 | ManagedFd::ManagedFd(DupableFd&& other) noexcept : | 
 |     handle(static_cast<detail::ManagedFdHandle&&>(other.handle)) | 
 | {} | 
 |  | 
 | ManagedFd::ManagedFd(const DupableFd& other) : ManagedFd(DupableFd(other)) {} | 
 |  | 
 | ManagedFd& ManagedFd::operator=(DupableFd&& other) noexcept | 
 | { | 
 |     handle = static_cast<detail::ManagedFdHandle&&>(other.handle); | 
 |     return *this; | 
 | } | 
 |  | 
 | ManagedFd& ManagedFd::operator=(const DupableFd& other) | 
 | { | 
 |     return *this = DupableFd(other); | 
 | } | 
 |  | 
 | int ManagedFd::release() | 
 | { | 
 |     return handle.release(); | 
 | } | 
 |  | 
 | int ManagedFd::get() const | 
 | { | 
 |     return handle.value(); | 
 | } | 
 |  | 
 | ManagedFd::operator bool() const noexcept | 
 | { | 
 |     return static_cast<bool>(handle); | 
 | } | 
 |  | 
 | } // namespace fd | 
 | } // namespace stdplus |