diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-02-26 05:29:06 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-02-26 05:29:06 +0000 |
commit | df2d69b49ab1c8b42dd6c18fb63df26aec95f364 (patch) | |
tree | f352837db7633a5d6355461ca14f0f870d951e86 /io.c | |
parent | 69739b14a5f8950c1da8b86f90a70903ed975fee (diff) |
* eval.c (proc_call): should not modify ruby_block->frame.iter
based on ruby_frame->iter altered by PUSH_ITER().
* eval.c (rb_thread_fd_close): should save current context before
raising exception.
* io.c (set_stdin): preserve original stdin.
* io.c (set_outfile): preserve original stdout/stderr.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1219 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r-- | io.c | 28 |
1 files changed, 26 insertions, 2 deletions
@@ -81,6 +81,7 @@ VALUE rb_eIOError; VALUE rb_stdin, rb_stdout, rb_stderr, rb_defout; static VALUE orig_stdin, orig_stdout, orig_stderr; +static int saved_fd[3] = {0, 1, 2}; VALUE rb_output_fs; VALUE rb_rs; @@ -1187,7 +1188,12 @@ rb_io_sysread(io, len) } str = rb_str_new(0, ilen); + n = fileno(fptr->f); rb_thread_wait_fd(fileno(fptr->f)); + if (fptr->f == 0) { + fprintf(stderr, "bingo\n"); + exit(1); + } TRAP_BEG; n = read(fileno(fptr->f), RSTRING(str)->ptr, RSTRING(str)->len); TRAP_END; @@ -2212,7 +2218,15 @@ set_stdin(val, id, var) GetOpenFile(val, fptr); rb_io_check_readable(fptr); - dup2(fileno(fptr->f), 0); + if (fileno(fptr->f) == 0 && saved_fd[0] != 0) { + dup2(saved_fd[0], 0); + close(saved_fd[0]); + saved_fd[0] = 0; + } + else { + saved_fd[0] = dup(0); + dup2(fileno(fptr->f), 0); + } *var = val; } @@ -2226,6 +2240,7 @@ set_outfile(val, var, orig, stdf) { OpenFile *fptr; FILE *f; + int fd; if (val == *var) return; @@ -2243,7 +2258,16 @@ set_outfile(val, var, orig, stdf) GetOpenFile(val, fptr); rb_io_check_writable(fptr); f = GetWriteFile(fptr); - dup2(fileno(f), fileno(stdf)); + fd = fileno(stdf); + if (fileno(fptr->f) == fd && saved_fd[fd] != fd) { + dup2(saved_fd[fd], fd); + close(saved_fd[fd]); + saved_fd[fd] = fd; + } + else { + saved_fd[fd] = dup(fd); + dup2(fileno(fptr->f), fd); + } *var = val; } |