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