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-09-05 20:29:42 +0100
commit8efbbb6ede28a37326b2d0579e3558182bf5cc12 (patch)
tree62beeed286cc72e0c74a37d2bfeeb815fc7c6d7a
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/pull/51 Applied-Upstream: commit:02afb78e2345f5c6fd0891fad554dca13179a0cd Last-Update: 2020-08-31
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/ScanFileOrFolder.cpp18
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/TransferThread.cpp20
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/async/TransferThreadAsync.cpp17
3 files changed, 35 insertions, 20 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
diff --git a/plugins/CopyEngine/Ultracopier-Spec/TransferThread.cpp b/plugins/CopyEngine/Ultracopier-Spec/TransferThread.cpp
index 9cbad5a..d986b49 100755
--- a/plugins/CopyEngine/Ultracopier-Spec/TransferThread.cpp
+++ b/plugins/CopyEngine/Ultracopier-Spec/TransferThread.cpp
@@ -737,8 +737,7 @@ bool TransferThread::mkpath(const INTERNALTYPEPATH &path)
} while(!pathSplit.empty());
return true;
#else
- char pathC[PATH_MAX];
- strcpy(pathC,TransferThread::internalStringTostring(path).c_str());
+ std::string pathC(TransferThread::internalStringTostring(path));
if(!mkdir(path))
if(errno==EEXIST)
return true;
@@ -748,8 +747,7 @@ bool TransferThread::mkpath(const INTERNALTYPEPATH &path)
std::string::size_type previouspos=path.size();
std::string::size_type lastpos=std::string::npos;
- char pathCedit[PATH_MAX];
- strcpy(pathCedit,pathC);
+ std::string pathCedit(pathC);
std::vector<std::string::size_type> pathSplit;
pathSplit.push_back(path.size());
do
@@ -773,14 +771,14 @@ bool TransferThread::mkpath(const INTERNALTYPEPATH &path)
return false;
#endif
- pathCedit[lastpos]='\0';
+ pathCedit.resize(lastpos);
previouspos=lastpos;
errno=0;
#ifdef Q_OS_UNIX
- if(::mkdir(pathCedit, mode)==-1)
+ if(::mkdir(pathCedit.c_str(), mode)==-1)
#else
- if(::mkdir(pathCedit)==-1)
+ if(::mkdir(pathCedit.c_str())==-1)
#endif
if(errno!=EEXIST && errno!=ENOENT)
return false;
@@ -791,14 +789,14 @@ bool TransferThread::mkpath(const INTERNALTYPEPATH &path)
do
{
- strcpy(pathCedit,pathC);
+ pathCedit = pathC;
lastpos=pathSplit.back();
pathSplit.pop_back();
- pathCedit[lastpos]='\0';
+ pathCedit.resize(lastpos);
#ifdef Q_OS_UNIX
- if(::mkdir(pathCedit, mode)==-1)
+ if(::mkdir(pathCedit.c_str(), mode)==-1)
#else
- if(::mkdir(pathCedit)==-1)
+ if(::mkdir(pathCedit.c_str())==-1)
#endif
if(errno!=EEXIST)
return false;
diff --git a/plugins/CopyEngine/Ultracopier-Spec/async/TransferThreadAsync.cpp b/plugins/CopyEngine/Ultracopier-Spec/async/TransferThreadAsync.cpp
index b5af928..b291b21 100755
--- a/plugins/CopyEngine/Ultracopier-Spec/async/TransferThreadAsync.cpp
+++ b/plugins/CopyEngine/Ultracopier-Spec/async/TransferThreadAsync.cpp
@@ -620,9 +620,16 @@ void TransferThreadAsync::ifCanStartTransfer()
return;
}
}
- char buf[PATH_MAX];
- const ssize_t s=readlink(TransferThread::internalStringTostring(source).c_str(),buf,sizeof(buf));
- buf[s]=0x00;
+ std::vector<char> buf(512);
+ ssize_t s=0;
+ do {
+ buf.resize(buf.size()*2);
+ s=readlink(TransferThread::internalStringTostring(source).c_str(),buf.data(),buf.size());
+ } while (s == buf.size());
+ if (s!=-1) {
+ buf.resize(s + 1);
+ buf[s]='\0';
+ }
if(s<0)
{
const int terr=errno;
@@ -638,12 +645,12 @@ void TransferThreadAsync::ifCanStartTransfer()
}
else
{
- if(symlink(buf,TransferThread::internalStringTostring(destination).c_str())!=0)
+ if(symlink(buf.data(),TransferThread::internalStringTostring(destination).c_str())!=0)
{
const int terr=errno;
const std::string &strError=strerror(terr);
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] stop copy in error "+
- buf+"->"+TransferThread::internalStringTostring(destination)+
+ buf.data()+"->"+TransferThread::internalStringTostring(destination)+
" "+strError+"("+std::to_string(terr)+")"
);
readError=true;