summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--file.c8
-rw-r--r--test/ruby/test_file_exhaustive.rb11
2 files changed, 16 insertions, 3 deletions
diff --git a/file.c b/file.c
index ca61836784..e24cf68fc6 100644
--- a/file.c
+++ b/file.c
@@ -1208,6 +1208,8 @@ statx_birthtime(const struct statx *stx, VALUE fname)
}
typedef struct statx statx_data;
+# define HAVE_STAT_BIRTHTIME
+
#elif defined(HAVE_STAT_BIRTHTIME)
# define statx_without_gvl(path, st, mask) stat_without_gvl(path, st)
# define fstatx_without_gvl(fd, st, mask) fstat_without_gvl(fd, st)
@@ -2434,13 +2436,13 @@ static VALUE
rb_file_birthtime(VALUE obj)
{
rb_io_t *fptr;
- struct stat st;
+ statx_data st;
GetOpenFile(obj, fptr);
- if (fstat(fptr->fd, &st) == -1) {
+ if (fstatx_without_gvl(fptr->fd, &st, STATX_BTIME) == -1) {
rb_sys_fail_path(fptr->pathv);
}
- return stat_birthtime(&st);
+ return statx_birthtime(&st, fptr->pathv);
}
#else
# define rb_file_birthtime rb_f_notimplement
diff --git a/test/ruby/test_file_exhaustive.rb b/test/ruby/test_file_exhaustive.rb
index 7d4eeb6d59..57eb01b4ec 100644
--- a/test/ruby/test_file_exhaustive.rb
+++ b/test/ruby/test_file_exhaustive.rb
@@ -623,6 +623,17 @@ class TestFileExhaustive < Test::Unit::TestCase
assert_raise(Errno::ENOENT) { File.ctime(nofile) }
end
+ def test_birthtime
+ [regular_file, utf8_file].each do |file|
+ t1 = File.birthtime(file)
+ t2 = File.open(file) {|f| f.birthtime}
+ assert_kind_of(Time, t1)
+ assert_kind_of(Time, t2)
+ assert_equal(t1, t2)
+ end
+ assert_raise(Errno::ENOENT) { File.birthtime(nofile) }
+ end if File.respond_to?(:birthtime)
+
def test_chmod
[regular_file, utf8_file].each do |file|
assert_equal(1, File.chmod(0444, file))