summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-02-14 12:01:50 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-02-14 12:01:50 +0000
commit433fbebfbc49c330b66089f6d191558b967a84f5 (patch)
treed123587eb0b666e9300c36080de5b267f9f4abc2 /io.c
parenta5c05a9ace5aad5fa9fc545be0be829cf61b16c4 (diff)
* io.c (io_reopen): check STDIN, STDOUT and STDERR mode according to
stdio streams. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15473 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r--io.c13
1 files changed, 4 insertions, 9 deletions
diff --git a/io.c b/io.c
index 44d9b3728e..79995c7dd1 100644
--- a/io.c
+++ b/io.c
@@ -4112,8 +4112,9 @@ io_reopen(VALUE io, VALUE nfile)
if (fptr == orig) return io;
#if !defined __CYGWIN__
if (IS_PREP_STDIO(fptr)) {
- if (((fptr->mode & FMODE_READWRITE) & (orig->mode & FMODE_READWRITE)) !=
- (fptr->mode & FMODE_READWRITE)) {
+ if ((fptr->stdio_file == stdin && !(orig->mode & FMODE_READABLE)) ||
+ (fptr->stdio_file == stdout && !(orig->mode & FMODE_WRITABLE)) ||
+ (fptr->stdio_file == stderr && !(orig->mode & FMODE_WRITABLE))) {
rb_raise(rb_eArgError,
"%s can't change access mode from \"%s\" to \"%s\"",
PREP_STDIO_NAME(fptr), rb_io_flags_mode(fptr->mode),
@@ -4132,13 +4133,7 @@ io_reopen(VALUE io, VALUE nfile)
}
/* copy rb_io_t structure */
- if (fptr->mode & FMODE_PREP) {
- int mask = FMODE_PREP|FMODE_READWRITE;
- fptr->mode = (orig->mode & ~mask)|(fptr->mode & mask);
- }
- else {
- fptr->mode = orig->mode;
- }
+ fptr->mode = orig->mode | (fptr->mode & FMODE_PREP);
fptr->pid = orig->pid;
fptr->lineno = orig->lineno;
if (fptr->path) free(fptr->path);