/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Copyright 2017-2018 Danny Robson */ #ifndef CRUFT_UTIL_POSIX_FD_HPP #define CRUFT_UTIL_POSIX_FD_HPP #include "../debug.hpp" #include "../view.hpp" #include #include #include namespace cruft::posix { ///------------------------------------------------------------------------ /// A simple RAII wrapper for file descriptors class fd { public: /////////////////////////////////////////////////////////////////////// fd (const std::experimental::filesystem::path &path, int flags); fd (const std::experimental::filesystem::path &path, int flags, mode_t); fd (fd &&) noexcept; fd& operator= (fd &&) noexcept; fd& operator= (int); // The int constructor steals the fd. So don't pass in something that // you don't want closed at destruct time. This should really only be // used when interfacing with results of syscalls that we don't wrap. explicit fd (int); // copy constructors are removed in favour of explicit calls to dup. // This should reduce unexpected or expensive copies as much as // possible; one should not be doing this unless it is absolutely // required. fd (const fd&) = delete; fd dup (void); static fd dup (int); ~fd (); /////////////////////////////////////////////////////////////////////// struct ::stat stat (void) const; /////////////////////////////////////////////////////////////////////// void close (void); void reset (int); void reset (void); int release (void); //--------------------------------------------------------------------- [[nodiscard]] ssize_t read (void *buf, size_t count); [[nodiscard]] ssize_t write (const void *buf, size_t count); //--------------------------------------------------------------------- template [[nodiscard]] ValueT* read (cruft::view dst) { return dst.begin () + read ( &*std::data (dst), std::size (dst) * sizeof (ValueT) ); } //--------------------------------------------------------------------- template [[nodiscard]] auto write (const cruft::view &src) { return const_cast ( write ( cruft::view (src) ) ); } //--------------------------------------------------------------------- template [[nodiscard]] const ValueT* write (const cruft::view &src) { const auto written = write ( &*std::data (src), std::size (src) * sizeof (ValueT) ); CHECK_MOD (written, sizeof (ValueT)); return src.begin () + written / sizeof (ValueT); } //--------------------------------------------------------------------- [[nodiscard]] off_t lseek (off_t offset, int whence); /////////////////////////////////////////////////////////////////////// operator int (void) const; int native (void) const { return m_fd; } private: int m_fd; }; } #endif