зеркало из https://github.com/github/ruby.git
* file.c (rb_stat_ino): get inode from the interval of struct st.
* win32/win32.c (stati64_set_inode): get nFilIndexHigh/Low, and set it to the interval of struct st as inode. * win32/win32.c (stati64_set_inode_handle): call stati64_set_inode. * win32/win32.c (rb_w32_fstati64): call stati64_set_inode_handle. * win32/win32.c (stati64_handle): call stati64_set_inode. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50870 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
768bc8b88e
Коммит
4ff07119e9
13
ChangeLog
13
ChangeLog
|
@ -1,3 +1,16 @@
|
|||
Sat Jun 13 20:28:14 2015 NARUSE, Yui <naruse@ruby-lang.org>
|
||||
|
||||
* file.c (rb_stat_ino): get inode from the interval of struct st.
|
||||
|
||||
* win32/win32.c (stati64_set_inode): get nFilIndexHigh/Low, and set it
|
||||
to the interval of struct st as inode.
|
||||
|
||||
* win32/win32.c (stati64_set_inode_handle): call stati64_set_inode.
|
||||
|
||||
* win32/win32.c (rb_w32_fstati64): call stati64_set_inode_handle.
|
||||
|
||||
* win32/win32.c (stati64_handle): call stati64_set_inode.
|
||||
|
||||
Sat Jun 13 19:44:53 2015 NAKAMURA Usaku <usa@ruby-lang.org>
|
||||
|
||||
* ext/io/console/depend (.list.chksum): revert a part of r50859, because
|
||||
|
|
13
file.c
13
file.c
|
@ -548,7 +548,18 @@ rb_stat_dev_minor(VALUE self)
|
|||
static VALUE
|
||||
rb_stat_ino(VALUE self)
|
||||
{
|
||||
#if SIZEOF_STRUCT_STAT_ST_INO > SIZEOF_LONG
|
||||
#ifdef _WIN32
|
||||
struct stat *st = get_stat(self);
|
||||
unsigned short *p2 = (unsigned short *)st;
|
||||
unsigned int *p4 = (unsigned int *)st;
|
||||
uint64_t r;
|
||||
r = p2[2];
|
||||
r <<= 16;
|
||||
r |= p2[7];
|
||||
r <<= 32;
|
||||
r |= p4[5];
|
||||
return ULL2NUM(r);
|
||||
#elif SIZEOF_STRUCT_STAT_ST_INO > SIZEOF_LONG
|
||||
return ULL2NUM(get_stat(self)->st_ino);
|
||||
#else
|
||||
return ULONG2NUM(get_stat(self)->st_ino);
|
||||
|
|
|
@ -342,6 +342,10 @@ class TestFile < Test::Unit::TestCase
|
|||
rescue NotImplementedError
|
||||
end
|
||||
|
||||
def test_stat_inode
|
||||
assert_not_equal 0, File.stat(__FILE__).ino
|
||||
end
|
||||
|
||||
def test_chmod_m17n
|
||||
bug5671 = '[ruby-dev:44898]'
|
||||
Dir.mktmpdir('test-file-chmod-m17n-') do |tmpdir|
|
||||
|
|
|
@ -4975,6 +4975,48 @@ static time_t filetime_to_unixtime(const FILETIME *ft);
|
|||
static WCHAR *name_for_stat(WCHAR *buf, const WCHAR *path);
|
||||
static DWORD stati64_handle(HANDLE h, struct stati64 *st);
|
||||
|
||||
/* License: Ruby's */
|
||||
static void
|
||||
stati64_set_inode(PBY_HANDLE_FILE_INFORMATION pinfo, struct stati64 *st)
|
||||
{
|
||||
/* struct stati64 layout
|
||||
*
|
||||
* dev: 0-3
|
||||
* ino: 4-5
|
||||
* mode: 6-7
|
||||
* nlink: 8-9
|
||||
* uid: 10-11
|
||||
* gid: 12-13
|
||||
* _: 14-15
|
||||
* rdev: 16-19
|
||||
* _: 20-23
|
||||
* size: 24-31
|
||||
* atime: 32-39
|
||||
* mtime: 40-47
|
||||
* ctime: 48-55
|
||||
*
|
||||
*/
|
||||
unsigned short *p2 = (unsigned short *)st;
|
||||
unsigned int *p4 = (unsigned int *)st;
|
||||
DWORD high = pinfo->nFileIndexHigh;
|
||||
p2[2] = high >> 16;
|
||||
p2[7] = high & 0xFFFF;
|
||||
p4[5] = pinfo->nFileIndexLow;
|
||||
}
|
||||
|
||||
/* License: Ruby's */
|
||||
static DWORD
|
||||
stati64_set_inode_handle(HANDLE h, struct stati64 *st)
|
||||
{
|
||||
BY_HANDLE_FILE_INFORMATION info;
|
||||
DWORD attr = (DWORD)-1;
|
||||
|
||||
if (GetFileInformationByHandle(h, &info)) {
|
||||
stati64_set_inode(&info, st);
|
||||
}
|
||||
return attr;
|
||||
}
|
||||
|
||||
#undef fstat
|
||||
/* License: Ruby's */
|
||||
int
|
||||
|
@ -5000,7 +5042,11 @@ rb_w32_fstati64(int fd, struct stati64 *st)
|
|||
struct stat tmp;
|
||||
int ret;
|
||||
|
||||
if (GetEnvironmentVariableW(L"TZ", NULL, 0) == 0 && GetLastError() == ERROR_ENVVAR_NOT_FOUND) return _fstati64(fd, st);
|
||||
if (GetEnvironmentVariableW(L"TZ", NULL, 0) == 0 && GetLastError() == ERROR_ENVVAR_NOT_FOUND) {
|
||||
ret = _fstati64(fd, st);
|
||||
stati64_set_inode_handle((HANDLE)_get_osfhandle(fd), st);
|
||||
return ret;
|
||||
}
|
||||
ret = fstat(fd, &tmp);
|
||||
|
||||
if (ret) return ret;
|
||||
|
@ -5023,6 +5069,7 @@ stati64_handle(HANDLE h, struct stati64 *st)
|
|||
st->st_ctime = filetime_to_unixtime(&info.ftCreationTime);
|
||||
st->st_nlink = info.nNumberOfLinks;
|
||||
attr = info.dwFileAttributes;
|
||||
stati64_set_inode(&info, st);
|
||||
}
|
||||
return attr;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче