1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- // Copyright (c) 2016 Klemens D. Morgenstern
- //
- // Distributed under the Boost Software License, Version 1.0. (See accompanying
- // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- #ifndef BOOST_PROCESS_DETAIL_POSIX_FILE_DESCRIPTOR_HPP_
- #define BOOST_PROCESS_DETAIL_POSIX_FILE_DESCRIPTOR_HPP_
- #include <fcntl.h>
- #include <string>
- #include <boost/process/v1/filesystem.hpp>
- #include <boost/core/exchange.hpp>
- namespace boost { namespace process { BOOST_PROCESS_V1_INLINE namespace v1 { namespace detail { namespace posix {
- struct file_descriptor
- {
- enum mode_t
- {
- read = 1,
- write = 2,
- read_write = 3
- };
- file_descriptor() = default;
- explicit file_descriptor(const boost::process::v1::filesystem::path& p, mode_t mode = read_write)
- : file_descriptor(p.native(), mode)
- {
- }
- explicit file_descriptor(const std::string & path , mode_t mode = read_write)
- : file_descriptor(path.c_str(), mode) {}
- explicit file_descriptor(const char* path, mode_t mode = read_write)
- : _handle(create_file(path, mode))
- {
- }
- file_descriptor(const file_descriptor & ) = delete;
- file_descriptor(file_descriptor &&other)
- : _handle(boost::exchange(other._handle, -1))
- {
- }
- file_descriptor& operator=(const file_descriptor & ) = delete;
- file_descriptor& operator=(file_descriptor &&other)
- {
- if (this != &other)
- {
- if (_handle != -1)
- ::close(_handle);
- _handle = boost::exchange(other._handle, -1);
- }
- return *this;
- }
- ~file_descriptor()
- {
- if (_handle != -1)
- ::close(_handle);
- }
- int handle() const { return _handle;}
- private:
- static int create_file(const char* name, mode_t mode )
- {
- switch(mode)
- {
- case read:
- return ::open(name, O_RDONLY);
- case write:
- return ::open(name, O_WRONLY | O_CREAT, 0660);
- case read_write:
- return ::open(name, O_RDWR | O_CREAT, 0660);
- default:
- return -1;
- }
- }
- int _handle = -1;
- };
- }}}}}
- #endif /* BOOST_PROCESS_DETAIL_WINDOWS_FILE_DESCRIPTOR_HPP_ */
|