summaryrefslogtreecommitdiffhomepage
path: root/src/file_test.c
diff options
context:
space:
mode:
authorTomoyuki Sahara <[email protected]>2013-08-08 13:58:47 +0900
committerTomoyuki Sahara <[email protected]>2013-08-08 13:58:47 +0900
commitc49541058c40623b0c337a7e95193142c8dc9947 (patch)
tree00fd0b62169eea3cf147a0316732dcc192c0e8c0 /src/file_test.c
parent4f3a749da10e896f1faa03cef62b79624c575be7 (diff)
downloadmruby-c49541058c40623b0c337a7e95193142c8dc9947.tar.gz
mruby-c49541058c40623b0c337a7e95193142c8dc9947.zip
use lstat(2) to check if it's a symlink
Diffstat (limited to 'src/file_test.c')
-rw-r--r--src/file_test.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/src/file_test.c b/src/file_test.c
index 0d40c31a8..872f7aebc 100644
--- a/src/file_test.c
+++ b/src/file_test.c
@@ -21,7 +21,7 @@
extern struct mrb_data_type mrb_io_type;
static int
-mrb_stat(mrb_state *mrb, mrb_value obj, struct stat *st)
+mrb_stat0(mrb_state *mrb, mrb_value obj, struct stat *st, int do_lstat)
{
mrb_value tmp;
mrb_value io_klass, str_klass;
@@ -44,12 +44,28 @@ mrb_stat(mrb_state *mrb, mrb_value obj, struct stat *st)
tmp = mrb_funcall(mrb, obj, "is_a?", 1, str_klass);
if (mrb_test(tmp)) {
- return stat(mrb_string_value_cstr(mrb, &obj), st);
+ if (do_lstat) {
+ return lstat(mrb_str_to_cstr(mrb, obj), st);
+ } else {
+ return stat(mrb_str_to_cstr(mrb, obj), st);
+ }
}
return -1;
}
+static int
+mrb_stat(mrb_state *mrb, mrb_value obj, struct stat *st)
+{
+ return mrb_stat0(mrb, obj, st, 0);
+}
+
+static int
+mrb_lstat(mrb_state *mrb, mrb_value obj, struct stat *st)
+{
+ return mrb_stat0(mrb, obj, st, 1);
+}
+
/*
* Document-method: directory?
*
@@ -142,7 +158,7 @@ mrb_filetest_s_symlink_p(mrb_state *mrb, mrb_value klass)
mrb_get_args(mrb, "o", &obj);
- if (mrb_stat(mrb, obj, &st) < 0)
+ if (mrb_lstat(mrb, obj, &st) == -1)
return mrb_false_value();
if (S_ISLNK(st.st_mode))
return mrb_true_value();