diff --git a/src/libpsl-native/src/CMakeLists.txt b/src/libpsl-native/src/CMakeLists.txt index 5b2ec24199..6d47622d3e 100644 --- a/src/libpsl-native/src/CMakeLists.txt +++ b/src/libpsl-native/src/CMakeLists.txt @@ -1,4 +1,5 @@ add_library(psl-native SHARED + getstat.cpp getcurrentprocessorid.cpp getusername.cpp getcomputername.cpp diff --git a/src/libpsl-native/src/getstat.cpp b/src/libpsl-native/src/getstat.cpp new file mode 100644 index 0000000000..3e89d1a6ed --- /dev/null +++ b/src/libpsl-native/src/getstat.cpp @@ -0,0 +1,96 @@ +//! @file getstat.cpp +//! @author Andrew Schwartzmeyer +//! @brief returns the stat of a file + +#include +#include +#include +#include +#include +#include +#include "getstat.h" + +//! @brief GetStat returns the stat of a file. This simply delegates to the +//! stat() system call and maps errno to the expected values for GetLastError. +//! +//! GetStat +//! +//! @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 +//! +//! @param[in] stat +//! @parblock +//! A pointer to the buffer in which to place the stat information +//! @endparblock +//! +//! @exception errno Passes these errors via errno to GetLastError: +//! - ERROR_INVALID_PARAMETER: parameter is not valid +//! - ERROR_FILE_NOT_FOUND: file does not exist +//! - ERROR_ACCESS_DENIED: access is denied +//! - ERROR_INVALID_ADDRESS: attempt to access invalid address +//! - ERROR_STOPPED_ON_SYMLINK: too many symbolic links +//! - ERROR_GEN_FAILURE: I/O error occurred +//! - ERROR_INVALID_NAME: file provided is not a symbolic link +//! - ERROR_INVALID_FUNCTION: incorrect function +//! - ERROR_BAD_PATH_NAME: pathname is too long +//! - ERROR_OUTOFMEMORY insufficient kernel memory +//! +//! @retval 0 if successful +//! @retval -1 if failed +//! + +int32_t GetStat(const char* path, struct stat* buf) +{ + errno = 0; + + if (!path) + { + errno = ERROR_INVALID_PARAMETER; + return -1; + } + + int32_t ret = stat(path, buf); + + if (ret != 0) + { + switch(errno) + { + case EACCES: + errno = ERROR_ACCESS_DENIED; + break; + case EBADF: + errno = ERROR_FILE_NOT_FOUND; + break; + case EFAULT: + errno = ERROR_INVALID_ADDRESS; + break; + case ELOOP: + errno = ERROR_STOPPED_ON_SYMLINK; + break; + case ENAMETOOLONG: + errno = ERROR_GEN_FAILURE; + break; + case ENOENT: + errno = ERROR_FILE_NOT_FOUND; + break; + case ENOMEM: + errno = ERROR_NO_SUCH_USER; + break; + case ENOTDIR: + errno = ERROR_INVALID_NAME; + break; + case EOVERFLOW: + errno = ERROR_BUFFER_OVERFLOW; + break; + default: + errno = ERROR_INVALID_FUNCTION; + } + return -1; + } + + return 0; +} diff --git a/src/libpsl-native/src/getstat.h b/src/libpsl-native/src/getstat.h new file mode 100644 index 0000000000..00bc26e9fa --- /dev/null +++ b/src/libpsl-native/src/getstat.h @@ -0,0 +1,10 @@ +#pragma once + +#include +#include "pal.h" + +PAL_BEGIN_EXTERNC + +int32_t GetStat(const char* path, struct stat* buf); + +PAL_END_EXTERNC