From 955d5f8bcbb38ba184b3f6ac8559ccb010ce852c Mon Sep 17 00:00:00 2001 From: Andrew Schwartzmeyer Date: Wed, 13 Jul 2016 20:27:34 -0700 Subject: [PATCH] Add bool IsDirectory(char*) to libpsl-native --- src/libpsl-native/src/CMakeLists.txt | 1 + src/libpsl-native/src/isdirectory.cpp | 51 +++++++++++++++++++++ src/libpsl-native/src/isdirectory.h | 10 ++++ src/libpsl-native/test/CMakeLists.txt | 1 + src/libpsl-native/test/test-isdirectory.cpp | 31 +++++++++++++ 5 files changed, 94 insertions(+) create mode 100644 src/libpsl-native/src/isdirectory.cpp create mode 100644 src/libpsl-native/src/isdirectory.h create mode 100644 src/libpsl-native/test/test-isdirectory.cpp diff --git a/src/libpsl-native/src/CMakeLists.txt b/src/libpsl-native/src/CMakeLists.txt index 8b3d0f19a9..8fa6f89ec9 100644 --- a/src/libpsl-native/src/CMakeLists.txt +++ b/src/libpsl-native/src/CMakeLists.txt @@ -8,6 +8,7 @@ add_library(psl-native SHARED getcomputername.cpp getlinkcount.cpp getfullyqualifiedname.cpp + isdirectory.cpp issymlink.cpp isexecutable.cpp setdate.cpp diff --git a/src/libpsl-native/src/isdirectory.cpp b/src/libpsl-native/src/isdirectory.cpp new file mode 100644 index 0000000000..01ca0d9bb1 --- /dev/null +++ b/src/libpsl-native/src/isdirectory.cpp @@ -0,0 +1,51 @@ +//! @file isdirectory.cpp +//! @author Andrew Schwartzmeyer +//! @brief returns if the path is a directory + +#include +#include +#include +#include +#include +#include +#include "getstat.h" +#include "getpwuid.h" +#include "getfileowner.h" +#include "isdirectory.h" + +//! @brief returns if the path is a directory; uses stat and so follows symlinks +//! +//! IsDirectory +//! +//! @param[in] path +//! @parblock +//! A pointer to the buffer that contains the file name +//! +//! char* is marshaled as an LPStr, which on Linux is UTF-8. +//! @endparblock +//! +//! @exception errno Passes this error via errno to GetLastError: +//! - ERROR_INVALID_PARAMETER: parameter is not valid +//! +//! @retval true if directory, false otherwise +//! +bool IsDirectory(const char* path) +{ + int32_t ret = 0; + errno = 0; + + if (!path) + { + errno = ERROR_INVALID_PARAMETER; + return false; + } + + struct stat buf; + ret = GetStat(path, &buf); + if (ret != 0) + { + return false; + } + + return S_ISDIR(buf.st_mode); +} diff --git a/src/libpsl-native/src/isdirectory.h b/src/libpsl-native/src/isdirectory.h new file mode 100644 index 0000000000..746d1c5793 --- /dev/null +++ b/src/libpsl-native/src/isdirectory.h @@ -0,0 +1,10 @@ +#pragma once + +#include "pal.h" +#include + +PAL_BEGIN_EXTERNC + +bool IsDirectory(const char* path); + +PAL_END_EXTERNC diff --git a/src/libpsl-native/test/CMakeLists.txt b/src/libpsl-native/test/CMakeLists.txt index ed4440d2a3..d3859cb7bd 100644 --- a/src/libpsl-native/test/CMakeLists.txt +++ b/src/libpsl-native/test/CMakeLists.txt @@ -9,6 +9,7 @@ add_executable(psl-native-test test-getcomputername.cpp test-getlinkcount.cpp test-getfullyqualifiedname.cpp + test-isdirectory.cpp test-issymlink.cpp test-isexecutable.cpp test-createsymlink.cpp diff --git a/src/libpsl-native/test/test-isdirectory.cpp b/src/libpsl-native/test/test-isdirectory.cpp new file mode 100644 index 0000000000..27c840cba7 --- /dev/null +++ b/src/libpsl-native/test/test-isdirectory.cpp @@ -0,0 +1,31 @@ +//! @file test-isdirectory.cpp +//! @author Andrew Schwartzmeyer +//! @brief Tests IsDirectory + +#include +#include +#include +#include "isdirectory.h" + +TEST(IsDirectoryTest, RootIsDirectory) +{ + EXPECT_TRUE(IsDirectory("/")); +} + +TEST(IsDirectoryTest, BinLsIsNotDirectory) +{ + EXPECT_FALSE(IsDirectory("/bin/ls")); +} + + +TEST(IsDirectoryTest, ReturnsFalseForFakeDirectory) +{ + EXPECT_FALSE(IsDirectory("SomeMadeUpFileNameThatDoesNotExist")); + EXPECT_EQ(errno, ERROR_FILE_NOT_FOUND); +} + +TEST(IsDirectoryTest, ReturnsFalseForNullInput) +{ + EXPECT_FALSE(IsDirectory(NULL)); + EXPECT_EQ(errno, ERROR_INVALID_PARAMETER); +}