summaryrefslogtreecommitdiff
path: root/file.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-04-11 14:34:26 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-04-11 14:34:26 +0000
commit28ca0b0f20f877b1f00d246cb8d6d4d2fcf259b3 (patch)
tree9b3385c2d6f5365c9e1db378ed44f2b1181e7ed5 /file.c
parentcd06ce2e5a8d7e42283b35397c96eac1ee8b2388 (diff)
* file.c (rb_f_test): Consider nsec for "=", "<" and ">" for "test"
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50236 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'file.c')
-rw-r--r--file.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/file.c b/file.c
index 00ef6e90d0..c724a4b97c 100644
--- a/file.c
+++ b/file.c
@@ -4829,22 +4829,28 @@ rb_f_test(int argc, VALUE *argv)
if (strchr("=<>", cmd)) {
struct stat st1, st2;
+ struct timespec t1, t2;
CHECK(2);
if (rb_stat(argv[1], &st1) < 0) return Qfalse;
if (rb_stat(argv[2], &st2) < 0) return Qfalse;
+ t1 = stat_mtimespec(&st1);
+ t2 = stat_mtimespec(&st2);
+
switch (cmd) {
case '=':
- if (st1.st_mtime == st2.st_mtime) return Qtrue;
+ if (t1.tv_sec == t2.tv_sec && t1.tv_nsec == t2.tv_nsec) return Qtrue;
return Qfalse;
case '>':
- if (st1.st_mtime > st2.st_mtime) return Qtrue;
+ if (t1.tv_sec > t2.tv_sec) return Qtrue;
+ if (t1.tv_sec == t2.tv_sec && t1.tv_nsec > t2.tv_nsec) return Qtrue;
return Qfalse;
case '<':
- if (st1.st_mtime < st2.st_mtime) return Qtrue;
+ if (t1.tv_sec < t2.tv_sec) return Qtrue;
+ if (t1.tv_sec == t2.tv_sec && t1.tv_nsec < t2.tv_nsec) return Qtrue;
return Qfalse;
}
}