diff options
| author | Tomoyuki Sahara <[email protected]> | 2013-08-08 13:58:47 +0900 |
|---|---|---|
| committer | Tomoyuki Sahara <[email protected]> | 2013-08-08 13:58:47 +0900 |
| commit | c49541058c40623b0c337a7e95193142c8dc9947 (patch) | |
| tree | 00fd0b62169eea3cf147a0316732dcc192c0e8c0 /src/file_test.c | |
| parent | 4f3a749da10e896f1faa03cef62b79624c575be7 (diff) | |
| download | mruby-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.c | 22 |
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(); |
