source: EcnlProtoTool/trunk/mrbgems/mruby-dir/test/dirtest.c@ 321

Last change on this file since 321 was 321, checked in by coas-nagasima, 7 years ago

文字コードを設定

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 3.4 KB
Line 
1#include <sys/types.h>
2#include <sys/stat.h>
3
4#include <dirent.h>
5#include <unistd.h>
6
7#include <stdio.h>
8#include <stdlib.h>
9#include <string.h>
10
11#include "mruby.h"
12#include "mruby/string.h"
13#include "mruby/variable.h"
14
15
16mrb_value
17mrb_dirtest_setup(mrb_state *mrb, mrb_value klass)
18{
19 mrb_value s;
20 char buf[1024];
21 const char *aname = "a";
22 const char *bname = "b";
23
24 /* save current working directory */
25 if (getcwd(buf, sizeof(buf)) == NULL) {
26 mrb_raise(mrb, E_RUNTIME_ERROR, "getcwd() failed");
27 }
28 mrb_cv_set(mrb, klass, mrb_intern_cstr(mrb, "pwd"), mrb_str_new_cstr(mrb, buf));
29
30 /* create sandbox */
31#if defined(_WIN32) || defined(_WIN64)
32 snprintf(buf, sizeof(buf), "%s\\mruby-dir-test.XXXXXX", _getcwd(NULL,0));
33 if ((mktemp(buf) == NULL) || mkdir(buf) != 0) {
34 mrb_raisef(mrb, E_RUNTIME_ERROR, "mkdtemp(%S) failed", mrb_str_new_cstr(mrb, buf));
35 }
36#else
37 snprintf(buf, sizeof(buf), "%s/mruby-dir-test.XXXXXX", P_tmpdir);
38 if (mkdtemp(buf) == NULL) {
39 mrb_raisef(mrb, E_RUNTIME_ERROR, "mkdtemp(%S) failed", mrb_str_new_cstr(mrb, buf));
40 }
41#endif
42 s = mrb_str_new_cstr(mrb, buf);
43 mrb_cv_set(mrb, klass, mrb_intern_cstr(mrb, "sandbox"), s);
44
45 /* go to sandbox */
46 if (chdir(buf) == -1) {
47 rmdir(buf);
48 mrb_raisef(mrb, E_RUNTIME_ERROR, "chdir(%S) failed", s);
49 }
50
51 /* make some directories in the sandbox */
52#if defined(_WIN32) || defined(_WIN64)
53 if (mkdir(aname) == -1) {
54#else
55 if (mkdir(aname, 0) == -1) {
56#endif
57 chdir("..");
58 rmdir(buf);
59 mrb_raisef(mrb, E_RUNTIME_ERROR, "mkdir(%S) failed", mrb_str_new_cstr(mrb, aname));
60 }
61#if defined(_WIN32) || defined(_WIN64)
62 if (mkdir(bname) == -1) {
63#else
64 if (mkdir(bname, 0) == -1) {
65#endif
66 rmdir(aname);
67 chdir("..");
68 rmdir(buf);
69 mrb_raisef(mrb, E_RUNTIME_ERROR, "mkdir(%S) failed", mrb_str_new_cstr(mrb, bname));
70 }
71
72 return mrb_true_value();
73}
74
75mrb_value
76mrb_dirtest_teardown(mrb_state *mrb, mrb_value klass)
77{
78 mrb_value d, sandbox;
79 DIR *dirp;
80 struct dirent *dp;
81 const char *path;
82
83 /* cleanup sandbox */
84 sandbox = mrb_cv_get(mrb, klass, mrb_intern_cstr(mrb, "sandbox"));
85 path = mrb_str_to_cstr(mrb, sandbox);
86
87 dirp = opendir(path);
88 while ((dp = readdir(dirp)) != NULL) {
89 if (strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0)
90 continue;
91 if (rmdir(dp->d_name) == -1) {
92 mrb_raisef(mrb, E_RUNTIME_ERROR, "rmdir(%S) failed", mrb_str_new_cstr(mrb, dp->d_name));
93 }
94 }
95 closedir(dirp);
96
97 /* back to original pwd */
98 d = mrb_cv_get(mrb, klass, mrb_intern_cstr(mrb, "pwd"));
99 path = mrb_str_to_cstr(mrb, d);
100 if (chdir(path) == -1) {
101 mrb_raisef(mrb, E_RUNTIME_ERROR, "chdir(%S) failed", d);
102 }
103
104 /* remove sandbox directory */
105 sandbox = mrb_cv_get(mrb, klass, mrb_intern_cstr(mrb, "sandbox"));
106 path = mrb_str_to_cstr(mrb, sandbox);
107 if (rmdir(path) == -1) {
108 mrb_raisef(mrb, E_RUNTIME_ERROR, "rmdir(%S) failed", sandbox);
109 }
110
111 return mrb_true_value();
112}
113
114mrb_value
115mrb_dirtest_sandbox(mrb_state *mrb, mrb_value klass)
116{
117 return mrb_cv_get(mrb, klass, mrb_intern_cstr(mrb, "sandbox"));
118}
119
120void
121mrb_mruby_dir_gem_test(mrb_state *mrb)
122{
123 struct RClass *c = mrb_define_module(mrb, "DirTest");
124
125 mrb_define_class_method(mrb, c, "sandbox", mrb_dirtest_sandbox, MRB_ARGS_NONE());
126 mrb_define_class_method(mrb, c, "setup", mrb_dirtest_setup, MRB_ARGS_NONE());
127 mrb_define_class_method(mrb, c, "teardown", mrb_dirtest_teardown, MRB_ARGS_NONE());
128}
129
Note: See TracBrowser for help on using the repository browser.