Support fchmod and include the correct portability headers for FileUtil
[folly.git] / folly / portability / SysStat.cpp
index 1eecdc1603b304e939e80220ba0a29d3413fac8a..c98dafbae69a8966fa6b8aca4b884b8081107e05 100755 (executable)
 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); }