diff options
Diffstat (limited to 'mrbgems/mruby-io')
| -rw-r--r-- | mrbgems/mruby-io/src/file.c | 15 | ||||
| -rw-r--r-- | mrbgems/mruby-io/src/io.c | 24 | ||||
| -rw-r--r-- | mrbgems/mruby-io/test/file.rb | 18 | ||||
| -rw-r--r-- | mrbgems/mruby-io/test/io.rb | 4 |
4 files changed, 52 insertions, 9 deletions
diff --git a/mrbgems/mruby-io/src/file.c b/mrbgems/mruby-io/src/file.c index 1018e90e6..3dcfe3a0b 100644 --- a/mrbgems/mruby-io/src/file.c +++ b/mrbgems/mruby-io/src/file.c @@ -332,6 +332,20 @@ mrb_file__gethome(mrb_state *mrb, mrb_value klass) #endif } +static mrb_value +mrb_file_mtime(mrb_state *mrb, mrb_value self) +{ + mrb_value obj; + struct stat st; + int fd; + + obj = mrb_obj_value(mrb_class_get(mrb, "Time")); + fd = (int)mrb_fixnum(mrb_io_fileno(mrb, self)); + if (fstat(fd, &st) == -1) + return mrb_false_value(); + return mrb_funcall(mrb, obj, "at", 1, mrb_float_value(mrb, st.st_mtime)); +} + mrb_value mrb_file_flock(mrb_state *mrb, mrb_value self) { @@ -471,6 +485,7 @@ 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, "mtime", mrb_file_mtime, MRB_ARGS_NONE()); cnst = mrb_define_module_under(mrb, file, "Constants"); mrb_define_const(mrb, cnst, "LOCK_SH", mrb_fixnum_value(LOCK_SH)); diff --git a/mrbgems/mruby-io/src/io.c b/mrbgems/mruby-io/src/io.c index 21a733b00..58bcdd1ee 100644 --- a/mrbgems/mruby-io/src/io.c +++ b/mrbgems/mruby-io/src/io.c @@ -180,7 +180,7 @@ mrb_io_flags_to_modenum(mrb_state *mrb, int flags) return modenum; } -void +static void mrb_fd_cloexec(mrb_state *mrb, int fd) { #if defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC) @@ -188,7 +188,8 @@ mrb_fd_cloexec(mrb_state *mrb, int fd) flags = fcntl(fd, F_GETFD); if (flags == -1) { - mrb_sys_fail(mrb, "fcntl"); + mrb_bug(mrb, "mrb_fd_cloexec: fcntl(%S, F_GETFD) failed: %S", + mrb_fixnum_value(fd), mrb_fixnum_value(errno)); } if (fd <= 2) { flags2 = flags & ~FD_CLOEXEC; /* Clear CLOEXEC for standard file descriptors: 0, 1, 2. */ @@ -198,7 +199,8 @@ mrb_fd_cloexec(mrb_state *mrb, int fd) } if (flags != flags2) { if (fcntl(fd, F_SETFD, flags2) == -1) { - mrb_sys_fail(mrb, "fcntl"); + mrb_bug(mrb, "mrb_fd_cloexec: fcntl(%S, F_SETFD, %S) failed: %S", + mrb_fixnum_value(fd), mrb_fixnum_value(flags2), mrb_fixnum_value(errno)); } } #endif @@ -577,11 +579,17 @@ mrb_io_initialize_copy(mrb_state *mrb, mrb_value copy) if (failed) { mrb_sys_fail(mrb, 0); } - fptr_copy->fd2 = mrb_dup(mrb, fptr_orig->fd2, &failed); - if (failed) { - close(fptr_copy->fd); - mrb_sys_fail(mrb, 0); + mrb_fd_cloexec(mrb, fptr_copy->fd); + + if (fptr_orig->fd2 != -1) { + fptr_copy->fd2 = mrb_dup(mrb, fptr_orig->fd2, &failed); + if (failed) { + close(fptr_copy->fd); + mrb_sys_fail(mrb, 0); + } + mrb_fd_cloexec(mrb, fptr_copy->fd2); } + fptr_copy->pid = fptr_orig->pid; fptr_copy->readable = fptr_orig->readable; fptr_copy->writable = fptr_orig->writable; @@ -676,7 +684,7 @@ fptr_finalize(mrb_state *mrb, struct mrb_io *fptr, int quiet) io_set_process_status(mrb, pid, status); } #else - HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, fptr->pid); + HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, fptr->pid); DWORD status; if (WaitForSingleObject(h, INFINITE) && GetExitCodeProcess(h, &status)) if (!quiet) diff --git a/mrbgems/mruby-io/test/file.rb b/mrbgems/mruby-io/test/file.rb index e5c127746..dc6fe369a 100644 --- a/mrbgems/mruby-io/test/file.rb +++ b/mrbgems/mruby-io/test/file.rb @@ -54,7 +54,7 @@ assert('File.extname') do assert_equal '', File.extname('.foo') end -assert('IO#flock') do +assert('File#flock') do f = File.open $mrbtest_io_rfname begin assert_equal(f.flock(File::LOCK_SH), 0) @@ -68,6 +68,22 @@ assert('IO#flock') do end end +assert('File#mtime') do + unless Object.const_defined?(:Time) + skip "File#mtime require Time" + end + begin + now = Time.now.to_i + mt = 0 + File.open('mtime-test', 'w') do |f| + mt = f.mtime.to_i + end + assert_equal true, mt >= now + ensure + File.delete('mtime-test') + end +end + assert('File.join') do assert_equal "", File.join() assert_equal "a", File.join("a") diff --git a/mrbgems/mruby-io/test/io.rb b/mrbgems/mruby-io/test/io.rb index 96c3495d0..e06b14996 100644 --- a/mrbgems/mruby-io/test/io.rb +++ b/mrbgems/mruby-io/test/io.rb @@ -216,6 +216,10 @@ assert('IO#dup for readable') do dup = io.dup assert_true io != dup assert_true io.fileno != dup.fileno + begin + assert_true dup.close_on_exec? + rescue NotImplementedError + end assert_equal 'm', dup.sysread(1) assert_equal 'r', io.sysread(1) assert_equal 'u', dup.sysread(1) |
