mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
merge revision(s): a0040af671
[Win32] Fix mode of character/pipe device stat [Bug #18732]
This commit is contained in:
parent
3fa771dded
commit
28b238f2cb
3 changed files with 48 additions and 15 deletions
|
|
@ -160,9 +160,7 @@ class TestFileExhaustive < Test::Unit::TestCase
|
|||
end
|
||||
|
||||
def chardev
|
||||
return @chardev if defined? @chardev
|
||||
@chardev = File::NULL == "/dev/null" ? "/dev/null" : nil
|
||||
@chardev
|
||||
File::NULL
|
||||
end
|
||||
|
||||
def blockdev
|
||||
|
|
@ -319,7 +317,7 @@ class TestFileExhaustive < Test::Unit::TestCase
|
|||
assert_file.not_chardev?(regular_file)
|
||||
assert_file.not_chardev?(utf8_file)
|
||||
assert_file.not_chardev?(nofile)
|
||||
assert_file.chardev?(chardev) if chardev
|
||||
assert_file.chardev?(chardev)
|
||||
end
|
||||
|
||||
def test_exist_p
|
||||
|
|
@ -1481,6 +1479,31 @@ class TestFileExhaustive < Test::Unit::TestCase
|
|||
assert_equal(File.executable?(f), test(?x, f))
|
||||
assert_equal(File.executable_real?(f), test(?X, f))
|
||||
assert_equal(File.zero?(f), test(?z, f))
|
||||
|
||||
stat = File.stat(f)
|
||||
assert_equal(stat.atime, File.atime(f), f)
|
||||
assert_equal(stat.ctime, File.ctime(f), f)
|
||||
assert_equal(stat.mtime, File.mtime(f), f)
|
||||
assert_equal(stat.blockdev?, File.blockdev?(f), f)
|
||||
assert_equal(stat.chardev?, File.chardev?(f), f)
|
||||
assert_equal(stat.directory?, File.directory?(f), f)
|
||||
assert_equal(stat.file?, File.file?(f), f)
|
||||
assert_equal(stat.setgid?, File.setgid?(f), f)
|
||||
assert_equal(stat.grpowned?, File.grpowned?(f), f)
|
||||
assert_equal(stat.sticky?, File.sticky?(f), f) if stickyfile
|
||||
assert_equal(File.lstat(f).symlink?, File.symlink?(f), f)
|
||||
assert_equal(stat.owned?, File.owned?(f), f)
|
||||
assert_equal(stat.pipe?, File.pipe?(f), f)
|
||||
assert_equal(stat.readable?, File.readable?(f), f)
|
||||
assert_equal(stat.readable_real?, File.readable_real?(f), f)
|
||||
assert_equal(stat.size?, File.size?(f), f)
|
||||
assert_equal(stat.socket?, File.socket?(f), f)
|
||||
assert_equal(stat.setuid?, File.setuid?(f), f)
|
||||
assert_equal(stat.writable?, File.writable?(f), f)
|
||||
assert_equal(stat.writable_real?, File.writable_real?(f), f)
|
||||
assert_equal(stat.executable?, File.executable?(f), f)
|
||||
assert_equal(stat.executable_real?, File.executable_real?(f), f)
|
||||
assert_equal(stat.zero?, File.zero?(f), f)
|
||||
end
|
||||
assert_equal(false, test(?-, @dir, fn1))
|
||||
assert_equal(true, test(?-, fn1, fn1))
|
||||
|
|
@ -1590,7 +1613,7 @@ class TestFileExhaustive < Test::Unit::TestCase
|
|||
def test_stat_chardev_p
|
||||
assert_not_predicate(File::Stat.new(@dir), :chardev?)
|
||||
assert_not_predicate(File::Stat.new(regular_file), :chardev?)
|
||||
assert_predicate(File::Stat.new(chardev), :chardev?) if chardev
|
||||
assert_predicate(File::Stat.new(chardev), :chardev?)
|
||||
end
|
||||
|
||||
def test_stat_readable_p
|
||||
|
|
|
|||
|
|
@ -10,13 +10,13 @@
|
|||
*/
|
||||
# define RUBY_VERSION_MAJOR RUBY_API_VERSION_MAJOR
|
||||
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
|
||||
#define RUBY_VERSION_TEENY 4
|
||||
#define RUBY_VERSION_TEENY 5
|
||||
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
|
||||
#define RUBY_PATCHLEVEL 208
|
||||
#define RUBY_PATCHLEVEL 209
|
||||
|
||||
#define RUBY_RELEASE_YEAR 2022
|
||||
#define RUBY_RELEASE_MONTH 4
|
||||
#define RUBY_RELEASE_DAY 12
|
||||
#define RUBY_RELEASE_MONTH 6
|
||||
#define RUBY_RELEASE_DAY 18
|
||||
|
||||
#include "ruby/version.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -5569,10 +5569,8 @@ filetime_to_nsec(const FILETIME *ft)
|
|||
|
||||
/* License: Ruby's */
|
||||
static unsigned
|
||||
fileattr_to_unixmode(DWORD attr, const WCHAR *path)
|
||||
fileattr_to_unixmode(DWORD attr, const WCHAR *path, unsigned mode)
|
||||
{
|
||||
unsigned mode = 0;
|
||||
|
||||
if (attr & FILE_ATTRIBUTE_READONLY) {
|
||||
mode |= S_IREAD;
|
||||
}
|
||||
|
|
@ -5580,7 +5578,10 @@ fileattr_to_unixmode(DWORD attr, const WCHAR *path)
|
|||
mode |= S_IREAD | S_IWRITE | S_IWUSR;
|
||||
}
|
||||
|
||||
if (attr & FILE_ATTRIBUTE_REPARSE_POINT) {
|
||||
if (mode & S_IFMT) {
|
||||
/* format is already set */
|
||||
}
|
||||
else if (attr & FILE_ATTRIBUTE_REPARSE_POINT) {
|
||||
if (rb_w32_reparse_symlink_p(path))
|
||||
mode |= S_IFLNK | S_IEXEC;
|
||||
else
|
||||
|
|
@ -5675,7 +5676,7 @@ stat_by_find(const WCHAR *path, struct stati128 *st)
|
|||
return -1;
|
||||
}
|
||||
FindClose(h);
|
||||
st->st_mode = fileattr_to_unixmode(wfd.dwFileAttributes, path);
|
||||
st->st_mode = fileattr_to_unixmode(wfd.dwFileAttributes, path, 0);
|
||||
st->st_atime = filetime_to_unixtime(&wfd.ftLastAccessTime);
|
||||
st->st_atimensec = filetime_to_nsec(&wfd.ftLastAccessTime);
|
||||
st->st_mtime = filetime_to_unixtime(&wfd.ftLastWriteTime);
|
||||
|
|
@ -5710,6 +5711,15 @@ winnt_stat(const WCHAR *path, struct stati128 *st, BOOL lstat)
|
|||
if (f != INVALID_HANDLE_VALUE) {
|
||||
DWORD attr = stati128_handle(f, st);
|
||||
const DWORD len = get_final_path(f, finalname, numberof(finalname), 0);
|
||||
unsigned mode = 0;
|
||||
switch (GetFileType(f)) {
|
||||
case FILE_TYPE_CHAR:
|
||||
mode = S_IFCHR;
|
||||
break;
|
||||
case FILE_TYPE_PIPE:
|
||||
mode = S_IFIFO;
|
||||
break;
|
||||
}
|
||||
CloseHandle(f);
|
||||
if (attr & FILE_ATTRIBUTE_REPARSE_POINT) {
|
||||
/* TODO: size in which encoding? */
|
||||
|
|
@ -5721,7 +5731,7 @@ winnt_stat(const WCHAR *path, struct stati128 *st, BOOL lstat)
|
|||
if (attr & FILE_ATTRIBUTE_DIRECTORY) {
|
||||
if (check_valid_dir(path)) return -1;
|
||||
}
|
||||
st->st_mode = fileattr_to_unixmode(attr, path);
|
||||
st->st_mode = fileattr_to_unixmode(attr, path, mode);
|
||||
if (len) {
|
||||
finalname[min(len, numberof(finalname)-1)] = L'\0';
|
||||
path = finalname;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue