From 321cfe97605de8f050ac9be597069e370d5d9da3 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Mon, 27 Feb 2023 19:56:18 +0900 Subject: [PATCH] mruby-io/file.c: add File#atime and File#ctime --- mrbgems/mruby-io/README.md | 4 ++-- mrbgems/mruby-io/mrblib/file.rb | 10 ++++++++++ mrbgems/mruby-io/src/file.c | 24 ++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/mrbgems/mruby-io/README.md b/mrbgems/mruby-io/README.md index 3629cdb5c..21138ace4 100644 --- a/mrbgems/mruby-io/README.md +++ b/mrbgems/mruby-io/README.md @@ -158,10 +158,10 @@ Add the line below to your build configuration. | File.writable? | | FileTest | | File.writable_real? | | FileTest | | File.zero? | o | FileTest | -| File#atime | | | +| File#atime | o | | | File#chmod | | | | File#chown | | | -| File#ctime | | | +| File#ctime | o | | | File#flock | o | | | File#lstat | | | | File#mtime | o | | diff --git a/mrbgems/mruby-io/mrblib/file.rb b/mrbgems/mruby-io/mrblib/file.rb index b706cf0de..4a387672c 100644 --- a/mrbgems/mruby-io/mrblib/file.rb +++ b/mrbgems/mruby-io/mrblib/file.rb @@ -11,6 +11,16 @@ class File < IO end end + def atime + t = self._atime + t && Time.at(t) + end + + def ctime + t = self._ctime + t && Time.at(t) + end + def mtime t = self._mtime t && Time.at(t) diff --git a/mrbgems/mruby-io/src/file.c b/mrbgems/mruby-io/src/file.c index 6505f9800..73a730170 100644 --- a/mrbgems/mruby-io/src/file.c +++ b/mrbgems/mruby-io/src/file.c @@ -391,6 +391,28 @@ mrb_file__gethome(mrb_state *mrb, mrb_value klass) #endif } +static mrb_value +mrb_file_atime(mrb_state *mrb, mrb_value self) +{ + int fd = mrb_io_fileno(mrb, self); + mrb_stat st; + + if (mrb_fstat(fd, &st) == -1) + return mrb_nil_value(); + return mrb_int_value(mrb, (mrb_int)st.st_atime); +} + +static mrb_value +mrb_file_ctime(mrb_state *mrb, mrb_value self) +{ + int fd = mrb_io_fileno(mrb, self); + mrb_stat st; + + if (mrb_fstat(fd, &st) == -1) + return mrb_nil_value(); + return mrb_int_value(mrb, (mrb_int)st.st_ctime); +} + static mrb_value mrb_file_mtime(mrb_state *mrb, mrb_value self) { @@ -610,6 +632,8 @@ mrb_init_file(mrb_state *mrb) mrb_define_class_method(mrb, file, "_gethome", mrb_file__gethome, MRB_ARGS_OPT(1)); mrb_define_method(mrb, file, "flock", mrb_file_flock, MRB_ARGS_REQ(1)); + mrb_define_method(mrb, file, "_atime", mrb_file_atime, MRB_ARGS_NONE()); + mrb_define_method(mrb, file, "_ctime", mrb_file_ctime, MRB_ARGS_NONE()); mrb_define_method(mrb, file, "_mtime", mrb_file_mtime, MRB_ARGS_NONE()); mrb_define_method(mrb, file, "size", mrb_file_size, MRB_ARGS_NONE()); mrb_define_method(mrb, file, "truncate", mrb_file_truncate, MRB_ARGS_REQ(1));