* 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:
naruse 2015-06-13 11:46:38 +00:00
Родитель 768bc8b88e
Коммит 4ff07119e9
4 изменённых файлов: 77 добавлений и 2 удалений

Просмотреть файл

@ -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
Просмотреть файл

@ -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;
}