source: EcnlProtoTool/trunk/mrbgems/mruby-io/test/mruby_io_test.c@ 279

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

ファイルを追加、更新。

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 5.4 KB
Line 
1#include <sys/types.h>
2#include <errno.h>
3
4#if defined(_WIN32) || defined(_WIN64)
5 #include <winsock.h>
6 #include <io.h>
7#else
8 #include <sys/socket.h>
9 #include <unistd.h>
10 #include <sys/un.h>
11#endif
12
13#include <sys/stat.h>
14#include <stdio.h>
15#include <stdlib.h>
16
17#include "mruby.h"
18#include "mruby/array.h"
19#include "mruby/error.h"
20#include "mruby/string.h"
21#include "mruby/variable.h"
22
23static mrb_value
24mrb_io_test_io_setup(mrb_state *mrb, mrb_value self)
25{
26 char rfname[] = "tmp.mruby-io-test.XXXXXXXX";
27 char wfname[] = "tmp.mruby-io-test.XXXXXXXX";
28 char symlinkname[] = "tmp.mruby-io-test.XXXXXXXX";
29 char socketname[] = "/tmp/mruby-io-test.XXXXXXXX";
30 char msg[] = "mruby io test\n";
31 mode_t mask;
32 int fd0, fd1, fd2, fd3;
33 FILE *fp;
34
35#ifndef _WIN32
36 struct sockaddr_un sun0;
37#endif
38
39 mask = umask(077);
40 fd0 = mkstemp(rfname);
41 fd1 = mkstemp(wfname);
42#ifndef _WIN32
43 fd2 = mkstemp(symlinkname);
44 fd3 = mkstemp(socketname);
45#endif
46 if (fd0 == -1 || fd1 == -1 || fd2 == -1 || fd3 == -1) {
47 mrb_raise(mrb, E_RUNTIME_ERROR, "can't create temporary file");
48 return mrb_nil_value();
49 }
50 umask(mask);
51
52 mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_rfname"), mrb_str_new_cstr(mrb, rfname));
53 mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_wfname"), mrb_str_new_cstr(mrb, wfname));
54 mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_symlinkname"), mrb_str_new_cstr(mrb, symlinkname));
55 mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_socketname"), mrb_str_new_cstr(mrb, socketname));
56 mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_msg"), mrb_str_new_cstr(mrb, msg));
57
58 fp = fopen(rfname, "wb");
59 if (fp == NULL) {
60 mrb_raise(mrb, E_RUNTIME_ERROR, "can't open temporary file");
61 return mrb_nil_value();
62 }
63 fputs(msg, fp);
64 fclose(fp);
65
66 fp = fopen(wfname, "wb");
67 if (fp == NULL) {
68 mrb_raise(mrb, E_RUNTIME_ERROR, "can't open temporary file");
69 return mrb_nil_value();
70 }
71 fclose(fp);
72
73#ifndef _WIN32
74 unlink(symlinkname);
75 close(fd2);
76 if (symlink(rfname, symlinkname) == -1) {
77 mrb_raise(mrb, E_RUNTIME_ERROR, "can't make a symbolic link");
78 }
79
80 unlink(socketname);
81 close(fd3);
82 fd3 = socket(AF_UNIX, SOCK_STREAM, 0);
83 if (fd3 == -1) {
84 mrb_raise(mrb, E_RUNTIME_ERROR, "can't make a socket");
85 }
86 sun0.sun_family = AF_UNIX;
87 snprintf(sun0.sun_path, sizeof(sun0.sun_path), "%s", socketname);
88 if (bind(fd3, (struct sockaddr *)&sun0, sizeof(sun0)) == -1) {
89 mrb_raisef(mrb, E_RUNTIME_ERROR, "can't bind AF_UNIX socket to %S: %S",
90 mrb_str_new_cstr(mrb, sun0.sun_path),
91 mrb_fixnum_value(errno));
92 }
93 close(fd3);
94#endif
95
96 return mrb_true_value();
97}
98
99static mrb_value
100mrb_io_test_io_cleanup(mrb_state *mrb, mrb_value self)
101{
102 mrb_value rfname = mrb_gv_get(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_rfname"));
103 mrb_value wfname = mrb_gv_get(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_wfname"));
104 mrb_value symlinkname = mrb_gv_get(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_symlinkname"));
105 mrb_value socketname = mrb_gv_get(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_socketname"));
106
107 if (mrb_type(rfname) == MRB_TT_STRING) {
108 remove(RSTRING_PTR(rfname));
109 }
110 if (mrb_type(wfname) == MRB_TT_STRING) {
111 remove(RSTRING_PTR(wfname));
112 }
113 if (mrb_type(symlinkname) == MRB_TT_STRING) {
114 remove(RSTRING_PTR(symlinkname));
115 }
116 if (mrb_type(socketname) == MRB_TT_STRING) {
117 remove(RSTRING_PTR(socketname));
118 }
119
120 mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_rfname"), mrb_nil_value());
121 mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_wfname"), mrb_nil_value());
122 mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_symlinkname"), mrb_nil_value());
123 mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_socketname"), mrb_nil_value());
124 mrb_gv_set(mrb, mrb_intern_cstr(mrb, "$mrbtest_io_msg"), mrb_nil_value());
125
126 return mrb_nil_value();
127}
128
129static mrb_value
130mrb_io_test_file_setup(mrb_state *mrb, mrb_value self)
131{
132 mrb_value ary = mrb_io_test_io_setup(mrb, self);
133#ifndef _WIN32
134 if (symlink("/usr/bin", "test-bin") == -1) {
135 mrb_raise(mrb, E_RUNTIME_ERROR, "can't make a symbolic link");
136 }
137#endif
138
139 return ary;
140}
141
142static mrb_value
143mrb_io_test_file_cleanup(mrb_state *mrb, mrb_value self)
144{
145 mrb_io_test_io_cleanup(mrb, self);
146 remove("test-bin");
147
148 return mrb_nil_value();
149}
150
151static mrb_value
152mrb_io_test_mkdtemp(mrb_state *mrb, mrb_value klass)
153{
154 mrb_value str;
155 char *cp;
156
157 mrb_get_args(mrb, "S", &str);
158 cp = mrb_str_to_cstr(mrb, str);
159 if (mkdtemp(cp) == NULL) {
160 mrb_sys_fail(mrb, "mkdtemp");
161 }
162 return mrb_str_new_cstr(mrb, cp);
163}
164
165static mrb_value
166mrb_io_test_rmdir(mrb_state *mrb, mrb_value klass)
167{
168 mrb_value str;
169 char *cp;
170
171 mrb_get_args(mrb, "S", &str);
172 cp = mrb_str_to_cstr(mrb, str);
173 if (rmdir(cp) == -1) {
174 mrb_sys_fail(mrb, "rmdir");
175 }
176 return mrb_true_value();
177}
178
179void
180mrb_mruby_io_gem_test(mrb_state* mrb)
181{
182 struct RClass *io_test = mrb_define_module(mrb, "MRubyIOTestUtil");
183 mrb_define_class_method(mrb, io_test, "io_test_setup", mrb_io_test_io_setup, MRB_ARGS_NONE());
184 mrb_define_class_method(mrb, io_test, "io_test_cleanup", mrb_io_test_io_cleanup, MRB_ARGS_NONE());
185
186 mrb_define_class_method(mrb, io_test, "file_test_setup", mrb_io_test_file_setup, MRB_ARGS_NONE());
187 mrb_define_class_method(mrb, io_test, "file_test_cleanup", mrb_io_test_file_cleanup, MRB_ARGS_NONE());
188
189 mrb_define_class_method(mrb, io_test, "mkdtemp", mrb_io_test_mkdtemp, MRB_ARGS_REQ(1));
190 mrb_define_class_method(mrb, io_test, "rmdir", mrb_io_test_rmdir, MRB_ARGS_REQ(1));
191}
Note: See TracBrowser for help on using the repository browser.