From 219c7bdcb16cd1dfe2e72befa4334c5b8147e1d7 Mon Sep 17 00:00:00 2001 From: KWSys Upstream Date: Mon, 16 Jan 2017 08:53:56 -0500 Subject: KWSys 2017-01-16 (a423d829) Code extracted from: https://gitlab.kitware.com/utils/kwsys.git at commit a423d82989a4b89fa7d17f3dd5215684e902208e (master). Upstream Shortlog ----------------- Ben Boeckel (1): 45db0937 SystemTools: use PathExists where appropriate Brad King (1): e08eee61 SystemTools: Fix conversion warning in test case Eric Berge (1): 687fcd79 Add -lsocket for libcmsys.a build on SunOS Gregor Jasny (1): 0541ce21 SystemTools: Fix off-by-one in GetLineFromStream with size limit --- CMakeLists.txt | 3 +++ SystemTools.cxx | 11 ++++------- testSystemTools.cxx | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9eb3b2d..d4fe8a7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -818,6 +818,9 @@ IF(KWSYS_C_SRCS OR KWSYS_CXX_SRCS) # for symbol lookup using dladdr TARGET_LINK_LIBRARIES(${KWSYS_NAMESPACE} ${CMAKE_DL_LIBS}) ENDIF() + IF (CMAKE_SYSTEM_NAME STREQUAL "SunOS") + TARGET_LINK_LIBRARIES(${KWSYS_NAMESPACE} socket) + ENDIF() ENDIF() ENDIF() diff --git a/SystemTools.cxx b/SystemTools.cxx index b018a43..97dd4ae 100644 --- a/SystemTools.cxx +++ b/SystemTools.cxx @@ -763,7 +763,7 @@ bool SystemTools::MakeDirectory(const char* path) bool SystemTools::MakeDirectory(const std::string& path) { - if (SystemTools::FileExists(path)) { + if (SystemTools::PathExists(path)) { return SystemTools::FileIsDirectory(path); } if (path.empty()) { @@ -1280,7 +1280,7 @@ bool SystemTools::PathCygwinToWin32(const char* path, char* win32_path) bool SystemTools::Touch(const std::string& filename, bool create) { - if (!SystemTools::FileExists(filename)) { + if (!SystemTools::PathExists(filename)) { if (create) { FILE* file = Fopen(filename, "a+b"); if (file) { @@ -4289,7 +4289,7 @@ bool SystemTools::GetLineFromStream(std::istream& is, std::string& line, // if we read too much then truncate the buffer if (leftToRead > 0) { if (static_cast(length) > leftToRead) { - buffer[leftToRead - 1] = 0; + buffer[leftToRead] = 0; leftToRead = 0; } else { leftToRead -= static_cast(length); @@ -4389,10 +4389,7 @@ bool SystemTools::SetPermissions(const char* file, mode_t mode, bool SystemTools::SetPermissions(const std::string& file, mode_t mode, bool honor_umask) { - // TEMPORARY / TODO: After FileExists calls lstat() instead of - // access(), change this call to FileExists instead of - // TestFileAccess so that we don't follow symlinks. - if (!SystemTools::TestFileAccess(file, TEST_FILE_OK)) { + if (!SystemTools::PathExists(file)) { return false; } if (honor_umask) { diff --git a/testSystemTools.cxx b/testSystemTools.cxx index b04f2cb..8e1ea25 100644 --- a/testSystemTools.cxx +++ b/testSystemTools.cxx @@ -6,11 +6,13 @@ #pragma warning(disable : 4786) #endif +#include KWSYS_HEADER(FStream.hxx) #include KWSYS_HEADER(SystemTools.hxx) // Work-around CMake dependency scanning limitation. This must // duplicate the above list of headers. #if 0 +#include "FStream.hxx.in" #include "SystemTools.hxx.in" #endif @@ -857,6 +859,55 @@ static bool CheckFind() return res; } +static bool CheckGetLineFromStream() +{ + const std::string fileWithFiveCharsOnFirstLine(TEST_SYSTEMTOOLS_SOURCE_DIR + "/README.rst"); + + kwsys::ifstream file(fileWithFiveCharsOnFirstLine.c_str(), std::ios::in); + + if (!file) { + std::cerr << "Problem opening: " << fileWithFiveCharsOnFirstLine + << std::endl; + return false; + } + + std::string line; + bool has_newline = false; + bool result; + + file.seekg(0, std::ios::beg); + result = kwsys::SystemTools::GetLineFromStream(file, line, &has_newline, -1); + if (!result || line.size() != 5) { + std::cerr << "First line does not have five characters: " << line.size() + << std::endl; + return false; + } + + file.seekg(0, std::ios::beg); + result = kwsys::SystemTools::GetLineFromStream(file, line, &has_newline, -1); + if (!result || line.size() != 5) { + std::cerr << "First line does not have five characters after rewind: " + << line.size() << std::endl; + return false; + } + + bool ret = true; + + for (size_t size = 1; size <= 5; ++size) { + file.seekg(0, std::ios::beg); + result = kwsys::SystemTools::GetLineFromStream(file, line, &has_newline, + static_cast(size)); + if (!result || line.size() != size) { + std::cerr << "Should have read " << size << " characters but got " + << line.size() << std::endl; + ret = false; + } + } + + return ret; +} + //---------------------------------------------------------------------------- int testSystemTools(int, char* []) { @@ -893,5 +944,7 @@ int testSystemTools(int, char* []) res &= CheckFind(); + res &= CheckGetLineFromStream(); + return res ? 0 : 1; } -- cgit v0.12