1 // 2 // Copyright (c) 2015-2019 Vinnie Falco (vinnie dot falco at gmail dot com) 3 // 4 // Distributed under the Boost Software License, Version 1.0. (See accompanying 5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6 // 7 // Official repository: https://github.com/boostorg/beast 8 // 9 10 #ifndef BOOST_BEAST_CORE_FILE_POSIX_HPP 11 #define BOOST_BEAST_CORE_FILE_POSIX_HPP 12 13 #include <boost/beast/core/detail/config.hpp> 14 15 #if ! defined(BOOST_BEAST_NO_POSIX_FILE) 16 # if ! defined(__APPLE__) && ! defined(__linux__) 17 # define BOOST_BEAST_NO_POSIX_FILE 18 # endif 19 #endif 20 21 #if ! defined(BOOST_BEAST_USE_POSIX_FILE) 22 # if ! defined(BOOST_BEAST_NO_POSIX_FILE) 23 # define BOOST_BEAST_USE_POSIX_FILE 1 24 # else 25 # define BOOST_BEAST_USE_POSIX_FILE 0 26 # endif 27 #endif 28 29 #if BOOST_BEAST_USE_POSIX_FILE 30 31 #include <boost/beast/core/error.hpp> 32 #include <boost/beast/core/file_base.hpp> 33 #include <cstdint> 34 35 namespace boost { 36 namespace beast { 37 38 /** An implementation of File for POSIX systems. 39 40 This class implements a <em>File</em> using POSIX interfaces. 41 */ 42 class file_posix 43 { 44 int fd_ = -1; 45 46 BOOST_BEAST_DECL 47 static 48 int 49 native_close(int& fd); 50 51 public: 52 /** The type of the underlying file handle. 53 54 This is platform-specific. 55 */ 56 using native_handle_type = int; 57 58 /** Destructor 59 60 If the file is open it is first closed. 61 */ 62 BOOST_BEAST_DECL 63 ~file_posix(); 64 65 /** Constructor 66 67 There is no open file initially. 68 */ 69 file_posix() = default; 70 71 /** Constructor 72 73 The moved-from object behaves as if default constructed. 74 */ 75 BOOST_BEAST_DECL 76 file_posix(file_posix&& other); 77 78 /** Assignment 79 80 The moved-from object behaves as if default constructed. 81 */ 82 BOOST_BEAST_DECL 83 file_posix& operator=(file_posix&& other); 84 85 /// Returns the native handle associated with the file. 86 native_handle_type native_handle() const87 native_handle() const 88 { 89 return fd_; 90 } 91 92 /** Set the native handle associated with the file. 93 94 If the file is open it is first closed. 95 96 @param fd The native file handle to assign. 97 */ 98 BOOST_BEAST_DECL 99 void 100 native_handle(native_handle_type fd); 101 102 /// Returns `true` if the file is open 103 bool is_open() const104 is_open() const 105 { 106 return fd_ != -1; 107 } 108 109 /** Close the file if open 110 111 @param ec Set to the error, if any occurred. 112 */ 113 BOOST_BEAST_DECL 114 void 115 close(error_code& ec); 116 117 /** Open a file at the given path with the specified mode 118 119 @param path The utf-8 encoded path to the file 120 121 @param mode The file mode to use 122 123 @param ec Set to the error, if any occurred 124 */ 125 BOOST_BEAST_DECL 126 void 127 open(char const* path, file_mode mode, error_code& ec); 128 129 /** Return the size of the open file 130 131 @param ec Set to the error, if any occurred 132 133 @return The size in bytes 134 */ 135 BOOST_BEAST_DECL 136 std::uint64_t 137 size(error_code& ec) const; 138 139 /** Return the current position in the open file 140 141 @param ec Set to the error, if any occurred 142 143 @return The offset in bytes from the beginning of the file 144 */ 145 BOOST_BEAST_DECL 146 std::uint64_t 147 pos(error_code& ec) const; 148 149 /** Adjust the current position in the open file 150 151 @param offset The offset in bytes from the beginning of the file 152 153 @param ec Set to the error, if any occurred 154 */ 155 BOOST_BEAST_DECL 156 void 157 seek(std::uint64_t offset, error_code& ec); 158 159 /** Read from the open file 160 161 @param buffer The buffer for storing the result of the read 162 163 @param n The number of bytes to read 164 165 @param ec Set to the error, if any occurred 166 */ 167 BOOST_BEAST_DECL 168 std::size_t 169 read(void* buffer, std::size_t n, error_code& ec) const; 170 171 /** Write to the open file 172 173 @param buffer The buffer holding the data to write 174 175 @param n The number of bytes to write 176 177 @param ec Set to the error, if any occurred 178 */ 179 BOOST_BEAST_DECL 180 std::size_t 181 write(void const* buffer, std::size_t n, error_code& ec); 182 }; 183 184 } // beast 185 } // boost 186 187 #ifdef BOOST_BEAST_HEADER_ONLY 188 #include <boost/beast/core/impl/file_posix.ipp> 189 #endif 190 191 #endif 192 193 #endif 194