summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorKohei Suzuki <[email protected]>2016-12-16 01:20:08 +0900
committerKohei Suzuki <[email protected]>2016-12-16 01:20:08 +0900
commit698378f076380b9668b3da9d1e1d0617073f917b (patch)
tree5940a64ed1584064c33a12f3fc40558d41fc706a /src
parent0eafb089c9c913066f39608b5cc34001da698a59 (diff)
downloadmruby-698378f076380b9668b3da9d1e1d0617073f917b.tar.gz
mruby-698378f076380b9668b3da9d1e1d0617073f917b.zip
Add File.chmod
Diffstat (limited to 'src')
-rw-r--r--src/file.c20
1 files changed, 20 insertions, 0 deletions
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));