diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-08-27 04:01:37 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-08-27 04:01:37 +0000 |
commit | 262b10210fd597d467d88bdc0a2f3a1efdb80a53 (patch) | |
tree | fa238ae5c2459498d399425117b84d8a6b93777c /win32 | |
parent | a2da0f7e4295115680491abce9f6dc533db11f8a (diff) |
win32.c: fchmod
* win32/win32.c (fchmod): implement by using
SetFileInformationByHandle.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51704 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'win32')
-rw-r--r-- | win32/file.h | 2 | ||||
-rw-r--r-- | win32/win32.c | 41 |
2 files changed, 43 insertions, 0 deletions
diff --git a/win32/file.h b/win32/file.h index deebbfab84..624707f0b7 100644 --- a/win32/file.h +++ b/win32/file.h @@ -39,5 +39,7 @@ int rb_w32_read_reparse_point(const WCHAR *path, rb_w32_reparse_buffer_t *rp, int lchown(const char *path, int owner, int group); int rb_w32_ulchown(const char *path, int owner, int group); +int fchmod(int fd, int mode); +#define HAVE_FCHMOD 0 #endif /* RUBY_WIN32_FILE_H */ diff --git a/win32/win32.c b/win32/win32.c index a3a76c1423..70e95d1414 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -7315,6 +7315,47 @@ rb_w32_uchmod(const char *path, int mode) /* License: Ruby's */ int +fchmod(int fd, int mode) +{ + typedef BOOL (WINAPI *set_file_information_by_handle_func) + (HANDLE, int, void*, DWORD); + static set_file_information_by_handle_func set_file_info = + (set_file_information_by_handle_func)-1; + + /* from winbase.h of the mingw-w64 runtime package. */ + struct { + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + DWORD FileAttributes; + } info = {0, 0, 0}; /* fields with 0 are unchanged */ + HANDLE h = (HANDLE)_get_osfhandle(fd); + + if (h == INVALID_HANDLE_VALUE) { + errno = EBADF; + return -1; + } + if (set_file_info == (set_file_information_by_handle_func)-1) { + set_file_info = (set_file_information_by_handle_func) + get_proc_address("kernel32", "SetFileInformationByHandle", NULL); + } + if (!set_file_info) { + errno = ENOSYS; + return -1; + } + + info.FileAttributes = FILE_ATTRIBUTE_NORMAL; + if (!(mode & 0200)) info.FileAttributes |= FILE_ATTRIBUTE_READONLY; + if (!set_file_info(h, 0, &info, sizeof(info))) { + errno = map_errno(GetLastError()); + return -1; + } + return 0; +} + +/* License: Ruby's */ +int rb_w32_isatty(int fd) { DWORD mode; |