script_core 0.2.5 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +7 -1
- data/ext/enterprise_script_service/libseccomp/.travis.yml +3 -5
- data/ext/enterprise_script_service/libseccomp/CHANGELOG +10 -0
- data/ext/enterprise_script_service/libseccomp/CREDITS +3 -0
- data/ext/enterprise_script_service/libseccomp/README.md +18 -0
- data/ext/enterprise_script_service/libseccomp/configure.ac +1 -1
- data/ext/enterprise_script_service/libseccomp/include/seccomp-syscalls.h +7 -0
- data/ext/enterprise_script_service/libseccomp/src/arch-s390-syscalls.c +16 -0
- data/ext/enterprise_script_service/libseccomp/src/arch-s390x-syscalls.c +16 -0
- data/ext/enterprise_script_service/libseccomp/tests/.gitignore +1 -0
- data/ext/enterprise_script_service/libseccomp/tests/15-basic-resolver.c +3 -3
- data/ext/enterprise_script_service/libseccomp/tests/52-basic-load.c +48 -0
- data/ext/enterprise_script_service/libseccomp/tests/52-basic-load.py +38 -0
- data/ext/enterprise_script_service/libseccomp/tests/52-basic-load.tests +11 -0
- data/ext/enterprise_script_service/libseccomp/tests/Makefile.am +6 -3
- data/ext/enterprise_script_service/libseccomp/tests/regression +4 -0
- data/ext/enterprise_script_service/libseccomp/tools/Makefile.am +0 -3
- data/ext/enterprise_script_service/libseccomp/tools/scmp_bpf_sim.c +2 -0
- data/ext/enterprise_script_service/mruby/.github/workflows/build.yml +106 -0
- data/ext/enterprise_script_service/mruby/.github/workflows/main.yml +24 -0
- data/ext/enterprise_script_service/mruby/.gitignore +3 -0
- data/ext/enterprise_script_service/mruby/.travis.yml +6 -9
- data/ext/enterprise_script_service/mruby/AUTHORS +1 -0
- data/ext/enterprise_script_service/mruby/Doxyfile +1 -1
- data/ext/enterprise_script_service/mruby/LICENSE +1 -1
- data/ext/enterprise_script_service/mruby/README.md +6 -2
- data/ext/enterprise_script_service/mruby/appveyor.yml +9 -12
- data/ext/enterprise_script_service/mruby/appveyor_config.rb +9 -0
- data/ext/enterprise_script_service/mruby/build_config.rb +6 -6
- data/ext/enterprise_script_service/mruby/doc/guides/compile.md +6 -2
- data/ext/enterprise_script_service/mruby/doc/guides/debugger.md +1 -1
- data/ext/enterprise_script_service/mruby/doc/guides/mrbconf.md +4 -8
- data/ext/enterprise_script_service/mruby/doc/limitations.md +10 -10
- data/ext/enterprise_script_service/mruby/doc/opcode.md +108 -95
- data/ext/enterprise_script_service/mruby/examples/targets/build_config_ArduinoDue.rb +2 -2
- data/ext/enterprise_script_service/mruby/examples/targets/build_config_IntelEdison.rb +2 -2
- data/ext/enterprise_script_service/mruby/examples/targets/build_config_IntelGalileo.rb +2 -2
- data/ext/enterprise_script_service/mruby/examples/targets/build_config_RX630.rb +2 -2
- data/ext/enterprise_script_service/mruby/examples/targets/build_config_chipKITMax32.rb +2 -2
- data/ext/enterprise_script_service/mruby/examples/targets/build_config_dreamcast_shelf.rb +108 -0
- data/ext/enterprise_script_service/mruby/include/mrbconf.h +10 -7
- data/ext/enterprise_script_service/mruby/include/mruby.h +11 -9
- data/ext/enterprise_script_service/mruby/include/mruby/array.h +4 -0
- data/ext/enterprise_script_service/mruby/include/mruby/boxing_nan.h +11 -2
- data/ext/enterprise_script_service/mruby/include/mruby/boxing_word.h +0 -9
- data/ext/enterprise_script_service/mruby/include/mruby/common.h +10 -0
- data/ext/enterprise_script_service/mruby/include/mruby/compile.h +11 -3
- data/ext/enterprise_script_service/mruby/include/mruby/dump.h +1 -17
- data/ext/enterprise_script_service/mruby/include/mruby/irep.h +10 -0
- data/ext/enterprise_script_service/mruby/include/mruby/istruct.h +4 -1
- data/ext/enterprise_script_service/mruby/include/mruby/khash.h +23 -5
- data/ext/enterprise_script_service/mruby/include/mruby/numeric.h +1 -0
- data/ext/enterprise_script_service/mruby/include/mruby/ops.h +3 -2
- data/ext/enterprise_script_service/mruby/include/mruby/string.h +2 -1
- data/ext/enterprise_script_service/mruby/include/mruby/value.h +7 -12
- data/ext/enterprise_script_service/mruby/include/mruby/version.h +4 -4
- data/ext/enterprise_script_service/mruby/lib/mruby/build.rb +2 -30
- data/ext/enterprise_script_service/mruby/lib/mruby/build/command.rb +21 -46
- data/ext/enterprise_script_service/mruby/lib/mruby/gem.rb +9 -0
- data/ext/enterprise_script_service/mruby/lib/mruby/source.rb +3 -1
- data/ext/enterprise_script_service/mruby/mrbgems/default.gembox +7 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +0 -31
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/test/array.rb +0 -13
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-config/mrbgem.rake +5 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +0 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +5 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +5 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +7 -11
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +0 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +6 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c +6 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-class-ext/src/class.c +6 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/codegen.c +76 -48
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/parse.y +107 -32
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/y.tab.c +13153 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/mrbgem.rake +13 -15
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-error/src/exception.c +3 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-eval/src/eval.c +2 -213
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-eval/test/eval.rb +21 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-hash-ext/src/hash-ext.c +1 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/include/mruby/ext/io.h +39 -7
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrbgem.rake +2 -8
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/file_constants.rb +0 -16
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/io.rb +7 -12
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file.c +76 -30
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file_test.c +9 -10
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/io.c +323 -120
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/file.rb +18 -12
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/io.rb +32 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/mruby_io_test.c +57 -49
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/src/metaprog.c +15 -17
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/test/metaprog.rb +9 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/src/method.c +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-object-ext/src/object.c +3 -12
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/src/pack.c +113 -10
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-print/src/print.c +5 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-proc-ext/src/proc.c +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/src/rational.c +9 -9
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sleep/src/mrb_sleep.c +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/mrbgem.rake +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/test/sockettest.c +3 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/src/sprintf.c +61 -24
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +5 -23
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/src/string.c +3 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/mrbgem.rake +1 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-time/src/time.c +6 -5
- data/ext/enterprise_script_service/mruby/mrblib/hash.rb +3 -3
- data/ext/enterprise_script_service/mruby/src/array.c +11 -0
- data/ext/enterprise_script_service/mruby/src/backtrace.c +2 -2
- data/ext/enterprise_script_service/mruby/src/class.c +26 -11
- data/ext/enterprise_script_service/mruby/src/codedump.c +4 -0
- data/ext/enterprise_script_service/mruby/src/debug.c +8 -5
- data/ext/enterprise_script_service/mruby/src/dump.c +3 -65
- data/ext/enterprise_script_service/mruby/src/error.c +57 -5
- data/ext/enterprise_script_service/mruby/src/etc.c +13 -4
- data/ext/enterprise_script_service/mruby/src/fmt_fp.c +98 -21
- data/ext/enterprise_script_service/mruby/src/gc.c +10 -275
- data/ext/enterprise_script_service/mruby/src/hash.c +5 -6
- data/ext/enterprise_script_service/mruby/src/kernel.c +2 -2
- data/ext/enterprise_script_service/mruby/src/load.c +56 -30
- data/ext/enterprise_script_service/mruby/src/numeric.c +22 -10
- data/ext/enterprise_script_service/mruby/src/object.c +12 -4
- data/ext/enterprise_script_service/mruby/src/print.c +27 -3
- data/ext/enterprise_script_service/mruby/src/proc.c +21 -1
- data/ext/enterprise_script_service/mruby/src/state.c +34 -11
- data/ext/enterprise_script_service/mruby/src/string.c +69 -35
- data/ext/enterprise_script_service/mruby/src/symbol.c +12 -10
- data/ext/enterprise_script_service/mruby/src/vm.c +21 -30
- data/ext/enterprise_script_service/mruby/tasks/gitlab.rake +19 -22
- data/ext/enterprise_script_service/mruby/tasks/mrbgems.rake +1 -1
- data/ext/enterprise_script_service/mruby/tasks/toolchains/android.rake +46 -1
- data/ext/enterprise_script_service/mruby/tasks/toolchains/gcc.rake +3 -3
- data/ext/enterprise_script_service/mruby/tasks/toolchains/openwrt.rake +6 -6
- data/ext/enterprise_script_service/mruby/tasks/toolchains/visualcpp.rake +8 -8
- data/ext/enterprise_script_service/mruby/test/assert.rb +5 -4
- data/ext/enterprise_script_service/mruby/test/t/ensure.rb +8 -26
- data/ext/enterprise_script_service/mruby/test/t/exception.rb +2 -2
- data/ext/enterprise_script_service/mruby/test/t/kernel.rb +8 -24
- data/ext/enterprise_script_service/mruby/travis_config.rb +0 -14
- data/ext/enterprise_script_service/msgpack/.github/depends/boost.sh +56 -0
- data/ext/enterprise_script_service/msgpack/.github/workflows/coverage.yml +62 -0
- data/ext/enterprise_script_service/msgpack/.github/workflows/gha.yml +304 -0
- data/ext/enterprise_script_service/msgpack/CHANGELOG.md +11 -0
- data/ext/enterprise_script_service/msgpack/CMakeLists.txt +82 -39
- data/ext/enterprise_script_service/msgpack/Files.cmake +22 -12
- data/ext/enterprise_script_service/msgpack/QUICKSTART-C.md +26 -29
- data/ext/enterprise_script_service/msgpack/README.md +3 -2
- data/ext/enterprise_script_service/msgpack/appveyor.yml +6 -2
- data/ext/enterprise_script_service/msgpack/ci/build_cmake.sh +3 -1
- data/ext/enterprise_script_service/msgpack/cmake/CodeCoverage.cmake +55 -0
- data/ext/enterprise_script_service/msgpack/codecov.yml +36 -0
- data/ext/enterprise_script_service/msgpack/example/CMakeLists.txt +9 -5
- data/ext/enterprise_script_service/msgpack/example/boost/CMakeLists.txt +1 -1
- data/ext/enterprise_script_service/msgpack/example/c/CMakeLists.txt +17 -6
- data/ext/enterprise_script_service/msgpack/example/c/boundary.c +296 -0
- data/ext/enterprise_script_service/msgpack/example/c/jsonconv.c +419 -0
- data/ext/enterprise_script_service/msgpack/example/c/simple_c.c +1 -1
- data/ext/enterprise_script_service/msgpack/example/cpp03/CMakeLists.txt +3 -3
- data/ext/enterprise_script_service/msgpack/example/cpp11/CMakeLists.txt +2 -2
- data/ext/enterprise_script_service/msgpack/example/x3/CMakeLists.txt +2 -2
- data/ext/enterprise_script_service/msgpack/include/msgpack/pack.h +24 -1
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/array_ref.hpp +5 -4
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/boost/optional.hpp +4 -4
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/cpp17/vector_byte.hpp +8 -8
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/map.hpp +4 -4
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/vector.hpp +4 -4
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/vector_char.hpp +8 -8
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/vector_unsigned_char.hpp +8 -8
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/wstring.hpp +4 -4
- data/ext/enterprise_script_service/msgpack/include/msgpack/v3/unpack.hpp +6 -6
- data/ext/enterprise_script_service/msgpack/include/msgpack/version_master.h +2 -2
- data/ext/enterprise_script_service/msgpack/include/msgpack/zbuffer.h +4 -4
- data/ext/enterprise_script_service/msgpack/make_file_list.sh +38 -11
- data/ext/enterprise_script_service/msgpack/src/vrefbuffer.c +6 -0
- data/ext/enterprise_script_service/msgpack/test/CMakeLists.txt +86 -64
- data/ext/enterprise_script_service/msgpack/test/array_ref.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/boost_fusion.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/boost_optional.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/boost_string_ref.cpp +4 -1
- data/ext/enterprise_script_service/msgpack/test/boost_string_view.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/boost_variant.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/buffer.cpp +4 -47
- data/ext/enterprise_script_service/msgpack/test/buffer_c.cpp +148 -0
- data/ext/enterprise_script_service/msgpack/test/carray.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/cases.cpp +8 -4
- data/ext/enterprise_script_service/msgpack/test/convert.cpp +8 -4
- data/ext/enterprise_script_service/msgpack/test/fixint.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/fixint_c.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/fuzz_unpack_pack_fuzzer_cpp11.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/iterator_cpp11.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/json.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/limit.cpp +8 -4
- data/ext/enterprise_script_service/msgpack/test/msgpack_basic.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_c.cpp +159 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_container.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_cpp11.cpp +32 -27
- data/ext/enterprise_script_service/msgpack/test/msgpack_cpp17.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_stream.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_tuple.cpp +4 -1
- data/ext/enterprise_script_service/msgpack/test/msgpack_vref.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_x3_parse.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/object.cpp +4 -1
- data/ext/enterprise_script_service/msgpack/test/object_with_zone.cpp +12 -8
- data/ext/enterprise_script_service/msgpack/test/pack_unpack.cpp +30 -26
- data/ext/enterprise_script_service/msgpack/test/pack_unpack_c.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/raw.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/reference.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/reference_cpp11.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/reference_wrapper_cpp11.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/shared_ptr_cpp11.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/size_equal_only.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/streaming.cpp +8 -4
- data/ext/enterprise_script_service/msgpack/test/streaming_c.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/unique_ptr_cpp11.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/user_class.cpp +16 -12
- data/ext/enterprise_script_service/msgpack/test/version.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/visitor.cpp +4 -0
- data/ext/enterprise_script_service/msgpack/test/zone.cpp +4 -0
- data/lib/script_core/version.rb +1 -1
- data/script_core.gemspec +1 -1
- metadata +23 -9
- data/ext/enterprise_script_service/msgpack/.travis.yml +0 -258
|
@@ -170,21 +170,16 @@ def seek(i, whence = SEEK_SET)
|
|
|
170
170
|
end
|
|
171
171
|
|
|
172
172
|
def _read_buf
|
|
173
|
-
return @buf if @buf && @buf.bytesize
|
|
174
|
-
@buf
|
|
175
|
-
begin
|
|
176
|
-
@buf += sysread(BUF_SIZE)
|
|
177
|
-
rescue EOFError => e
|
|
178
|
-
raise e if @buf.empty?
|
|
179
|
-
end
|
|
173
|
+
return @buf if @buf && @buf.bytesize > 0
|
|
174
|
+
sysread(BUF_SIZE, @buf)
|
|
180
175
|
end
|
|
181
176
|
|
|
182
177
|
def ungetc(substr)
|
|
183
178
|
raise TypeError.new "expect String, got #{substr.class}" unless substr.is_a?(String)
|
|
184
179
|
if @buf.empty?
|
|
185
|
-
@buf
|
|
180
|
+
@buf.replace(substr)
|
|
186
181
|
else
|
|
187
|
-
@buf = substr
|
|
182
|
+
@buf[0,0] = substr
|
|
188
183
|
end
|
|
189
184
|
nil
|
|
190
185
|
end
|
|
@@ -288,15 +283,15 @@ def gets(*args)
|
|
|
288
283
|
|
|
289
284
|
def readchar
|
|
290
285
|
_read_buf
|
|
291
|
-
|
|
292
|
-
@buf[0] = ""
|
|
293
|
-
c
|
|
286
|
+
_readchar(@buf)
|
|
294
287
|
end
|
|
295
288
|
|
|
296
289
|
def getc
|
|
297
290
|
begin
|
|
298
291
|
readchar
|
|
299
292
|
rescue EOFError
|
|
293
|
+
c = @buf[0]
|
|
294
|
+
@buf[0,1]="" if c
|
|
300
295
|
nil
|
|
301
296
|
end
|
|
302
297
|
end
|
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
#if defined(_WIN32) || defined(_WIN64)
|
|
49
49
|
#define PATH_SEPARATOR ";"
|
|
50
50
|
#define FILE_ALT_SEPARATOR "\\"
|
|
51
|
+
#define VOLUME_SEPARATOR ":"
|
|
51
52
|
#else
|
|
52
53
|
#define PATH_SEPARATOR ":"
|
|
53
54
|
#endif
|
|
@@ -88,7 +89,7 @@ flock(int fd, int operation) {
|
|
|
88
89
|
}
|
|
89
90
|
#endif
|
|
90
91
|
|
|
91
|
-
mrb_value
|
|
92
|
+
static mrb_value
|
|
92
93
|
mrb_file_s_umask(mrb_state *mrb, mrb_value klass)
|
|
93
94
|
{
|
|
94
95
|
#if defined(_WIN32) || defined(_WIN64)
|
|
@@ -264,7 +265,7 @@ mrb_file_realpath(mrb_state *mrb, mrb_value klass)
|
|
|
264
265
|
return result;
|
|
265
266
|
}
|
|
266
267
|
|
|
267
|
-
mrb_value
|
|
268
|
+
static mrb_value
|
|
268
269
|
mrb_file__getwd(mrb_state *mrb, mrb_value klass)
|
|
269
270
|
{
|
|
270
271
|
mrb_value path;
|
|
@@ -279,12 +280,59 @@ mrb_file__getwd(mrb_state *mrb, mrb_value klass)
|
|
|
279
280
|
return path;
|
|
280
281
|
}
|
|
281
282
|
|
|
283
|
+
#ifdef _WIN32
|
|
284
|
+
#define IS_FILESEP(x) (x == (*(char*)(FILE_SEPARATOR)) || x == (*(char*)(FILE_ALT_SEPARATOR)))
|
|
285
|
+
#define IS_VOLSEP(x) (x == (*(char*)(VOLUME_SEPARATOR)))
|
|
286
|
+
#define IS_DEVICEID(x) (x == '.' || x == '?')
|
|
287
|
+
#define CHECK_UNCDEV_PATH (IS_FILESEP(path[0]) && IS_FILESEP(path[1]))
|
|
288
|
+
|
|
289
|
+
static int
|
|
290
|
+
is_absolute_traditional_path(const char *path, size_t len)
|
|
291
|
+
{
|
|
292
|
+
if (len < 3) return 0;
|
|
293
|
+
return (ISALPHA(path[0]) && IS_VOLSEP(path[1]) && IS_FILESEP(path[2]));
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
static int
|
|
297
|
+
is_aboslute_unc_path(const char *path, size_t len) {
|
|
298
|
+
if (len < 2) return 0;
|
|
299
|
+
return (CHECK_UNCDEV_PATH && !IS_DEVICEID(path[2]));
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
static int
|
|
303
|
+
is_absolute_device_path(const char *path, size_t len) {
|
|
304
|
+
if (len < 4) return 0;
|
|
305
|
+
return (CHECK_UNCDEV_PATH && IS_DEVICEID(path[2]) && IS_FILESEP(path[3]));
|
|
306
|
+
}
|
|
307
|
+
|
|
282
308
|
static int
|
|
283
309
|
mrb_file_is_absolute_path(const char *path)
|
|
284
310
|
{
|
|
285
|
-
|
|
311
|
+
size_t len = strlen(path);
|
|
312
|
+
if (IS_FILESEP(path[0])) return 1;
|
|
313
|
+
if (len > 0)
|
|
314
|
+
return (
|
|
315
|
+
is_absolute_traditional_path(path, len) ||
|
|
316
|
+
is_aboslute_unc_path(path, len) ||
|
|
317
|
+
is_absolute_device_path(path, len)
|
|
318
|
+
);
|
|
319
|
+
else
|
|
320
|
+
return 0;
|
|
286
321
|
}
|
|
287
322
|
|
|
323
|
+
#undef IS_FILESEP
|
|
324
|
+
#undef IS_VOLSEP
|
|
325
|
+
#undef IS_DEVICEID
|
|
326
|
+
#undef CHECK_UNCDEV_PATH
|
|
327
|
+
|
|
328
|
+
#else
|
|
329
|
+
static int
|
|
330
|
+
mrb_file_is_absolute_path(const char *path)
|
|
331
|
+
{
|
|
332
|
+
return (path[0] == *(char*)(FILE_SEPARATOR));
|
|
333
|
+
}
|
|
334
|
+
#endif
|
|
335
|
+
|
|
288
336
|
static mrb_value
|
|
289
337
|
mrb_file__gethome(mrb_state *mrb, mrb_value klass)
|
|
290
338
|
{
|
|
@@ -319,7 +367,7 @@ mrb_file__gethome(mrb_state *mrb, mrb_value klass)
|
|
|
319
367
|
path = mrb_str_new_cstr(mrb, home);
|
|
320
368
|
mrb_locale_free(home);
|
|
321
369
|
return path;
|
|
322
|
-
#else
|
|
370
|
+
#else /* _WIN32 */
|
|
323
371
|
argc = mrb_get_argc(mrb);
|
|
324
372
|
if (argc == 0) {
|
|
325
373
|
home = getenv("USERPROFILE");
|
|
@@ -353,7 +401,7 @@ mrb_file_mtime(mrb_state *mrb, mrb_value self)
|
|
|
353
401
|
return mrb_funcall(mrb, obj, "at", 1, mrb_fixnum_value(st.st_mtime));
|
|
354
402
|
}
|
|
355
403
|
|
|
356
|
-
mrb_value
|
|
404
|
+
static mrb_value
|
|
357
405
|
mrb_file_flock(mrb_state *mrb, mrb_value self)
|
|
358
406
|
{
|
|
359
407
|
#if defined(sun)
|
|
@@ -402,15 +450,15 @@ mrb_file_size(mrb_state *mrb, mrb_value self)
|
|
|
402
450
|
#ifdef MRB_WITHOUT_FLOAT
|
|
403
451
|
mrb_raise(mrb, E_RUNTIME_ERROR, "File#size too large for MRB_WITHOUT_FLOAT");
|
|
404
452
|
#else
|
|
405
|
-
return mrb_float_value(mrb, st.st_size);
|
|
453
|
+
return mrb_float_value(mrb, (mrb_float)st.st_size);
|
|
406
454
|
#endif
|
|
407
455
|
}
|
|
408
456
|
|
|
409
|
-
return mrb_fixnum_value(st.st_size);
|
|
457
|
+
return mrb_fixnum_value((mrb_int)st.st_size);
|
|
410
458
|
}
|
|
411
459
|
|
|
412
460
|
static int
|
|
413
|
-
mrb_ftruncate(int fd,
|
|
461
|
+
mrb_ftruncate(int fd, mrb_int length)
|
|
414
462
|
{
|
|
415
463
|
#ifndef _WIN32
|
|
416
464
|
return ftruncate(fd, (off_t)length);
|
|
@@ -443,32 +491,12 @@ static mrb_value
|
|
|
443
491
|
mrb_file_truncate(mrb_state *mrb, mrb_value self)
|
|
444
492
|
{
|
|
445
493
|
int fd;
|
|
446
|
-
|
|
494
|
+
mrb_int length;
|
|
447
495
|
mrb_value lenv;
|
|
448
496
|
|
|
449
497
|
fd = mrb_io_fileno(mrb, self);
|
|
450
498
|
mrb_get_args(mrb, "o", &lenv);
|
|
451
|
-
|
|
452
|
-
#ifndef MRB_WITHOUT_FLOAT
|
|
453
|
-
case MRB_TT_FLOAT:
|
|
454
|
-
{
|
|
455
|
-
mrb_float lenf = mrb_float(lenv);
|
|
456
|
-
if (lenf > INT64_MAX) {
|
|
457
|
-
mrb_raise(mrb, E_ARGUMENT_ERROR, "length too large");
|
|
458
|
-
}
|
|
459
|
-
length = (int64_t)lenf;
|
|
460
|
-
}
|
|
461
|
-
break;
|
|
462
|
-
#endif
|
|
463
|
-
case MRB_TT_FIXNUM:
|
|
464
|
-
default:
|
|
465
|
-
{
|
|
466
|
-
mrb_int leni = mrb_int(mrb, lenv);
|
|
467
|
-
length = (int64_t)leni;
|
|
468
|
-
}
|
|
469
|
-
break;
|
|
470
|
-
}
|
|
471
|
-
|
|
499
|
+
length = mrb_int(mrb, lenv);
|
|
472
500
|
if (mrb_ftruncate(fd, length) != 0) {
|
|
473
501
|
mrb_raise(mrb, E_IO_ERROR, "ftruncate failed");
|
|
474
502
|
}
|
|
@@ -599,4 +627,22 @@ mrb_init_file(mrb_state *mrb)
|
|
|
599
627
|
#endif
|
|
600
628
|
mrb_define_const(mrb, cnst, "NULL", mrb_str_new_cstr(mrb, NULL_FILE));
|
|
601
629
|
|
|
630
|
+
mrb_define_const(mrb, cnst, "RDONLY", mrb_fixnum_value(MRB_O_RDONLY));
|
|
631
|
+
mrb_define_const(mrb, cnst, "WRONLY", mrb_fixnum_value(MRB_O_WRONLY));
|
|
632
|
+
mrb_define_const(mrb, cnst, "RDWR", mrb_fixnum_value(MRB_O_RDWR));
|
|
633
|
+
mrb_define_const(mrb, cnst, "APPEND", mrb_fixnum_value(MRB_O_APPEND));
|
|
634
|
+
mrb_define_const(mrb, cnst, "CREAT", mrb_fixnum_value(MRB_O_CREAT));
|
|
635
|
+
mrb_define_const(mrb, cnst, "EXCL", mrb_fixnum_value(MRB_O_EXCL));
|
|
636
|
+
mrb_define_const(mrb, cnst, "TRUNC", mrb_fixnum_value(MRB_O_TRUNC));
|
|
637
|
+
mrb_define_const(mrb, cnst, "NONBLOCK", mrb_fixnum_value(MRB_O_NONBLOCK));
|
|
638
|
+
mrb_define_const(mrb, cnst, "NOCTTY", mrb_fixnum_value(MRB_O_NOCTTY));
|
|
639
|
+
mrb_define_const(mrb, cnst, "BINARY", mrb_fixnum_value(MRB_O_BINARY));
|
|
640
|
+
mrb_define_const(mrb, cnst, "SHARE_DELETE", mrb_fixnum_value(MRB_O_SHARE_DELETE));
|
|
641
|
+
mrb_define_const(mrb, cnst, "SYNC", mrb_fixnum_value(MRB_O_SYNC));
|
|
642
|
+
mrb_define_const(mrb, cnst, "DSYNC", mrb_fixnum_value(MRB_O_DSYNC));
|
|
643
|
+
mrb_define_const(mrb, cnst, "RSYNC", mrb_fixnum_value(MRB_O_RSYNC));
|
|
644
|
+
mrb_define_const(mrb, cnst, "NOFOLLOW", mrb_fixnum_value(MRB_O_NOFOLLOW));
|
|
645
|
+
mrb_define_const(mrb, cnst, "NOATIME", mrb_fixnum_value(MRB_O_NOATIME));
|
|
646
|
+
mrb_define_const(mrb, cnst, "DIRECT", mrb_fixnum_value(MRB_O_DIRECT));
|
|
647
|
+
mrb_define_const(mrb, cnst, "TMPFILE", mrb_fixnum_value(MRB_O_TMPFILE));
|
|
602
648
|
}
|
|
@@ -28,7 +28,6 @@
|
|
|
28
28
|
#include <fcntl.h>
|
|
29
29
|
|
|
30
30
|
#include <errno.h>
|
|
31
|
-
#include <stdio.h>
|
|
32
31
|
#include <stdlib.h>
|
|
33
32
|
#include <string.h>
|
|
34
33
|
|
|
@@ -86,7 +85,7 @@ mrb_lstat(mrb_state *mrb, mrb_value obj, struct stat *st)
|
|
|
86
85
|
* File.directory?(".")
|
|
87
86
|
*/
|
|
88
87
|
|
|
89
|
-
mrb_value
|
|
88
|
+
static mrb_value
|
|
90
89
|
mrb_filetest_s_directory_p(mrb_state *mrb, mrb_value klass)
|
|
91
90
|
{
|
|
92
91
|
#ifndef S_ISDIR
|
|
@@ -113,7 +112,7 @@ mrb_filetest_s_directory_p(mrb_state *mrb, mrb_value klass)
|
|
|
113
112
|
* Returns <code>true</code> if the named file is a pipe.
|
|
114
113
|
*/
|
|
115
114
|
|
|
116
|
-
mrb_value
|
|
115
|
+
static mrb_value
|
|
117
116
|
mrb_filetest_s_pipe_p(mrb_state *mrb, mrb_value klass)
|
|
118
117
|
{
|
|
119
118
|
#if defined(_WIN32) || defined(_WIN64)
|
|
@@ -146,7 +145,7 @@ mrb_filetest_s_pipe_p(mrb_state *mrb, mrb_value klass)
|
|
|
146
145
|
* Returns <code>true</code> if the named file is a symbolic link.
|
|
147
146
|
*/
|
|
148
147
|
|
|
149
|
-
mrb_value
|
|
148
|
+
static mrb_value
|
|
150
149
|
mrb_filetest_s_symlink_p(mrb_state *mrb, mrb_value klass)
|
|
151
150
|
{
|
|
152
151
|
#if defined(_WIN32) || defined(_WIN64)
|
|
@@ -189,7 +188,7 @@ mrb_filetest_s_symlink_p(mrb_state *mrb, mrb_value klass)
|
|
|
189
188
|
* Returns <code>true</code> if the named file is a socket.
|
|
190
189
|
*/
|
|
191
190
|
|
|
192
|
-
mrb_value
|
|
191
|
+
static mrb_value
|
|
193
192
|
mrb_filetest_s_socket_p(mrb_state *mrb, mrb_value klass)
|
|
194
193
|
{
|
|
195
194
|
#if defined(_WIN32) || defined(_WIN64)
|
|
@@ -233,7 +232,7 @@ mrb_filetest_s_socket_p(mrb_state *mrb, mrb_value klass)
|
|
|
233
232
|
* Return <code>true</code> if the named file exists.
|
|
234
233
|
*/
|
|
235
234
|
|
|
236
|
-
mrb_value
|
|
235
|
+
static mrb_value
|
|
237
236
|
mrb_filetest_s_exist_p(mrb_state *mrb, mrb_value klass)
|
|
238
237
|
{
|
|
239
238
|
struct stat st;
|
|
@@ -254,7 +253,7 @@ mrb_filetest_s_exist_p(mrb_state *mrb, mrb_value klass)
|
|
|
254
253
|
* regular file.
|
|
255
254
|
*/
|
|
256
255
|
|
|
257
|
-
mrb_value
|
|
256
|
+
static mrb_value
|
|
258
257
|
mrb_filetest_s_file_p(mrb_state *mrb, mrb_value klass)
|
|
259
258
|
{
|
|
260
259
|
#ifndef S_ISREG
|
|
@@ -282,7 +281,7 @@ mrb_filetest_s_file_p(mrb_state *mrb, mrb_value klass)
|
|
|
282
281
|
* a zero size.
|
|
283
282
|
*/
|
|
284
283
|
|
|
285
|
-
mrb_value
|
|
284
|
+
static mrb_value
|
|
286
285
|
mrb_filetest_s_zero_p(mrb_state *mrb, mrb_value klass)
|
|
287
286
|
{
|
|
288
287
|
struct stat st;
|
|
@@ -307,7 +306,7 @@ mrb_filetest_s_zero_p(mrb_state *mrb, mrb_value klass)
|
|
|
307
306
|
* _file_name_ can be an IO object.
|
|
308
307
|
*/
|
|
309
308
|
|
|
310
|
-
mrb_value
|
|
309
|
+
static mrb_value
|
|
311
310
|
mrb_filetest_s_size(mrb_state *mrb, mrb_value klass)
|
|
312
311
|
{
|
|
313
312
|
struct stat st;
|
|
@@ -329,7 +328,7 @@ mrb_filetest_s_size(mrb_state *mrb, mrb_value klass)
|
|
|
329
328
|
* file otherwise.
|
|
330
329
|
*/
|
|
331
330
|
|
|
332
|
-
mrb_value
|
|
331
|
+
static mrb_value
|
|
333
332
|
mrb_filetest_s_size_p(mrb_state *mrb, mrb_value klass)
|
|
334
333
|
{
|
|
335
334
|
struct stat st;
|
|
@@ -31,14 +31,21 @@
|
|
|
31
31
|
typedef long ftime_t;
|
|
32
32
|
typedef long fsuseconds_t;
|
|
33
33
|
typedef int fmode_t;
|
|
34
|
+
typedef int mrb_io_read_write_size;
|
|
35
|
+
|
|
36
|
+
#ifndef O_TMPFILE
|
|
37
|
+
#define O_TMPFILE O_TEMPORARY
|
|
38
|
+
#endif
|
|
34
39
|
|
|
35
40
|
#else
|
|
36
41
|
#include <sys/wait.h>
|
|
42
|
+
#include <sys/time.h>
|
|
37
43
|
#include <unistd.h>
|
|
38
44
|
typedef size_t fsize_t;
|
|
39
45
|
typedef time_t ftime_t;
|
|
40
46
|
typedef suseconds_t fsuseconds_t;
|
|
41
47
|
typedef mode_t fmode_t;
|
|
48
|
+
typedef ssize_t mrb_io_read_write_size;
|
|
42
49
|
#endif
|
|
43
50
|
|
|
44
51
|
#ifdef _MSC_VER
|
|
@@ -48,9 +55,14 @@ typedef mrb_int pid_t;
|
|
|
48
55
|
#include <fcntl.h>
|
|
49
56
|
|
|
50
57
|
#include <errno.h>
|
|
51
|
-
#include <stdio.h>
|
|
52
58
|
#include <string.h>
|
|
53
59
|
|
|
60
|
+
#define OPEN_ACCESS_MODE_FLAGS (O_RDONLY | O_WRONLY | O_RDWR)
|
|
61
|
+
#define OPEN_RDONLY_P(f) ((mrb_bool)(((f) & OPEN_ACCESS_MODE_FLAGS) == O_RDONLY))
|
|
62
|
+
#define OPEN_WRONLY_P(f) ((mrb_bool)(((f) & OPEN_ACCESS_MODE_FLAGS) == O_WRONLY))
|
|
63
|
+
#define OPEN_RDWR_P(f) ((mrb_bool)(((f) & OPEN_ACCESS_MODE_FLAGS) == O_RDWR))
|
|
64
|
+
#define OPEN_READABLE_P(f) ((mrb_bool)(OPEN_RDONLY_P(f) || OPEN_RDWR_P(f)))
|
|
65
|
+
#define OPEN_WRITABLE_P(f) ((mrb_bool)(OPEN_WRONLY_P(f) || OPEN_RDWR_P(f)))
|
|
54
66
|
|
|
55
67
|
static void mrb_io_free(mrb_state *mrb, void *ptr);
|
|
56
68
|
struct mrb_data_type mrb_io_type = { "IO", mrb_io_free };
|
|
@@ -58,7 +70,7 @@ struct mrb_data_type mrb_io_type = { "IO", mrb_io_free };
|
|
|
58
70
|
|
|
59
71
|
static struct mrb_io *io_get_open_fptr(mrb_state *mrb, mrb_value self);
|
|
60
72
|
static int mrb_io_modestr_to_flags(mrb_state *mrb, const char *modestr);
|
|
61
|
-
static int
|
|
73
|
+
static int mrb_io_mode_to_flags(mrb_state *mrb, mrb_value mode);
|
|
62
74
|
static void fptr_finalize(mrb_state *mrb, struct mrb_io *fptr, int quiet);
|
|
63
75
|
|
|
64
76
|
static struct mrb_io *
|
|
@@ -100,30 +112,33 @@ io_set_process_status(mrb_state *mrb, pid_t pid, int status)
|
|
|
100
112
|
static int
|
|
101
113
|
mrb_io_modestr_to_flags(mrb_state *mrb, const char *mode)
|
|
102
114
|
{
|
|
103
|
-
int flags
|
|
115
|
+
int flags;
|
|
104
116
|
const char *m = mode;
|
|
105
117
|
|
|
106
118
|
switch (*m++) {
|
|
107
119
|
case 'r':
|
|
108
|
-
flags
|
|
120
|
+
flags = O_RDONLY;
|
|
109
121
|
break;
|
|
110
122
|
case 'w':
|
|
111
|
-
flags
|
|
123
|
+
flags = O_WRONLY | O_CREAT | O_TRUNC;
|
|
112
124
|
break;
|
|
113
125
|
case 'a':
|
|
114
|
-
flags
|
|
126
|
+
flags = O_WRONLY | O_CREAT | O_APPEND;
|
|
115
127
|
break;
|
|
116
128
|
default:
|
|
117
129
|
mrb_raisef(mrb, E_ARGUMENT_ERROR, "illegal access mode %s", mode);
|
|
130
|
+
flags = 0; /* not reached */
|
|
118
131
|
}
|
|
119
132
|
|
|
120
133
|
while (*m) {
|
|
121
134
|
switch (*m++) {
|
|
122
135
|
case 'b':
|
|
123
|
-
|
|
136
|
+
#ifdef O_BINARY
|
|
137
|
+
flags |= O_BINARY;
|
|
138
|
+
#endif
|
|
124
139
|
break;
|
|
125
140
|
case '+':
|
|
126
|
-
flags
|
|
141
|
+
flags = (flags & ~OPEN_ACCESS_MODE_FLAGS) | O_RDWR;
|
|
127
142
|
break;
|
|
128
143
|
case ':':
|
|
129
144
|
/* XXX: PASSTHROUGH*/
|
|
@@ -136,38 +151,72 @@ mrb_io_modestr_to_flags(mrb_state *mrb, const char *mode)
|
|
|
136
151
|
}
|
|
137
152
|
|
|
138
153
|
static int
|
|
139
|
-
|
|
154
|
+
mrb_io_mode_to_flags(mrb_state *mrb, mrb_value mode)
|
|
140
155
|
{
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
switch(flags & (FMODE_READABLE|FMODE_WRITABLE|FMODE_READWRITE)) {
|
|
144
|
-
case FMODE_READABLE:
|
|
145
|
-
modenum = O_RDONLY;
|
|
146
|
-
break;
|
|
147
|
-
case FMODE_WRITABLE:
|
|
148
|
-
modenum = O_WRONLY;
|
|
149
|
-
break;
|
|
150
|
-
case FMODE_READWRITE:
|
|
151
|
-
modenum = O_RDWR;
|
|
152
|
-
break;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
if (flags & FMODE_APPEND) {
|
|
156
|
-
modenum |= O_APPEND;
|
|
157
|
-
}
|
|
158
|
-
if (flags & FMODE_TRUNC) {
|
|
159
|
-
modenum |= O_TRUNC;
|
|
156
|
+
if (mrb_nil_p(mode)) {
|
|
157
|
+
return mrb_io_modestr_to_flags(mrb, "r");
|
|
160
158
|
}
|
|
161
|
-
if (
|
|
162
|
-
|
|
159
|
+
else if (mrb_string_p(mode)) {
|
|
160
|
+
return mrb_io_modestr_to_flags(mrb, RSTRING_CSTR(mrb, mode));
|
|
163
161
|
}
|
|
162
|
+
else {
|
|
163
|
+
int flags = 0;
|
|
164
|
+
mrb_int flags0 = mrb_int(mrb, mode);
|
|
165
|
+
|
|
166
|
+
switch (flags0 & MRB_O_ACCMODE) {
|
|
167
|
+
case MRB_O_RDONLY:
|
|
168
|
+
flags |= O_RDONLY;
|
|
169
|
+
break;
|
|
170
|
+
case MRB_O_WRONLY:
|
|
171
|
+
flags |= O_WRONLY;
|
|
172
|
+
break;
|
|
173
|
+
case MRB_O_RDWR:
|
|
174
|
+
flags |= O_RDWR;
|
|
175
|
+
break;
|
|
176
|
+
default:
|
|
177
|
+
mrb_raisef(mrb, E_ARGUMENT_ERROR, "illegal access mode %v", mode);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
if (flags0 & MRB_O_APPEND) flags |= O_APPEND;
|
|
181
|
+
if (flags0 & MRB_O_CREAT) flags |= O_CREAT;
|
|
182
|
+
if (flags0 & MRB_O_EXCL) flags |= O_EXCL;
|
|
183
|
+
if (flags0 & MRB_O_TRUNC) flags |= O_TRUNC;
|
|
184
|
+
#ifdef O_NONBLOCK
|
|
185
|
+
if (flags0 & MRB_O_NONBLOCK) flags |= O_NONBLOCK;
|
|
186
|
+
#endif
|
|
187
|
+
#ifdef O_NOCTTY
|
|
188
|
+
if (flags0 & MRB_O_NOCTTY) flags |= O_NOCTTY;
|
|
189
|
+
#endif
|
|
164
190
|
#ifdef O_BINARY
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
191
|
+
if (flags0 & MRB_O_BINARY) flags |= O_BINARY;
|
|
192
|
+
#endif
|
|
193
|
+
#ifdef O_SHARE_DELETE
|
|
194
|
+
if (flags0 & MRB_O_SHARE_DELETE) flags |= O_SHARE_DELETE;
|
|
195
|
+
#endif
|
|
196
|
+
#ifdef O_SYNC
|
|
197
|
+
if (flags0 & MRB_O_SYNC) flags |= O_SYNC;
|
|
198
|
+
#endif
|
|
199
|
+
#ifdef O_DSYNC
|
|
200
|
+
if (flags0 & MRB_O_DSYNC) flags |= O_DSYNC;
|
|
201
|
+
#endif
|
|
202
|
+
#ifdef O_RSYNC
|
|
203
|
+
if (flags0 & MRB_O_RSYNC) flags |= O_RSYNC;
|
|
204
|
+
#endif
|
|
205
|
+
#ifdef O_NOFOLLOW
|
|
206
|
+
if (flags0 & MRB_O_NOFOLLOW) flags |= O_NOFOLLOW;
|
|
207
|
+
#endif
|
|
208
|
+
#ifdef O_NOATIME
|
|
209
|
+
if (flags0 & MRB_O_NOATIME) flags |= O_NOATIME;
|
|
210
|
+
#endif
|
|
211
|
+
#ifdef O_DIRECT
|
|
212
|
+
if (flags0 & MRB_O_DIRECT) flags |= O_DIRECT;
|
|
213
|
+
#endif
|
|
214
|
+
#ifdef O_TMPFILE
|
|
215
|
+
if (flags0 & MRB_O_TMPFILE) flags |= O_TMPFILE;
|
|
168
216
|
#endif
|
|
169
217
|
|
|
170
|
-
|
|
218
|
+
return flags;
|
|
219
|
+
}
|
|
171
220
|
}
|
|
172
221
|
|
|
173
222
|
static void
|
|
@@ -292,7 +341,7 @@ option_to_fd(mrb_state *mrb, mrb_value hash, const char *key)
|
|
|
292
341
|
}
|
|
293
342
|
|
|
294
343
|
#ifdef _WIN32
|
|
295
|
-
mrb_value
|
|
344
|
+
static mrb_value
|
|
296
345
|
mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
|
|
297
346
|
{
|
|
298
347
|
mrb_value cmd, io;
|
|
@@ -317,11 +366,11 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
|
|
|
317
366
|
ofd[0] = INVALID_HANDLE_VALUE;
|
|
318
367
|
ofd[1] = INVALID_HANDLE_VALUE;
|
|
319
368
|
|
|
320
|
-
mrb_get_args(mrb, "S|
|
|
369
|
+
mrb_get_args(mrb, "S|oH", &cmd, &mode, &opt);
|
|
321
370
|
io = mrb_obj_value(mrb_data_object_alloc(mrb, mrb_class_ptr(klass), NULL, &mrb_io_type));
|
|
322
371
|
|
|
323
372
|
pname = RSTRING_CSTR(mrb, cmd);
|
|
324
|
-
flags =
|
|
373
|
+
flags = mrb_io_mode_to_flags(mrb, mode);
|
|
325
374
|
|
|
326
375
|
doexec = (strcmp("-", pname) != 0);
|
|
327
376
|
opt_in = option_to_fd(mrb, opt, "in");
|
|
@@ -332,14 +381,14 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
|
|
|
332
381
|
saAttr.bInheritHandle = TRUE;
|
|
333
382
|
saAttr.lpSecurityDescriptor = NULL;
|
|
334
383
|
|
|
335
|
-
if (flags
|
|
384
|
+
if (OPEN_READABLE_P(flags)) {
|
|
336
385
|
if (!CreatePipe(&ofd[0], &ofd[1], &saAttr, 0)
|
|
337
386
|
|| !SetHandleInformation(ofd[0], HANDLE_FLAG_INHERIT, 0)) {
|
|
338
387
|
mrb_sys_fail(mrb, "pipe");
|
|
339
388
|
}
|
|
340
389
|
}
|
|
341
390
|
|
|
342
|
-
if (flags
|
|
391
|
+
if (OPEN_WRITABLE_P(flags)) {
|
|
343
392
|
if (!CreatePipe(&ifd[0], &ifd[1], &saAttr, 0)
|
|
344
393
|
|| !SetHandleInformation(ifd[1], HANDLE_FLAG_INHERIT, 0)) {
|
|
345
394
|
mrb_sys_fail(mrb, "pipe");
|
|
@@ -353,11 +402,11 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
|
|
|
353
402
|
si.dwFlags |= STARTF_USESHOWWINDOW;
|
|
354
403
|
si.wShowWindow = SW_HIDE;
|
|
355
404
|
si.dwFlags |= STARTF_USESTDHANDLES;
|
|
356
|
-
if (flags
|
|
405
|
+
if (OPEN_READABLE_P(flags)) {
|
|
357
406
|
si.hStdOutput = ofd[1];
|
|
358
407
|
si.hStdError = ofd[1];
|
|
359
408
|
}
|
|
360
|
-
if (flags
|
|
409
|
+
if (OPEN_WRITABLE_P(flags)) {
|
|
361
410
|
si.hStdInput = ifd[0];
|
|
362
411
|
}
|
|
363
412
|
if (!CreateProcess(
|
|
@@ -381,8 +430,8 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
|
|
|
381
430
|
fptr->fd = _open_osfhandle((intptr_t)ofd[0], 0);
|
|
382
431
|
fptr->fd2 = _open_osfhandle((intptr_t)ifd[1], 0);
|
|
383
432
|
fptr->pid = pid;
|
|
384
|
-
fptr->readable = (
|
|
385
|
-
fptr->writable = (
|
|
433
|
+
fptr->readable = OPEN_READABLE_P(flags);
|
|
434
|
+
fptr->writable = OPEN_WRITABLE_P(flags);
|
|
386
435
|
fptr->sync = 0;
|
|
387
436
|
|
|
388
437
|
DATA_TYPE(io) = &mrb_io_type;
|
|
@@ -390,14 +439,14 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
|
|
|
390
439
|
return io;
|
|
391
440
|
}
|
|
392
441
|
#elif defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
|
|
393
|
-
mrb_value
|
|
442
|
+
static mrb_value
|
|
394
443
|
mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
|
|
395
444
|
{
|
|
396
445
|
mrb_raise(mrb, E_NOTIMP_ERROR, "IO#popen is not supported on the platform");
|
|
397
446
|
return mrb_false_value();
|
|
398
447
|
}
|
|
399
448
|
#else
|
|
400
|
-
mrb_value
|
|
449
|
+
static mrb_value
|
|
401
450
|
mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
|
|
402
451
|
{
|
|
403
452
|
mrb_value cmd, io, result;
|
|
@@ -413,18 +462,18 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
|
|
|
413
462
|
int saved_errno;
|
|
414
463
|
int opt_in, opt_out, opt_err;
|
|
415
464
|
|
|
416
|
-
mrb_get_args(mrb, "S|
|
|
465
|
+
mrb_get_args(mrb, "S|oH", &cmd, &mode, &opt);
|
|
417
466
|
io = mrb_obj_value(mrb_data_object_alloc(mrb, mrb_class_ptr(klass), NULL, &mrb_io_type));
|
|
418
467
|
|
|
419
468
|
pname = RSTRING_CSTR(mrb, cmd);
|
|
420
|
-
flags =
|
|
469
|
+
flags = mrb_io_mode_to_flags(mrb, mode);
|
|
421
470
|
|
|
422
471
|
doexec = (strcmp("-", pname) != 0);
|
|
423
472
|
opt_in = option_to_fd(mrb, opt, "in");
|
|
424
473
|
opt_out = option_to_fd(mrb, opt, "out");
|
|
425
474
|
opt_err = option_to_fd(mrb, opt, "err");
|
|
426
475
|
|
|
427
|
-
if (flags
|
|
476
|
+
if (OPEN_READABLE_P(flags)) {
|
|
428
477
|
if (pipe(pr) == -1) {
|
|
429
478
|
mrb_sys_fail(mrb, "pipe");
|
|
430
479
|
}
|
|
@@ -432,7 +481,7 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
|
|
|
432
481
|
mrb_fd_cloexec(mrb, pr[1]);
|
|
433
482
|
}
|
|
434
483
|
|
|
435
|
-
if (flags
|
|
484
|
+
if (OPEN_WRITABLE_P(flags)) {
|
|
436
485
|
if (pipe(pw) == -1) {
|
|
437
486
|
if (pr[0] != -1) close(pr[0]);
|
|
438
487
|
if (pr[1] != -1) close(pr[1]);
|
|
@@ -461,14 +510,14 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
|
|
|
461
510
|
if (opt_err != -1) {
|
|
462
511
|
dup2(opt_err, 2);
|
|
463
512
|
}
|
|
464
|
-
if (flags
|
|
513
|
+
if (OPEN_READABLE_P(flags)) {
|
|
465
514
|
close(pr[0]);
|
|
466
515
|
if (pr[1] != 1) {
|
|
467
516
|
dup2(pr[1], 1);
|
|
468
517
|
close(pr[1]);
|
|
469
518
|
}
|
|
470
519
|
}
|
|
471
|
-
if (flags
|
|
520
|
+
if (OPEN_WRITABLE_P(flags)) {
|
|
472
521
|
close(pw[1]);
|
|
473
522
|
if (pw[0] != 0) {
|
|
474
523
|
dup2(pw[0], 0);
|
|
@@ -487,12 +536,12 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
|
|
|
487
536
|
break;
|
|
488
537
|
|
|
489
538
|
default: /* parent */
|
|
490
|
-
if ((flags
|
|
539
|
+
if (OPEN_RDWR_P(flags)) {
|
|
491
540
|
close(pr[1]);
|
|
492
541
|
fd = pr[0];
|
|
493
542
|
close(pw[0]);
|
|
494
543
|
write_fd = pw[1];
|
|
495
|
-
} else if (flags
|
|
544
|
+
} else if (OPEN_RDONLY_P(flags)) {
|
|
496
545
|
close(pr[1]);
|
|
497
546
|
fd = pr[0];
|
|
498
547
|
} else {
|
|
@@ -506,8 +555,8 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
|
|
|
506
555
|
fptr->fd = fd;
|
|
507
556
|
fptr->fd2 = write_fd;
|
|
508
557
|
fptr->pid = pid;
|
|
509
|
-
fptr->readable = (
|
|
510
|
-
fptr->writable = (
|
|
558
|
+
fptr->readable = OPEN_READABLE_P(flags);
|
|
559
|
+
fptr->writable = OPEN_WRITABLE_P(flags);
|
|
511
560
|
fptr->sync = 0;
|
|
512
561
|
|
|
513
562
|
DATA_TYPE(io) = &mrb_io_type;
|
|
@@ -517,11 +566,11 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
|
|
|
517
566
|
|
|
518
567
|
case -1: /* error */
|
|
519
568
|
saved_errno = errno;
|
|
520
|
-
if (flags
|
|
569
|
+
if (OPEN_READABLE_P(flags)) {
|
|
521
570
|
close(pr[0]);
|
|
522
571
|
close(pr[1]);
|
|
523
572
|
}
|
|
524
|
-
if (flags
|
|
573
|
+
if (OPEN_WRITABLE_P(flags)) {
|
|
525
574
|
close(pw[0]);
|
|
526
575
|
close(pw[1]);
|
|
527
576
|
}
|
|
@@ -547,7 +596,7 @@ mrb_dup(mrb_state *mrb, int fd, mrb_bool *failed)
|
|
|
547
596
|
return new_fd;
|
|
548
597
|
}
|
|
549
598
|
|
|
550
|
-
mrb_value
|
|
599
|
+
static mrb_value
|
|
551
600
|
mrb_io_initialize_copy(mrb_state *mrb, mrb_value copy)
|
|
552
601
|
{
|
|
553
602
|
mrb_value orig;
|
|
@@ -596,7 +645,44 @@ mrb_io_initialize_copy(mrb_state *mrb, mrb_value copy)
|
|
|
596
645
|
return copy;
|
|
597
646
|
}
|
|
598
647
|
|
|
599
|
-
|
|
648
|
+
static void
|
|
649
|
+
check_file_descriptor(mrb_state *mrb, mrb_int fd)
|
|
650
|
+
{
|
|
651
|
+
struct stat sb;
|
|
652
|
+
int fdi = (int)fd;
|
|
653
|
+
|
|
654
|
+
#if MRB_INT_MIN < INT_MIN || MRB_INT_MAX > INT_MAX
|
|
655
|
+
if (fdi != fd) {
|
|
656
|
+
goto badfd;
|
|
657
|
+
}
|
|
658
|
+
#endif
|
|
659
|
+
|
|
660
|
+
#ifdef _WIN32
|
|
661
|
+
{
|
|
662
|
+
DWORD err;
|
|
663
|
+
int len = sizeof(err);
|
|
664
|
+
|
|
665
|
+
if (getsockopt(fdi, SOL_SOCKET, SO_ERROR, (char*)&err, &len) == 0) {
|
|
666
|
+
return;
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
if (fdi < 0 || fdi > _getmaxstdio()) {
|
|
671
|
+
goto badfd;
|
|
672
|
+
}
|
|
673
|
+
#endif /* _WIN32 */
|
|
674
|
+
|
|
675
|
+
if (fstat(fdi, &sb) != 0) {
|
|
676
|
+
goto badfd;
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
return;
|
|
680
|
+
|
|
681
|
+
badfd:
|
|
682
|
+
mrb_sys_fail(mrb, "bad file descriptor");
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
static mrb_value
|
|
600
686
|
mrb_io_initialize(mrb_state *mrb, mrb_value io)
|
|
601
687
|
{
|
|
602
688
|
struct mrb_io *fptr;
|
|
@@ -606,7 +692,8 @@ mrb_io_initialize(mrb_state *mrb, mrb_value io)
|
|
|
606
692
|
|
|
607
693
|
mode = opt = mrb_nil_value();
|
|
608
694
|
|
|
609
|
-
mrb_get_args(mrb, "i|
|
|
695
|
+
mrb_get_args(mrb, "i|oo", &fd, &mode, &opt);
|
|
696
|
+
check_file_descriptor(mrb, fd);
|
|
610
697
|
if (mrb_nil_p(mode)) {
|
|
611
698
|
mode = mrb_str_new_cstr(mrb, "r");
|
|
612
699
|
}
|
|
@@ -614,7 +701,7 @@ mrb_io_initialize(mrb_state *mrb, mrb_value io)
|
|
|
614
701
|
opt = mrb_hash_new(mrb);
|
|
615
702
|
}
|
|
616
703
|
|
|
617
|
-
flags =
|
|
704
|
+
flags = mrb_io_mode_to_flags(mrb, mode);
|
|
618
705
|
|
|
619
706
|
mrb_iv_set(mrb, io, mrb_intern_cstr(mrb, "@buf"), mrb_str_new_cstr(mrb, ""));
|
|
620
707
|
|
|
@@ -629,8 +716,8 @@ mrb_io_initialize(mrb_state *mrb, mrb_value io)
|
|
|
629
716
|
DATA_PTR(io) = fptr;
|
|
630
717
|
|
|
631
718
|
fptr->fd = (int)fd;
|
|
632
|
-
fptr->readable = (
|
|
633
|
-
fptr->writable = (
|
|
719
|
+
fptr->readable = OPEN_READABLE_P(flags);
|
|
720
|
+
fptr->writable = OPEN_WRITABLE_P(flags);
|
|
634
721
|
fptr->sync = 0;
|
|
635
722
|
return io;
|
|
636
723
|
}
|
|
@@ -698,7 +785,7 @@ fptr_finalize(mrb_state *mrb, struct mrb_io *fptr, int quiet)
|
|
|
698
785
|
}
|
|
699
786
|
}
|
|
700
787
|
|
|
701
|
-
mrb_value
|
|
788
|
+
static mrb_value
|
|
702
789
|
mrb_io_check_readable(mrb_state *mrb, mrb_value self)
|
|
703
790
|
{
|
|
704
791
|
struct mrb_io *fptr = io_get_open_fptr(mrb, self);
|
|
@@ -708,7 +795,7 @@ mrb_io_check_readable(mrb_state *mrb, mrb_value self)
|
|
|
708
795
|
return mrb_nil_value();
|
|
709
796
|
}
|
|
710
797
|
|
|
711
|
-
mrb_value
|
|
798
|
+
static mrb_value
|
|
712
799
|
mrb_io_isatty(mrb_state *mrb, mrb_value self)
|
|
713
800
|
{
|
|
714
801
|
struct mrb_io *fptr;
|
|
@@ -719,7 +806,7 @@ mrb_io_isatty(mrb_state *mrb, mrb_value self)
|
|
|
719
806
|
return mrb_true_value();
|
|
720
807
|
}
|
|
721
808
|
|
|
722
|
-
mrb_value
|
|
809
|
+
static mrb_value
|
|
723
810
|
mrb_io_s_for_fd(mrb_state *mrb, mrb_value klass)
|
|
724
811
|
{
|
|
725
812
|
struct RClass *c = mrb_class_ptr(klass);
|
|
@@ -732,7 +819,7 @@ mrb_io_s_for_fd(mrb_state *mrb, mrb_value klass)
|
|
|
732
819
|
return mrb_io_initialize(mrb, obj);
|
|
733
820
|
}
|
|
734
821
|
|
|
735
|
-
mrb_value
|
|
822
|
+
static mrb_value
|
|
736
823
|
mrb_io_s_sysclose(mrb_state *mrb, mrb_value klass)
|
|
737
824
|
{
|
|
738
825
|
mrb_int fd;
|
|
@@ -743,7 +830,7 @@ mrb_io_s_sysclose(mrb_state *mrb, mrb_value klass)
|
|
|
743
830
|
return mrb_fixnum_value(0);
|
|
744
831
|
}
|
|
745
832
|
|
|
746
|
-
int
|
|
833
|
+
static int
|
|
747
834
|
mrb_cloexec_open(mrb_state *mrb, const char *pathname, mrb_int flags, mrb_int mode)
|
|
748
835
|
{
|
|
749
836
|
int fd, retry = FALSE;
|
|
@@ -778,39 +865,55 @@ reopen:
|
|
|
778
865
|
return fd;
|
|
779
866
|
}
|
|
780
867
|
|
|
781
|
-
mrb_value
|
|
868
|
+
static mrb_value
|
|
782
869
|
mrb_io_s_sysopen(mrb_state *mrb, mrb_value klass)
|
|
783
870
|
{
|
|
784
871
|
mrb_value path = mrb_nil_value();
|
|
785
872
|
mrb_value mode = mrb_nil_value();
|
|
786
873
|
mrb_int fd, perm = -1;
|
|
787
874
|
const char *pat;
|
|
788
|
-
int flags
|
|
875
|
+
int flags;
|
|
789
876
|
|
|
790
|
-
mrb_get_args(mrb, "S|
|
|
791
|
-
if (mrb_nil_p(mode)) {
|
|
792
|
-
mode = mrb_str_new_cstr(mrb, "r");
|
|
793
|
-
}
|
|
877
|
+
mrb_get_args(mrb, "S|oi", &path, &mode, &perm);
|
|
794
878
|
if (perm < 0) {
|
|
795
879
|
perm = 0666;
|
|
796
880
|
}
|
|
797
881
|
|
|
798
882
|
pat = RSTRING_CSTR(mrb, path);
|
|
799
|
-
flags =
|
|
800
|
-
|
|
801
|
-
fd = mrb_cloexec_open(mrb, pat, modenum, perm);
|
|
883
|
+
flags = mrb_io_mode_to_flags(mrb, mode);
|
|
884
|
+
fd = mrb_cloexec_open(mrb, pat, flags, perm);
|
|
802
885
|
return mrb_fixnum_value(fd);
|
|
803
886
|
}
|
|
804
887
|
|
|
805
|
-
mrb_value
|
|
888
|
+
static mrb_value mrb_io_sysread_common(mrb_state *mrb,
|
|
889
|
+
mrb_io_read_write_size (*readfunc)(int, void *, fsize_t, off_t),
|
|
890
|
+
mrb_value io, mrb_value buf, mrb_int maxlen, off_t offset);
|
|
891
|
+
|
|
892
|
+
static mrb_io_read_write_size
|
|
893
|
+
mrb_sysread_dummy(int fd, void *buf, fsize_t nbytes, off_t offset)
|
|
894
|
+
{
|
|
895
|
+
return (mrb_io_read_write_size)read(fd, buf, nbytes);
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
static mrb_value
|
|
806
899
|
mrb_io_sysread(mrb_state *mrb, mrb_value io)
|
|
807
900
|
{
|
|
808
|
-
struct mrb_io *fptr;
|
|
809
901
|
mrb_value buf = mrb_nil_value();
|
|
810
902
|
mrb_int maxlen;
|
|
811
|
-
int ret;
|
|
812
903
|
|
|
813
904
|
mrb_get_args(mrb, "i|S", &maxlen, &buf);
|
|
905
|
+
|
|
906
|
+
return mrb_io_sysread_common(mrb, mrb_sysread_dummy, io, buf, maxlen, 0);
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
static mrb_value
|
|
910
|
+
mrb_io_sysread_common(mrb_state *mrb,
|
|
911
|
+
mrb_io_read_write_size (*readfunc)(int, void *, fsize_t, off_t),
|
|
912
|
+
mrb_value io, mrb_value buf, mrb_int maxlen, off_t offset)
|
|
913
|
+
{
|
|
914
|
+
struct mrb_io *fptr;
|
|
915
|
+
int ret;
|
|
916
|
+
|
|
814
917
|
if (maxlen < 0) {
|
|
815
918
|
mrb_raise(mrb, E_ARGUMENT_ERROR, "negative expanding string size");
|
|
816
919
|
}
|
|
@@ -824,7 +927,8 @@ mrb_io_sysread(mrb_state *mrb, mrb_value io)
|
|
|
824
927
|
|
|
825
928
|
if (RSTRING_LEN(buf) != maxlen) {
|
|
826
929
|
buf = mrb_str_resize(mrb, buf, maxlen);
|
|
827
|
-
}
|
|
930
|
+
}
|
|
931
|
+
else {
|
|
828
932
|
mrb_str_modify(mrb, RSTRING(buf));
|
|
829
933
|
}
|
|
830
934
|
|
|
@@ -832,29 +936,20 @@ mrb_io_sysread(mrb_state *mrb, mrb_value io)
|
|
|
832
936
|
if (!fptr->readable) {
|
|
833
937
|
mrb_raise(mrb, E_IO_ERROR, "not opened for reading");
|
|
834
938
|
}
|
|
835
|
-
ret =
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
case -1: /* Error */
|
|
845
|
-
mrb_sys_fail(mrb, "sysread failed");
|
|
846
|
-
break;
|
|
847
|
-
default:
|
|
848
|
-
if (RSTRING_LEN(buf) != ret) {
|
|
849
|
-
buf = mrb_str_resize(mrb, buf, ret);
|
|
850
|
-
}
|
|
851
|
-
break;
|
|
939
|
+
ret = readfunc(fptr->fd, RSTRING_PTR(buf), (fsize_t)maxlen, offset);
|
|
940
|
+
if (ret < 0) {
|
|
941
|
+
mrb_sys_fail(mrb, "sysread failed");
|
|
942
|
+
}
|
|
943
|
+
if (RSTRING_LEN(buf) != ret) {
|
|
944
|
+
buf = mrb_str_resize(mrb, buf, ret);
|
|
945
|
+
}
|
|
946
|
+
if (ret == 0 && maxlen > 0) {
|
|
947
|
+
mrb_raise(mrb, E_EOF_ERROR, "sysread failed: End of File");
|
|
852
948
|
}
|
|
853
|
-
|
|
854
949
|
return buf;
|
|
855
950
|
}
|
|
856
951
|
|
|
857
|
-
mrb_value
|
|
952
|
+
static mrb_value
|
|
858
953
|
mrb_io_sysseek(mrb_state *mrb, mrb_value io)
|
|
859
954
|
{
|
|
860
955
|
struct mrb_io *fptr;
|
|
@@ -882,11 +977,12 @@ mrb_io_sysseek(mrb_state *mrb, mrb_value io)
|
|
|
882
977
|
}
|
|
883
978
|
}
|
|
884
979
|
|
|
885
|
-
mrb_value
|
|
886
|
-
|
|
980
|
+
static mrb_value
|
|
981
|
+
mrb_io_syswrite_common(mrb_state *mrb,
|
|
982
|
+
mrb_io_read_write_size (*writefunc)(int, const void *, fsize_t, off_t),
|
|
983
|
+
mrb_value io, mrb_value buf, off_t offset)
|
|
887
984
|
{
|
|
888
985
|
struct mrb_io *fptr;
|
|
889
|
-
mrb_value str, buf;
|
|
890
986
|
int fd, length;
|
|
891
987
|
|
|
892
988
|
fptr = io_get_open_fptr(mrb, io);
|
|
@@ -894,15 +990,12 @@ mrb_io_syswrite(mrb_state *mrb, mrb_value io)
|
|
|
894
990
|
mrb_raise(mrb, E_IO_ERROR, "not opened for writing");
|
|
895
991
|
}
|
|
896
992
|
|
|
897
|
-
mrb_get_args(mrb, "S", &str);
|
|
898
|
-
buf = str;
|
|
899
|
-
|
|
900
993
|
if (fptr->fd2 == -1) {
|
|
901
994
|
fd = fptr->fd;
|
|
902
995
|
} else {
|
|
903
996
|
fd = fptr->fd2;
|
|
904
997
|
}
|
|
905
|
-
length =
|
|
998
|
+
length = writefunc(fd, RSTRING_PTR(buf), (fsize_t)RSTRING_LEN(buf), offset);
|
|
906
999
|
if (length == -1) {
|
|
907
1000
|
mrb_sys_fail(mrb, 0);
|
|
908
1001
|
}
|
|
@@ -910,7 +1003,23 @@ mrb_io_syswrite(mrb_state *mrb, mrb_value io)
|
|
|
910
1003
|
return mrb_fixnum_value(length);
|
|
911
1004
|
}
|
|
912
1005
|
|
|
913
|
-
|
|
1006
|
+
static mrb_io_read_write_size
|
|
1007
|
+
mrb_syswrite_dummy(int fd, const void *buf, fsize_t nbytes, off_t offset)
|
|
1008
|
+
{
|
|
1009
|
+
return (mrb_io_read_write_size)write(fd, buf, nbytes);
|
|
1010
|
+
}
|
|
1011
|
+
|
|
1012
|
+
static mrb_value
|
|
1013
|
+
mrb_io_syswrite(mrb_state *mrb, mrb_value io)
|
|
1014
|
+
{
|
|
1015
|
+
mrb_value buf;
|
|
1016
|
+
|
|
1017
|
+
mrb_get_args(mrb, "S", &buf);
|
|
1018
|
+
|
|
1019
|
+
return mrb_io_syswrite_common(mrb, mrb_syswrite_dummy, io, buf, 0);
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
static mrb_value
|
|
914
1023
|
mrb_io_close(mrb_state *mrb, mrb_value self)
|
|
915
1024
|
{
|
|
916
1025
|
struct mrb_io *fptr;
|
|
@@ -919,7 +1028,7 @@ mrb_io_close(mrb_state *mrb, mrb_value self)
|
|
|
919
1028
|
return mrb_nil_value();
|
|
920
1029
|
}
|
|
921
1030
|
|
|
922
|
-
mrb_value
|
|
1031
|
+
static mrb_value
|
|
923
1032
|
mrb_io_close_write(mrb_state *mrb, mrb_value self)
|
|
924
1033
|
{
|
|
925
1034
|
struct mrb_io *fptr;
|
|
@@ -930,7 +1039,7 @@ mrb_io_close_write(mrb_state *mrb, mrb_value self)
|
|
|
930
1039
|
return mrb_nil_value();
|
|
931
1040
|
}
|
|
932
1041
|
|
|
933
|
-
mrb_value
|
|
1042
|
+
static mrb_value
|
|
934
1043
|
mrb_io_closed(mrb_state *mrb, mrb_value io)
|
|
935
1044
|
{
|
|
936
1045
|
struct mrb_io *fptr;
|
|
@@ -942,7 +1051,7 @@ mrb_io_closed(mrb_state *mrb, mrb_value io)
|
|
|
942
1051
|
return mrb_true_value();
|
|
943
1052
|
}
|
|
944
1053
|
|
|
945
|
-
mrb_value
|
|
1054
|
+
static mrb_value
|
|
946
1055
|
mrb_io_pid(mrb_state *mrb, mrb_value io)
|
|
947
1056
|
{
|
|
948
1057
|
struct mrb_io *fptr;
|
|
@@ -1076,6 +1185,7 @@ mrb_io_s_select(mrb_state *mrb, mrb_value klass)
|
|
|
1076
1185
|
for (i = 0; i < RARRAY_LEN(read); i++) {
|
|
1077
1186
|
read_io = RARRAY_PTR(read)[i];
|
|
1078
1187
|
fptr = io_get_open_fptr(mrb, read_io);
|
|
1188
|
+
if (fptr->fd >= FD_SETSIZE) continue;
|
|
1079
1189
|
FD_SET(fptr->fd, rp);
|
|
1080
1190
|
if (mrb_io_read_data_pending(mrb, read_io)) {
|
|
1081
1191
|
pending++;
|
|
@@ -1098,6 +1208,7 @@ mrb_io_s_select(mrb_state *mrb, mrb_value klass)
|
|
|
1098
1208
|
FD_ZERO(wp);
|
|
1099
1209
|
for (i = 0; i < RARRAY_LEN(write); i++) {
|
|
1100
1210
|
fptr = io_get_open_fptr(mrb, RARRAY_PTR(write)[i]);
|
|
1211
|
+
if (fptr->fd >= FD_SETSIZE) continue;
|
|
1101
1212
|
FD_SET(fptr->fd, wp);
|
|
1102
1213
|
if (max < fptr->fd)
|
|
1103
1214
|
max = fptr->fd;
|
|
@@ -1117,6 +1228,7 @@ mrb_io_s_select(mrb_state *mrb, mrb_value klass)
|
|
|
1117
1228
|
FD_ZERO(ep);
|
|
1118
1229
|
for (i = 0; i < RARRAY_LEN(except); i++) {
|
|
1119
1230
|
fptr = io_get_open_fptr(mrb, RARRAY_PTR(except)[i]);
|
|
1231
|
+
if (fptr->fd >= FD_SETSIZE) continue;
|
|
1120
1232
|
FD_SET(fptr->fd, ep);
|
|
1121
1233
|
if (max < fptr->fd)
|
|
1122
1234
|
max = fptr->fd;
|
|
@@ -1205,7 +1317,7 @@ mrb_io_fileno_m(mrb_state *mrb, mrb_value io)
|
|
|
1205
1317
|
return mrb_fixnum_value(fd);
|
|
1206
1318
|
}
|
|
1207
1319
|
|
|
1208
|
-
mrb_value
|
|
1320
|
+
static mrb_value
|
|
1209
1321
|
mrb_io_close_on_exec_p(mrb_state *mrb, mrb_value self)
|
|
1210
1322
|
{
|
|
1211
1323
|
#if defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC)
|
|
@@ -1229,7 +1341,7 @@ mrb_io_close_on_exec_p(mrb_state *mrb, mrb_value self)
|
|
|
1229
1341
|
#endif
|
|
1230
1342
|
}
|
|
1231
1343
|
|
|
1232
|
-
mrb_value
|
|
1344
|
+
static mrb_value
|
|
1233
1345
|
mrb_io_set_close_on_exec(mrb_state *mrb, mrb_value self)
|
|
1234
1346
|
{
|
|
1235
1347
|
#if defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC)
|
|
@@ -1265,7 +1377,7 @@ mrb_io_set_close_on_exec(mrb_state *mrb, mrb_value self)
|
|
|
1265
1377
|
#endif
|
|
1266
1378
|
}
|
|
1267
1379
|
|
|
1268
|
-
mrb_value
|
|
1380
|
+
static mrb_value
|
|
1269
1381
|
mrb_io_set_sync(mrb_state *mrb, mrb_value self)
|
|
1270
1382
|
{
|
|
1271
1383
|
struct mrb_io *fptr;
|
|
@@ -1277,7 +1389,7 @@ mrb_io_set_sync(mrb_state *mrb, mrb_value self)
|
|
|
1277
1389
|
return mrb_bool_value(b);
|
|
1278
1390
|
}
|
|
1279
1391
|
|
|
1280
|
-
mrb_value
|
|
1392
|
+
static mrb_value
|
|
1281
1393
|
mrb_io_sync(mrb_state *mrb, mrb_value self)
|
|
1282
1394
|
{
|
|
1283
1395
|
struct mrb_io *fptr;
|
|
@@ -1285,15 +1397,55 @@ mrb_io_sync(mrb_state *mrb, mrb_value self)
|
|
|
1285
1397
|
return mrb_bool_value(fptr->sync);
|
|
1286
1398
|
}
|
|
1287
1399
|
|
|
1400
|
+
#ifndef MRB_WITH_IO_PREAD_PWRITE
|
|
1401
|
+
# define mrb_io_pread mrb_notimplement_m
|
|
1402
|
+
# define mrb_io_pwrite mrb_notimplement_m
|
|
1403
|
+
#else
|
|
1404
|
+
static off_t
|
|
1405
|
+
value2off(mrb_state *mrb, mrb_value offv)
|
|
1406
|
+
{
|
|
1407
|
+
return (off_t)mrb_int(mrb, offv);
|
|
1408
|
+
}
|
|
1409
|
+
|
|
1410
|
+
/*
|
|
1411
|
+
* call-seq:
|
|
1412
|
+
* pread(maxlen, offset, outbuf = "") -> outbuf
|
|
1413
|
+
*/
|
|
1414
|
+
static mrb_value
|
|
1415
|
+
mrb_io_pread(mrb_state *mrb, mrb_value io)
|
|
1416
|
+
{
|
|
1417
|
+
mrb_value buf = mrb_nil_value();
|
|
1418
|
+
mrb_value off;
|
|
1419
|
+
mrb_int maxlen;
|
|
1420
|
+
|
|
1421
|
+
mrb_get_args(mrb, "io|S!", &maxlen, &off, &buf);
|
|
1422
|
+
|
|
1423
|
+
return mrb_io_sysread_common(mrb, pread, io, buf, maxlen, value2off(mrb, off));
|
|
1424
|
+
}
|
|
1425
|
+
|
|
1426
|
+
/*
|
|
1427
|
+
* call-seq:
|
|
1428
|
+
* pwrite(buffer, offset) -> wrote_bytes
|
|
1429
|
+
*/
|
|
1430
|
+
static mrb_value
|
|
1431
|
+
mrb_io_pwrite(mrb_state *mrb, mrb_value io)
|
|
1432
|
+
{
|
|
1433
|
+
mrb_value buf, off;
|
|
1434
|
+
|
|
1435
|
+
mrb_get_args(mrb, "So", &buf, &off);
|
|
1436
|
+
|
|
1437
|
+
return mrb_io_syswrite_common(mrb, pwrite, io, buf, value2off(mrb, off));
|
|
1438
|
+
}
|
|
1439
|
+
#endif /* MRB_WITH_IO_PREAD_PWRITE */
|
|
1440
|
+
|
|
1288
1441
|
static mrb_value
|
|
1289
|
-
io_bufread(mrb_state *mrb, mrb_value
|
|
1442
|
+
io_bufread(mrb_state *mrb, mrb_value str, mrb_int len)
|
|
1290
1443
|
{
|
|
1291
|
-
mrb_value
|
|
1292
|
-
mrb_int
|
|
1444
|
+
mrb_value str2;
|
|
1445
|
+
mrb_int newlen;
|
|
1293
1446
|
struct RString *s;
|
|
1294
1447
|
char *p;
|
|
1295
1448
|
|
|
1296
|
-
mrb_get_args(mrb, "Si", &str, &len);
|
|
1297
1449
|
s = RSTRING(str);
|
|
1298
1450
|
mrb_str_modify(mrb, s);
|
|
1299
1451
|
p = RSTR_PTR(s);
|
|
@@ -1306,6 +1458,54 @@ io_bufread(mrb_state *mrb, mrb_value self)
|
|
|
1306
1458
|
return str2;
|
|
1307
1459
|
}
|
|
1308
1460
|
|
|
1461
|
+
static mrb_value
|
|
1462
|
+
mrb_io_bufread(mrb_state *mrb, mrb_value self)
|
|
1463
|
+
{
|
|
1464
|
+
mrb_value str;
|
|
1465
|
+
mrb_int len;
|
|
1466
|
+
|
|
1467
|
+
mrb_get_args(mrb, "Si", &str, &len);
|
|
1468
|
+
return io_bufread(mrb, str, len);
|
|
1469
|
+
}
|
|
1470
|
+
|
|
1471
|
+
static mrb_value
|
|
1472
|
+
mrb_io_readchar(mrb_state *mrb, mrb_value self)
|
|
1473
|
+
{
|
|
1474
|
+
mrb_value buf;
|
|
1475
|
+
mrb_int len = 1;
|
|
1476
|
+
#ifdef MRB_UTF8_STRING
|
|
1477
|
+
unsigned char c;
|
|
1478
|
+
#endif
|
|
1479
|
+
|
|
1480
|
+
mrb_get_args(mrb, "S", &buf);
|
|
1481
|
+
mrb_assert(RSTRING_LEN(buf) > 0);
|
|
1482
|
+
mrb_assert(RSTRING_PTR(buf) != NULL);
|
|
1483
|
+
mrb_str_modify(mrb, RSTRING(buf));
|
|
1484
|
+
#ifdef MRB_UTF8_STRING
|
|
1485
|
+
c = RSTRING_PTR(buf)[0];
|
|
1486
|
+
if (c & 0x80) {
|
|
1487
|
+
len = mrb_utf8len(RSTRING_PTR(buf), RSTRING_END(buf));
|
|
1488
|
+
if (len == 1 && RSTRING_LEN(buf) < 4) { /* partial UTF-8 */
|
|
1489
|
+
mrb_int blen = RSTRING_LEN(buf);
|
|
1490
|
+
ssize_t n;
|
|
1491
|
+
|
|
1492
|
+
struct mrb_io *fptr = (struct mrb_io*)io_get_open_fptr(mrb, self);
|
|
1493
|
+
|
|
1494
|
+
if (!fptr->readable) {
|
|
1495
|
+
mrb_raise(mrb, E_IO_ERROR, "not opened for reading");
|
|
1496
|
+
}
|
|
1497
|
+
/* refill the buffer */
|
|
1498
|
+
mrb_str_resize(mrb, buf, 4096);
|
|
1499
|
+
n = read(fptr->fd, RSTRING_PTR(buf)+blen, 4096-blen);
|
|
1500
|
+
if (n < 0) mrb_sys_fail(mrb, "sysread failed");
|
|
1501
|
+
mrb_str_resize(mrb, buf, blen+n);
|
|
1502
|
+
}
|
|
1503
|
+
len = mrb_utf8len(RSTRING_PTR(buf), RSTRING_END(buf));
|
|
1504
|
+
}
|
|
1505
|
+
#endif
|
|
1506
|
+
return io_bufread(mrb, buf, len);
|
|
1507
|
+
}
|
|
1508
|
+
|
|
1309
1509
|
void
|
|
1310
1510
|
mrb_init_io(mrb_state *mrb)
|
|
1311
1511
|
{
|
|
@@ -1340,6 +1540,9 @@ mrb_init_io(mrb_state *mrb)
|
|
|
1340
1540
|
mrb_define_method(mrb, io, "closed?", mrb_io_closed, MRB_ARGS_NONE()); /* 15.2.20.5.2 */
|
|
1341
1541
|
mrb_define_method(mrb, io, "pid", mrb_io_pid, MRB_ARGS_NONE()); /* 15.2.20.5.2 */
|
|
1342
1542
|
mrb_define_method(mrb, io, "fileno", mrb_io_fileno_m, MRB_ARGS_NONE());
|
|
1543
|
+
mrb_define_method(mrb, io, "pread", mrb_io_pread, MRB_ARGS_ANY()); /* ruby 2.5 feature */
|
|
1544
|
+
mrb_define_method(mrb, io, "pwrite", mrb_io_pwrite, MRB_ARGS_ANY()); /* ruby 2.5 feature */
|
|
1343
1545
|
|
|
1344
|
-
|
|
1546
|
+
mrb_define_method(mrb, io, "_readchar", mrb_io_readchar, MRB_ARGS_REQ(1));
|
|
1547
|
+
mrb_define_class_method(mrb, io, "_bufread", mrb_io_bufread, MRB_ARGS_REQ(2));
|
|
1345
1548
|
}
|