diff options
author | Thomas Preud'homme <robotux@celest.fr> | 2020-08-31 00:06:58 +0100 |
---|---|---|
committer | Thomas Preud'homme <robotux@celest.fr> | 2020-08-31 01:06:59 +0100 |
commit | b19daf042057d7481c7ae7149da7325a0a9da69f (patch) | |
tree | 6ce21644c239e5e3cad07301da32feb2bdf96d21 | |
parent | ac95ce6e0538249e9c395904b49b078234fdcb5e (diff) |
Fix requirement for PATH_MAX
POSIX says PATH_MAX *may* be defined and on GNU Hurd it is in fact not
defined. This commit uses dynamic allocation to avoid relying on
PATH_MAX being defined.
Author: Thomas Preud'homme <robotux@debian.org>
Forwarded: https://github.com/alphaonex86/Ultracopier/commit/e3ff2b22acd840ff74e523602540ee1654915c61
Applied-Upstream: commit:807f4e8ac8663eeec4af5d7e86a016a3276388b3
Last-Update: 2020-08-31
-rwxr-xr-x | plugins/CopyEngine/Ultracopier-Spec/ScanFileOrFolder.cpp | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/plugins/CopyEngine/Ultracopier-Spec/ScanFileOrFolder.cpp b/plugins/CopyEngine/Ultracopier-Spec/ScanFileOrFolder.cpp index 014585d..940dddb 100755 --- a/plugins/CopyEngine/Ultracopier-Spec/ScanFileOrFolder.cpp +++ b/plugins/CopyEngine/Ultracopier-Spec/ScanFileOrFolder.cpp @@ -331,9 +331,14 @@ void ScanFileOrFolder::run() INTERNALTYPEPATH ScanFileOrFolder::resolvDestination(const INTERNALTYPEPATH &destination) { INTERNALTYPEPATH temp(destination); - char buf[PATH_MAX]; + std::vector<char> buf(512); ssize_t nbytes=0; - nbytes=readlink(TransferThread::internalStringTostring(destination).c_str(), buf, sizeof(buf)); + do { + buf.resize(buf.size()*2); + nbytes=readlink(TransferThread::internalStringTostring(destination).c_str(), buf.data(), buf.size()); + } while (nbytes == buf.size()); + if (nbytes!=-1) + buf.resize(nbytes); while(nbytes!=-1) { temp=FSabsolutePath(temp); if(!stringEndsWith(destination,'/') @@ -342,14 +347,19 @@ INTERNALTYPEPATH ScanFileOrFolder::resolvDestination(const INTERNALTYPEPATH &des #endif ) temp+=TransferThread::stringToInternalString("/"); - temp+=TransferThread::stringToInternalString(std::string(buf,nbytes)); + temp+=TransferThread::stringToInternalString(std::string(buf.data(), buf.size())); /// \todo change for pure c++ code #ifdef WIDESTRING temp=QFileInfo(QString::fromStdWString(temp)).absoluteFilePath().toStdWString(); #else temp=QFileInfo(QString::fromStdString(temp)).absoluteFilePath().toStdString(); #endif - nbytes=readlink(TransferThread::internalStringTostring(temp).c_str(), buf, sizeof(buf)); + do { + buf.resize(buf.size() * 2); + nbytes=readlink(TransferThread::internalStringTostring(temp).c_str(), buf.data(), buf.size()); + } while (nbytes == buf.size()); + if (nbytes!=-1) + buf.resize(nbytes); } return temp; /*do |