From a681a89db6cad7d6316898f9f6644de38f9bc9c2 Mon Sep 17 00:00:00 2001 From: niikonst <niikonst@blogin5.usr.hlrn.de> Date: Fri, 12 May 2023 15:17:11 +0200 Subject: [PATCH] fix UbSystem::makeDirectory() for Linux --- src/basics/utilities/UbFileOutputBinary.cpp | 2 +- src/basics/utilities/UbSystem.h | 33 ++++++++------------- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/src/basics/utilities/UbFileOutputBinary.cpp b/src/basics/utilities/UbFileOutputBinary.cpp index ce9fca58f..9b3ef2d26 100644 --- a/src/basics/utilities/UbFileOutputBinary.cpp +++ b/src/basics/utilities/UbFileOutputBinary.cpp @@ -68,7 +68,7 @@ UbFileOutputBinary::UbFileOutputBinary(const string &filename, UbFileOutput::CRE string path = UbSystem::getPathFromString(filename); if (path.size() > 0) { outfile.clear(); // flags ruecksetzen (ansonsten liefert utern if(!outfile) weiterhin true!!! - UbSystem::makeDirectory(path, 20); + UbSystem::makeDirectory(path); this->open(filename, opt); } diff --git a/src/basics/utilities/UbSystem.h b/src/basics/utilities/UbSystem.h index 0436a360c..ea25c4166 100644 --- a/src/basics/utilities/UbSystem.h +++ b/src/basics/utilities/UbSystem.h @@ -276,24 +276,26 @@ inline bool isDirectory(const std::string &dir, const unsigned & /*attemptions*/ #if defined(CAB_BOOST) static boost::mutex mtx_makeDirectory; #endif -inline bool makeDirectory(const std::string &dir, const unsigned &attemptions = 3) +inline bool makeDirectory(const std::string &dir) { - UBLOG(logDEBUG5, "UbSystem::makeDirectory - start, dir=" << dir << " #attemptions=" << attemptions); + UBLOG(logDEBUG5, "UbSystem::makeDirectory - start, dir=" << dir); if (dir.empty()) UB_THROW(UbException(UB_EXARGS, "dir is empty")); std::string path = UbSystem::replaceInString(dir, "\\", "/"); bool dirCreated = true; -#if defined UBSYSTEM_WINDOWS + if (path[path.size() - 1] != '/') path += "/"; size_t pos = 0; + while ((pos = path.find("/", pos + 1)) != std::string::npos) { std::string tmpdir = path.substr(0, pos); #if defined(CAB_BOOST) boost::mutex::scoped_lock lock(mtx_makeDirectory); #endif +#if defined UBSYSTEM_WINDOWS if ( #ifndef _UNICODE _access(tmpdir.c_str(), 0) == -1 && _mkdir(tmpdir.c_str()) == -1 @@ -301,34 +303,23 @@ inline bool makeDirectory(const std::string &dir, const unsigned &attemptions = _waccess(tmpdir.c_str(), 0) == -1 && _wmkdir(tmpdir.c_str()) == -1 #endif ) { - UBLOG(logDEBUG5, "UbSystem::makeDirectory- dir=\"" << tmpdir << "\" doesn't exit or makedir failed"); + UBLOG(logDEBUG5, "UbSystem::makeDirectory - dir=\"" << tmpdir << "\" - doesn't exist or makedir failed"); dirCreated = false; break; } - } #elif defined(UBSYSTEM_LINUX) || defined(UBSYSTEM_APPLE) || defined(UBSYSTEM_AIX) - std::string command = "mkdir -p \"" + path + "\""; - { -#if defined(CAB_BOOST) - boost::mutex::scoped_lock lock(mtx_makeDirectory); -#endif - if (system(command.c_str()) != 0) { - UBLOG(logDEBUG5, "UbSystem::makeDirectory- dir=\"" << path << "\" doesn't exit or makedir failed"); + int status = mkdir(tmpdir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); + if (status == 0) { + UBLOG(logDEBUG5,"UbSystem::makeDirectory - dir=\"" << tmpdir << " - directory created successfully."); + dirCreated = true; + } else { + UBLOG(logDEBUG5,"UbSystem::makeDirectory - dir=\"" << tmpdir << " - mkdir() failed" << " ERROR: " << strerror(errno)); dirCreated = false; } - } #else #error "UbSystem::makeDirectory - UnknownMachine" #endif - - if (!dirCreated && attemptions > 1) { - UBLOG(logDEBUG5, "UbSystem::makeDirectory - internal call of UbSystem::makeDirectory"); - UbSystem::sleepMs(500); - dirCreated = UbSystem::makeDirectory(path, attemptions - 1); } - - UBLOG(logDEBUG5, - "UbSystem::makeDirectory - end (success=" << dirCreated << ", attemptions = " << attemptions << ")"); return dirCreated; } /*==========================================================*/ -- GitLab