diff options
Diffstat (limited to 'ext')
-rw-r--r-- | ext/objspace/depend | 1 | ||||
-rw-r--r-- | ext/objspace/objspace_dump.c | 1 | ||||
-rw-r--r-- | ext/pty/pty.c | 54 | ||||
-rw-r--r-- | ext/stringio/stringio.c | 4 |
4 files changed, 33 insertions, 27 deletions
diff --git a/ext/objspace/depend b/ext/objspace/depend index 3cdfaffa66..91ae569d67 100644 --- a/ext/objspace/depend +++ b/ext/objspace/depend @@ -580,7 +580,6 @@ objspace_dump.o: $(top_srcdir)/internal/compilers.h objspace_dump.o: $(top_srcdir)/internal/gc.h objspace_dump.o: $(top_srcdir)/internal/hash.h objspace_dump.o: $(top_srcdir)/internal/imemo.h -objspace_dump.o: $(top_srcdir)/internal/io.h objspace_dump.o: $(top_srcdir)/internal/sanitizers.h objspace_dump.o: $(top_srcdir)/internal/serial.h objspace_dump.o: $(top_srcdir)/internal/static_assert.h diff --git a/ext/objspace/objspace_dump.c b/ext/objspace/objspace_dump.c index 39584e03b8..d8a11083d6 100644 --- a/ext/objspace/objspace_dump.c +++ b/ext/objspace/objspace_dump.c @@ -18,7 +18,6 @@ #include "internal/class.h" #include "internal/gc.h" #include "internal/hash.h" -#include "internal/io.h" #include "internal/string.h" #include "internal/sanitizers.h" #include "symbol.h" diff --git a/ext/pty/pty.c b/ext/pty/pty.c index 0aca10bfa0..acec33f9bf 100644 --- a/ext/pty/pty.c +++ b/ext/pty/pty.c @@ -448,10 +448,8 @@ pty_close_pty(VALUE assoc) for (i = 0; i < 2; i++) { io = rb_ary_entry(assoc, i); - if (RB_TYPE_P(io, T_FILE)) { - /* it's OK to call rb_io_close again even if it's already closed */ + if (RB_TYPE_P(io, T_FILE) && 0 <= RFILE(io)->fptr->fd) rb_io_close(io); - } } return Qnil; } @@ -501,21 +499,28 @@ pty_open(VALUE klass) { int master_fd, slave_fd; char slavename[DEVICELEN]; + VALUE master_io, slave_file; + rb_io_t *master_fptr, *slave_fptr; + VALUE assoc; getDevice(&master_fd, &slave_fd, slavename, 1); - VALUE master_path = rb_obj_freeze(rb_sprintf("masterpty:%s", slavename)); - VALUE master_io = rb_io_open_descriptor(rb_cIO, master_fd, FMODE_READWRITE | FMODE_SYNC | FMODE_DUPLEX, master_path, RUBY_IO_TIMEOUT_DEFAULT, NULL); - - VALUE slave_path = rb_obj_freeze(rb_str_new_cstr(slavename)); - VALUE slave_file = rb_io_open_descriptor(rb_cFile, slave_fd, FMODE_READWRITE | FMODE_SYNC | FMODE_DUPLEX | FMODE_TTY, slave_path, RUBY_IO_TIMEOUT_DEFAULT, NULL); + master_io = rb_obj_alloc(rb_cIO); + MakeOpenFile(master_io, master_fptr); + master_fptr->mode = FMODE_READWRITE | FMODE_SYNC | FMODE_DUPLEX; + master_fptr->fd = master_fd; + master_fptr->pathv = rb_obj_freeze(rb_sprintf("masterpty:%s", slavename)); - VALUE assoc = rb_assoc_new(master_io, slave_file); + slave_file = rb_obj_alloc(rb_cFile); + MakeOpenFile(slave_file, slave_fptr); + slave_fptr->mode = FMODE_READWRITE | FMODE_SYNC | FMODE_DUPLEX | FMODE_TTY; + slave_fptr->fd = slave_fd; + slave_fptr->pathv = rb_obj_freeze(rb_str_new_cstr(slavename)); + assoc = rb_assoc_new(master_io, slave_file); if (rb_block_given_p()) { return rb_ensure(rb_yield, assoc, pty_close_pty, assoc); } - return assoc; } @@ -572,27 +577,30 @@ pty_getpty(int argc, VALUE *argv, VALUE self) { VALUE res; struct pty_info info; + rb_io_t *wfptr,*rfptr; + VALUE rport = rb_obj_alloc(rb_cFile); + VALUE wport = rb_obj_alloc(rb_cFile); char SlaveName[DEVICELEN]; + MakeOpenFile(rport, rfptr); + MakeOpenFile(wport, wfptr); + establishShell(argc, argv, &info, SlaveName); - VALUE pty_path = rb_obj_freeze(rb_str_new_cstr(SlaveName)); - VALUE rport = rb_io_open_descriptor( - rb_cFile, info.fd, FMODE_READABLE, pty_path, RUBY_IO_TIMEOUT_DEFAULT, NULL - ); + rfptr->mode = rb_io_modestr_fmode("r"); + rfptr->fd = info.fd; + rfptr->pathv = rb_obj_freeze(rb_str_new_cstr(SlaveName)); - int wpty_fd = rb_cloexec_dup(info.fd); - if (wpty_fd == -1) { + wfptr->mode = rb_io_modestr_fmode("w") | FMODE_SYNC; + wfptr->fd = rb_cloexec_dup(info.fd); + if (wfptr->fd == -1) rb_sys_fail("dup()"); - } - VALUE wport = rb_io_open_descriptor( - rb_cFile, wpty_fd, FMODE_WRITABLE | FMODE_TRUNC | FMODE_CREATE | FMODE_SYNC, - pty_path, RUBY_IO_TIMEOUT_DEFAULT, NULL - ); + rb_update_max_fd(wfptr->fd); + wfptr->pathv = rfptr->pathv; res = rb_ary_new2(3); - rb_ary_store(res, 0, rport); - rb_ary_store(res, 1, wport); + rb_ary_store(res,0,(VALUE)rport); + rb_ary_store(res,1,(VALUE)wport); rb_ary_store(res,2,PIDT2NUM(info.child_pid)); if (rb_block_given_p()) { diff --git a/ext/stringio/stringio.c b/ext/stringio/stringio.c index cb9dbece1c..e69afc31f1 100644 --- a/ext/stringio/stringio.c +++ b/ext/stringio/stringio.c @@ -276,7 +276,7 @@ strio_init(int argc, VALUE *argv, struct StringIO *ptr, VALUE self) { VALUE string, vmode, opt; int oflags; - struct rb_io_encoding convconfig; + struct rb_io_enc_t convconfig; argc = rb_scan_args(argc, argv, "02:", &string, &vmode, &opt); rb_io_extract_modeenc(&vmode, 0, opt, &oflags, &ptr->flags, &convconfig); @@ -1743,7 +1743,7 @@ strio_set_encoding(int argc, VALUE *argv, VALUE self) else { enc = rb_find_encoding(ext_enc); if (!enc) { - struct rb_io_encoding convconfig; + struct rb_io_enc_t convconfig; int oflags, fmode; VALUE vmode = rb_str_append(rb_str_new_cstr("r:"), ext_enc); rb_io_extract_modeenc(&vmode, 0, Qnil, &oflags, &fmode, &convconfig); |