From df148cbad04e4d4fe65298a517793e65403d7fc4 Mon Sep 17 00:00:00 2001 From: Christopher Dykes Date: Wed, 21 Dec 2016 19:38:12 -0800 Subject: [PATCH] Support fchmod and include the correct portability headers for FileUtil Summary: `FileUtil.cpp` uses `fchmod`, which Windows doesn't have, so implement it and also include the correct portability headers for the use of `mkstemp` and now `fchmod` as well. Reviewed By: yfeldblum Differential Revision: D4360650 fbshipit-source-id: 300163689c54574548e7bf274a56264714d216ed --- folly/FileUtil.cpp | 2 ++ folly/portability/SysStat.cpp | 26 ++++++++++++++++++++++++++ folly/portability/SysStat.h | 3 +++ 3 files changed, 31 insertions(+) diff --git a/folly/FileUtil.cpp b/folly/FileUtil.cpp index 0ec03b3c..c4960ade 100644 --- a/folly/FileUtil.cpp +++ b/folly/FileUtil.cpp @@ -22,7 +22,9 @@ #include #include #include +#include #include +#include namespace folly { diff --git a/folly/portability/SysStat.cpp b/folly/portability/SysStat.cpp index 1eecdc16..c98dafba 100755 --- a/folly/portability/SysStat.cpp +++ b/folly/portability/SysStat.cpp @@ -22,6 +22,32 @@ extern "C" { int chmod(char const* fn, int am) { return _chmod(fn, am); } +int fchmod(int fd, mode_t mode) { + HANDLE h = (HANDLE)_get_osfhandle(fd); + if (h == INVALID_HANDLE_VALUE) { + return -1; + } + + FILE_ATTRIBUTE_TAG_INFO attr{}; + if (!GetFileInformationByHandleEx( + h, FileAttributeTagInfo, &attr, sizeof(attr))) { + return -1; + } + + if (mode & _S_IWRITE) { + attr.FileAttributes &= ~FILE_ATTRIBUTE_READONLY; + } else { + attr.FileAttributes |= FILE_ATTRIBUTE_READONLY; + } + + if (!SetFileInformationByHandle( + h, FileAttributeTagInfo, &attr, sizeof(attr))) { + return -1; + } + + return 0; +} + // Just return the result of a normal stat for now int lstat(const char* path, struct stat* st) { return stat(path, st); } diff --git a/folly/portability/SysStat.h b/folly/portability/SysStat.h index a98cc6a9..e7367778 100755 --- a/folly/portability/SysStat.h +++ b/folly/portability/SysStat.h @@ -19,6 +19,8 @@ #include #ifdef _WIN32 +#include + // Windows gives weird names to these. #define S_IXUSR 0 #define S_IWUSR _S_IWRITE @@ -38,6 +40,7 @@ extern "C" { int chmod(char const* fn, int am); +int fchmod(int fd, mode_t mode); int lstat(const char* path, struct stat* st); int mkdir(const char* fn, int mode); int umask(int md); -- 2.34.1