Branch data Line data Source code
1 : : // Copyright (c) 2015-2022 The Bitcoin Core developers
2 : : // Copyright (c) 2017 The Zcash developers
3 : : // Distributed under the MIT software license, see the accompanying
4 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 : :
6 : : #include <util/readwritefile.h>
7 : :
8 : : #include <util/fs.h>
9 : :
10 : : #include <algorithm>
11 : : #include <cstdio>
12 : : #include <limits>
13 : : #include <string>
14 : : #include <utility>
15 : :
16 : 14 : std::pair<bool,std::string> ReadBinaryFile(const fs::path &filename, size_t maxsize)
17 : : {
18 : 14 : FILE *f = fsbridge::fopen(filename, "rb");
19 [ + + ]: 14 : if (f == nullptr)
20 : 3 : return std::make_pair(false,"");
21 : 11 : std::string retval;
22 : 43 : char buffer[128];
23 : 43 : do {
24 [ + + - + ]: 85 : const size_t n = fread(buffer, 1, std::min(sizeof(buffer), maxsize - retval.size()), f);
25 : : // Check for reading errors so we don't return any data if we couldn't
26 : : // read the entire file (or up to maxsize)
27 [ - + ]: 43 : if (ferror(f)) {
28 [ # # ]: 0 : fclose(f);
29 [ # # ]: 0 : return std::make_pair(false,"");
30 : : }
31 [ + - ]: 43 : retval.append(buffer, buffer+n);
32 [ + + + + : 44 : } while (!feof(f) && retval.size() < maxsize);
+ + ]
33 [ + - ]: 11 : fclose(f);
34 [ + - ]: 22 : return std::make_pair(true,retval);
35 : 11 : }
36 : :
37 : 8 : bool WriteBinaryFile(const fs::path &filename, const std::string &data)
38 : : {
39 : 8 : FILE *f = fsbridge::fopen(filename, "wb");
40 [ + - ]: 8 : if (f == nullptr)
41 : : return false;
42 [ - + ]: 8 : if (fwrite(data.data(), 1, data.size(), f) != data.size()) {
43 : 0 : fclose(f);
44 : 0 : return false;
45 : : }
46 [ - + ]: 8 : if (fclose(f) != 0) {
47 : 0 : return false;
48 : : }
49 : : return true;
50 : : }
|