summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authortakahashim <[email protected]>2015-11-22 13:13:52 +0900
committertakahashim <[email protected]>2015-11-22 13:13:52 +0900
commit2cc674e58e04a0ae403e0429013ef79e129afeb4 (patch)
tree7f2adbdee16c9abbc760ec428a95f629f0a46d95
parent14cdff075dd4e0e6f39a397a399a28ef0a13933f (diff)
downloadmruby-2cc674e58e04a0ae403e0429013ef79e129afeb4.tar.gz
mruby-2cc674e58e04a0ae403e0429013ef79e129afeb4.zip
add File.symlink
-rw-r--r--src/file.c21
-rw-r--r--test/file.rb15
2 files changed, 36 insertions, 0 deletions
diff --git a/src/file.c b/src/file.c
index feb8558ed..9054b67aa 100644
--- a/src/file.c
+++ b/src/file.c
@@ -290,6 +290,26 @@ mrb_file_flock(mrb_state *mrb, mrb_value self)
}
#endif
+static mrb_value
+mrb_file_s_symlink(mrb_state *mrb, mrb_value klass)
+{
+#if defined(_WIN32) || defined(_WIN64)
+ mrb_raise(mrb, E_NOTIMP_ERROR, "symlink is not supported on this platform");
+#else
+ mrb_value from, to;
+ const char *src, *dst;
+
+ mrb_get_args(mrb, "SS", &from, &to);
+ src = mrb_string_value_cstr(mrb, &from);
+ dst = mrb_string_value_cstr(mrb, &to);
+
+ if (symlink(src, dst) < 0) {
+ mrb_sys_fail(mrb, mrb_str_to_cstr(mrb, mrb_format(mrb, "(%S, %S)", from, to)));
+ }
+#endif
+ return mrb_fixnum_value(0);
+}
+
void
mrb_init_file(mrb_state *mrb)
{
@@ -302,6 +322,7 @@ mrb_init_file(mrb_state *mrb)
mrb_define_class_method(mrb, file, "delete", mrb_file_s_unlink, MRB_ARGS_ANY());
mrb_define_class_method(mrb, file, "unlink", mrb_file_s_unlink, MRB_ARGS_ANY());
mrb_define_class_method(mrb, file, "rename", mrb_file_s_rename, MRB_ARGS_REQ(2));
+ mrb_define_class_method(mrb, file, "symlink", mrb_file_s_symlink, MRB_ARGS_REQ(2));
mrb_define_class_method(mrb, file, "dirname", mrb_file_dirname, MRB_ARGS_REQ(1));
mrb_define_class_method(mrb, file, "basename", mrb_file_basename, MRB_ARGS_REQ(1));
diff --git a/test/file.rb b/test/file.rb
index 487b54f38..ef8be37ec 100644
--- a/test/file.rb
+++ b/test/file.rb
@@ -115,3 +115,18 @@ assert('File.path') do
assert_raise(TypeError) { File.path(123) }
end
+
+assert('File.symlink') do
+ target_name = "/usr/bin"
+ symlink_name = "test-bin-dummy"
+ if !File.exist?(target_name)
+ skip("target directory of File.symlink is not found")
+ else
+ assert_equal 0, File.symlink(target_name, symlink_name)
+ begin
+ assert_equal true, File.symlink?(symlink_name)
+ ensure
+ File.delete symlink_name
+ end
+ end
+end