summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Preud'homme <robotux@celest.fr>2020-08-31 00:06:58 +0100
committerThomas Preud'homme <robotux@celest.fr>2020-08-31 01:06:59 +0100
commitb19daf042057d7481c7ae7149da7325a0a9da69f (patch)
tree6ce21644c239e5e3cad07301da32feb2bdf96d21
parentac95ce6e0538249e9c395904b49b078234fdcb5e (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-xplugins/CopyEngine/Ultracopier-Spec/ScanFileOrFolder.cpp18
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