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
This commit is contained in:
parent
a2da0f7e42
commit
262b10210f
14
file.c
14
file.c
@ -2357,7 +2357,7 @@ rb_file_chmod(VALUE obj, VALUE vmode)
|
|||||||
{
|
{
|
||||||
rb_io_t *fptr;
|
rb_io_t *fptr;
|
||||||
int mode;
|
int mode;
|
||||||
#ifndef HAVE_FCHMOD
|
#if !defined HAVE_FCHMOD || !HAVE_FCHMOD
|
||||||
VALUE path;
|
VALUE path;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -2365,9 +2365,15 @@ rb_file_chmod(VALUE obj, VALUE vmode)
|
|||||||
|
|
||||||
GetOpenFile(obj, fptr);
|
GetOpenFile(obj, fptr);
|
||||||
#ifdef HAVE_FCHMOD
|
#ifdef HAVE_FCHMOD
|
||||||
if (fchmod(fptr->fd, mode) == -1)
|
if (fchmod(fptr->fd, mode) == -1) {
|
||||||
rb_sys_fail_path(fptr->pathv);
|
if (HAVE_FCHMOD || errno != ENOSYS)
|
||||||
#else
|
rb_sys_fail_path(fptr->pathv);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (!HAVE_FCHMOD) return INT2FIX(0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if !defined HAVE_FCHMOD || !HAVE_FCHMOD
|
||||||
if (NIL_P(fptr->pathv)) return Qnil;
|
if (NIL_P(fptr->pathv)) return Qnil;
|
||||||
path = rb_str_encode_ospath(fptr->pathv);
|
path = rb_str_encode_ospath(fptr->pathv);
|
||||||
if (chmod(RSTRING_PTR(path), mode) == -1)
|
if (chmod(RSTRING_PTR(path), mode) == -1)
|
||||||
|
@ -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 lchown(const char *path, int owner, int group);
|
||||||
int rb_w32_ulchown(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 */
|
#endif /* RUBY_WIN32_FILE_H */
|
||||||
|
@ -7313,6 +7313,47 @@ rb_w32_uchmod(const char *path, int mode)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 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 */
|
/* License: Ruby's */
|
||||||
int
|
int
|
||||||
rb_w32_isatty(int fd)
|
rb_w32_isatty(int fd)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user