2 // Copyright (c) 2015-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
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)
7 // Official repository: https://github.com/boostorg/beast
10 #ifndef BOOST_BEAST_CORE_IMPL_FILE_STDIO_IPP
11 #define BOOST_BEAST_CORE_IMPL_FILE_STDIO_IPP
13 #include <boost/beast/core/file_stdio.hpp>
14 #include <boost/config/workaround.hpp>
15 #include <boost/core/exchange.hpp>
29 file_stdio(file_stdio&& other)
30 : f_(boost::exchange(other.f_, nullptr))
36 operator=(file_stdio&& other)
49 native_handle(FILE* f)
62 int failed = fclose(f_);
66 ec.assign(errno, generic_category());
75 open(char const* path, file_mode mode, error_code& ec)
98 case file_mode::write:
102 case file_mode::write_new:
104 #if BOOST_WORKAROUND(BOOST_MSVC, < 1910)
106 auto const ev = ::fopen_s(&f0, path, "rb");
110 ec = make_error_code(errc::file_exists);
114 errc::no_such_file_or_directory)
116 ec.assign(ev, generic_category());
127 case file_mode::write_existing:
131 case file_mode::append:
135 case file_mode::append_existing:
140 ::fopen_s(&f0, path, "rb+");
143 ec.assign(ev, generic_category());
148 std::fopen(path, "rb+");
151 ec.assign(errno, generic_category());
162 auto const ev = ::fopen_s(&f_, path, s);
166 ec.assign(ev, generic_category());
170 f_ = std::fopen(path, s);
173 ec.assign(errno, generic_category());
182 size(error_code& ec) const
186 ec = make_error_code(errc::bad_file_descriptor);
189 long pos = std::ftell(f_);
192 ec.assign(errno, generic_category());
195 int result = std::fseek(f_, 0, SEEK_END);
198 ec.assign(errno, generic_category());
201 long size = std::ftell(f_);
204 ec.assign(errno, generic_category());
205 std::fseek(f_, pos, SEEK_SET);
208 result = std::fseek(f_, pos, SEEK_SET);
210 ec.assign(errno, generic_category());
218 pos(error_code& ec) const
222 ec = make_error_code(errc::bad_file_descriptor);
225 long pos = std::ftell(f_);
228 ec.assign(errno, generic_category());
237 seek(std::uint64_t offset, error_code& ec)
241 ec = make_error_code(errc::bad_file_descriptor);
244 if(offset > static_cast<std::uint64_t>(std::numeric_limits<long>::max()))
246 ec = make_error_code(errc::invalid_seek);
249 int result = std::fseek(f_,
250 static_cast<long>(offset), SEEK_SET);
252 ec.assign(errno, generic_category());
259 read(void* buffer, std::size_t n, error_code& ec) const
263 ec = make_error_code(errc::bad_file_descriptor);
266 auto nread = std::fread(buffer, 1, n, f_);
269 ec.assign(errno, generic_category());
277 write(void const* buffer, std::size_t n, error_code& ec)
281 ec = make_error_code(errc::bad_file_descriptor);
284 auto nwritten = std::fwrite(buffer, 1, n, f_);
287 ec.assign(errno, generic_category());