summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTomoyuki Sahara <[email protected]>2016-12-16 22:54:20 +0900
committerGitHub <[email protected]>2016-12-16 22:54:20 +0900
commit7e8973629143de1952365803df0c45a89d462857 (patch)
tree5940a64ed1584064c33a12f3fc40558d41fc706a
parent0eafb089c9c913066f39608b5cc34001da698a59 (diff)
parent698378f076380b9668b3da9d1e1d0617073f917b (diff)
downloadmruby-7e8973629143de1952365803df0c45a89d462857.tar.gz
mruby-7e8973629143de1952365803df0c45a89d462857.zip
Merge pull request #70 from eagletmt/chmod
Add File.chmod
-rw-r--r--README.md2
-rw-r--r--src/file.c20
-rw-r--r--test/file.rb9
3 files changed, 30 insertions, 1 deletions
diff --git a/README.md b/README.md
index dd7accd6f..604361f25 100644
--- a/README.md
+++ b/README.md
@@ -106,7 +106,7 @@ Add the line below to your `build_config.rb`:
| File.basename | o | |
| File.blockdev? | | FileTest |
| File.chardev? | | FileTest |
-| File.chmod | | |
+| File.chmod | o | |
| File.chown | | |
| File.ctime | | |
| File.delete, File.unlink | o | |
diff --git a/src/file.c b/src/file.c
index 84aba39ad..2131db654 100644
--- a/src/file.c
+++ b/src/file.c
@@ -334,6 +334,25 @@ mrb_file_s_symlink(mrb_state *mrb, mrb_value klass)
return mrb_fixnum_value(0);
}
+static mrb_value
+mrb_file_s_chmod(mrb_state *mrb, mrb_value klass) {
+ mrb_int mode;
+ mrb_int argc, i;
+ mrb_value *filenames;
+ int ai = mrb_gc_arena_save(mrb);
+
+ mrb_get_args(mrb, "i*", &mode, &filenames, &argc);
+ for (i = 0; i < argc; i++) {
+ char *path = mrb_str_to_cstr(mrb, filenames[i]);
+ if (CHMOD(path, mode) == -1) {
+ mrb_sys_fail(mrb, path);
+ }
+ }
+
+ mrb_gc_arena_restore(mrb, ai);
+ return mrb_fixnum_value(argc);
+}
+
void
mrb_init_file(mrb_state *mrb)
{
@@ -347,6 +366,7 @@ mrb_init_file(mrb_state *mrb)
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, "chmod", mrb_file_s_chmod, MRB_ARGS_REQ(1) | MRB_ARGS_REST());
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 48a6eea9d..f5607bbaa 100644
--- a/test/file.rb
+++ b/test/file.rb
@@ -146,3 +146,12 @@ assert('File.symlink') do
end
end
end
+
+assert('File.chmod') do
+ File.open('chmod-test', 'w') {}
+ begin
+ assert_equal 1, File.chmod(0400, 'chmod-test')
+ ensure
+ File.delete('chmod-test')
+ end
+end