diff options
| -rw-r--r-- | src/common/file_util.cpp | 38 | 
1 files changed, 14 insertions, 24 deletions
| diff --git a/src/common/file_util.cpp b/src/common/file_util.cpp index d8163a4a8..819ffd6ff 100644 --- a/src/common/file_util.cpp +++ b/src/common/file_util.cpp @@ -2,6 +2,8 @@  // Licensed under GPLv2 or any later version  // Refer to the license.txt file included. +#include <array> +#include <memory>  #include <sstream>  #include <unordered_map>  #include "common/assert.h" @@ -275,14 +277,10 @@ bool Copy(const std::string& srcFilename, const std::string& destFilename) {                GetLastErrorMsg());      return false;  #else - -// buffer size -#define BSIZE 1024 - -    char buffer[BSIZE]; +    using CFilePointer = std::unique_ptr<FILE, decltype(&std::fclose)>;      // Open input file -    FILE* input = fopen(srcFilename.c_str(), "rb"); +    CFilePointer input{fopen(srcFilename.c_str(), "rb"), std::fclose};      if (!input) {          LOG_ERROR(Common_Filesystem, "opening input failed {} --> {}: {}", srcFilename,                    destFilename, GetLastErrorMsg()); @@ -290,44 +288,36 @@ bool Copy(const std::string& srcFilename, const std::string& destFilename) {      }      // open output file -    FILE* output = fopen(destFilename.c_str(), "wb"); +    CFilePointer output{fopen(destFilename.c_str(), "wb"), std::fclose};      if (!output) { -        fclose(input);          LOG_ERROR(Common_Filesystem, "opening output failed {} --> {}: {}", srcFilename,                    destFilename, GetLastErrorMsg());          return false;      }      // copy loop -    while (!feof(input)) { +    std::array<char, 1024> buffer; +    while (!feof(input.get())) {          // read input -        size_t rnum = fread(buffer, sizeof(char), BSIZE, input); -        if (rnum != BSIZE) { -            if (ferror(input) != 0) { +        size_t rnum = fread(buffer.data(), sizeof(char), buffer.size(), input.get()); +        if (rnum != buffer.size()) { +            if (ferror(input.get()) != 0) {                  LOG_ERROR(Common_Filesystem, "failed reading from source, {} --> {}: {}",                            srcFilename, destFilename, GetLastErrorMsg()); -                goto bail; +                return false;              }          }          // write output -        size_t wnum = fwrite(buffer, sizeof(char), rnum, output); +        size_t wnum = fwrite(buffer.data(), sizeof(char), rnum, output.get());          if (wnum != rnum) {              LOG_ERROR(Common_Filesystem, "failed writing to output, {} --> {}: {}", srcFilename,                        destFilename, GetLastErrorMsg()); -            goto bail; +            return false;          }      } -    // close files -    fclose(input); -    fclose(output); +      return true; -bail: -    if (input) -        fclose(input); -    if (output) -        fclose(output); -    return false;  #endif  } | 
