summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-02-05 17:10:54 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-02-05 17:10:54 +0000
commitcc2ab3aca6015950ce1e91fec2bceaae36000ba9 (patch)
tree7a7dae2059fed54248b61403637401727f88d946 /io.c
parent8210c254bee19294af67bcee0e8f5e02ebb39a60 (diff)
* io.c (fptr_finalize): ignore EBADF when f and f2 use same
descriptor. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2047 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r--io.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/io.c b/io.c
index f078bcca21..88f6815727 100644
--- a/io.c
+++ b/io.c
@@ -1075,17 +1075,21 @@ static void
fptr_finalize(fptr, fin)
OpenFile *fptr;
{
- int n1 = 0, n2 = 0, e = 0;
+ int n1 = 0, n2 = 0, e = 0, f1, f2 = -1;
- if (fptr->f) {
- n1 = fclose(fptr->f);
- if (n1 < 0) e = errno;
- }
if (fptr->f2) {
+ f2 = fileno(fptr->f2);
n2 = fclose(fptr->f2);
+ if (n2 < 0) e = errno;
+ }
+ if (fptr->f && fptr->f != fptr->f2) {
+ f1 = fileno(fptr->f);
+ n1 = fclose(fptr->f);
+ if (n1 < 0 && (e = errno) == EBADF && f1 == f2)
+ n1 = 0;
}
if (!fin && (n1 < 0 || n2 < 0)) {
- if (n2 == 0) errno = e;
+ if (n1 == 0) errno = e;
rb_sys_fail(fptr->path);
}
}
@@ -1644,7 +1648,7 @@ pipe_finalize(fptr)
#endif
rb_last_status = INT2FIX(status);
#else
- fptr_finalize(fptr);
+ fptr_finalize(fptr, Qtrue);
#endif
pipe_del_fptr(fptr);
}