1 // Copyright (c) 2016 Klemens D. Morgenstern 2 // 3 // Distributed under the Boost Software License, Version 1.0. (See accompanying 4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 5 6 #ifndef BOOST_PROCESS_DETAIL_POSIX_FILE_DESCRIPTOR_HPP_ 7 #define BOOST_PROCESS_DETAIL_POSIX_FILE_DESCRIPTOR_HPP_ 8 9 #include <fcntl.h> 10 #include <string> 11 #include <boost/filesystem/path.hpp> 12 13 namespace boost { namespace process { namespace detail { namespace posix { 14 15 struct file_descriptor 16 { 17 enum mode_t 18 { 19 read = 1, 20 write = 2, 21 read_write = 3 22 }; 23 24 25 file_descriptor() = default; file_descriptorboost::process::detail::posix::file_descriptor26 explicit file_descriptor(const boost::filesystem::path& p, mode_t mode = read_write) 27 : file_descriptor(p.native(), mode) 28 { 29 } 30 file_descriptorboost::process::detail::posix::file_descriptor31 explicit file_descriptor(const std::string & path , mode_t mode = read_write) 32 : file_descriptor(path.c_str(), mode) {} 33 34 file_descriptorboost::process::detail::posix::file_descriptor35 explicit file_descriptor(const char* path, mode_t mode = read_write) 36 : _handle(create_file(path, mode)) 37 { 38 39 } 40 41 file_descriptor(const file_descriptor & ) = delete; 42 file_descriptor(file_descriptor && ) = default; 43 44 file_descriptor& operator=(const file_descriptor & ) = delete; 45 file_descriptor& operator=(file_descriptor && ) = default; 46 ~file_descriptorboost::process::detail::posix::file_descriptor47 ~file_descriptor() 48 { 49 if (_handle != -1) 50 ::close(_handle); 51 } 52 handleboost::process::detail::posix::file_descriptor53 int handle() const { return _handle;} 54 55 private: create_fileboost::process::detail::posix::file_descriptor56 static int create_file(const char* name, mode_t mode ) 57 { 58 switch(mode) 59 { 60 case read: 61 return ::open(name, O_RDONLY); 62 case write: 63 return ::open(name, O_WRONLY | O_CREAT, 0660); 64 case read_write: 65 return ::open(name, O_RDWR | O_CREAT, 0660); 66 default: 67 return -1; 68 } 69 } 70 71 int _handle = -1; 72 }; 73 74 }}}} 75 76 #endif /* BOOST_PROCESS_DETAIL_WINDOWS_FILE_DESCRIPTOR_HPP_ */ 77