At Sat, 8 Feb 2003 14:05:03 +0900, > どういう意味でしょうか。独立したファイルなどとしてどこかのサー > バに置いてないかとか? という意味であれば、たぶんないと思います。 > すでに手元には残っていませんし、ログだけが唯一の保管場所です。 僕の手元にメールがありますのでパッチ部分だけ流します. -- Takaaki Tateishi <ttate / kt.jaist.ac.jp> Index: io.c =================================================================== RCS file: /cvs/ruby/src/ruby/io.c,v retrieving revision 1.69.2.35 diff -u -2 -p -r1.69.2.35 io.c --- io.c 13 Jan 2003 16:24:30 -0000 1.69.2.35 +++ io.c 27 Jan 2003 00:54:25 -0000 @@ -1043,18 +1043,35 @@ rb_io_isatty(io) static void -fptr_finalize(fptr) +fptr_finalize(fptr, fin) OpenFile *fptr; { + int n1 = 0, n2 = 0, e = 0, f1, f2 = -1; + + if (fptr->f2) { + f2 = fileno(fptr->f2); + n2 = fclose(fptr->f2); + fptr->f2 = 0; + if (n2 < 0) e = errno; + } if (fptr->f) { - fclose(fptr->f); + f1 = fileno(fptr->f); + n1 = fclose(fptr->f); + fptr->f = 0; + if (n1 < 0 && errno == EBADF) { + if (f1 == f2 || !(fptr->mode & FMODE_WBUF)) { + n1 = 0; + } + } } - if (fptr->f2) { - fclose(fptr->f2); + if (!fin && (n1 < 0 || n2 < 0)) { + if (n1 == 0) errno = e; + rb_sys_fail(fptr->path); } } static void -rb_io_fptr_cleanup(fptr) +rb_io_fptr_cleanup(fptr, fin) OpenFile *fptr; + int fin; { if (fptr->finalize) { @@ -1062,7 +1079,6 @@ rb_io_fptr_cleanup(fptr) } else { - fptr_finalize(fptr); + fptr_finalize(fptr, fin); } - fptr->f = fptr->f2 = 0; if (fptr->path) { @@ -1080,29 +1096,22 @@ rb_io_fptr_finalize(fptr) if (fileno(fptr->f) < 3) return; - rb_io_fptr_cleanup(fptr); + rb_io_fptr_cleanup(fptr, Qtrue); } -static void -rb_io_fptr_close(fptr) - OpenFile *fptr; +VALUE +rb_io_close(io) + VALUE io; { + OpenFile *fptr; int fd; + fptr = RFILE(io)->fptr; if (!fptr) return; if (!fptr->f && !fptr->f2) return; fd = fileno(fptr->f); - rb_io_fptr_cleanup(fptr); + rb_io_fptr_cleanup(fptr, Qfalse); rb_thread_fd_close(fd); -} -VALUE -rb_io_close(io) - VALUE io; -{ - OpenFile *fptr; - - fptr = RFILE(io)->fptr; - rb_io_fptr_close(fptr); if (fptr->pid) { rb_syswait(fptr->pid); @@ -2020,5 +2029,7 @@ rb_io_clone(io) fptr->f = rb_fdopen(fd, mode); if (orig->f2) { - fd = rb_dup(fileno(orig->f2)); + if (fileno(orig->f) != fileno(orig->f2)) { + fd = rb_dup(fileno(orig->f2)); + } fptr->f2 = rb_fdopen(fd, "w"); } @@ -2923,5 +2934,6 @@ rb_io_ctl(io, req, arg, io_p) } - if (fptr->f2) { /* call on f2 too; ignore result */ + if (fptr->f2 && fileno(fptr->f) != fileno(fptr->f2)) { + /* call on f2 too; ignore result */ io_cntl(fileno(fptr->f2), cmd, narg, io_p); } Index: ext/socket/socket.c =================================================================== RCS file: /cvs/ruby/src/ruby/ext/socket/socket.c,v retrieving revision 1.35.2.19 diff -u -2 -p -r1.35.2.19 socket.c --- ext/socket/socket.c 31 Dec 2002 17:23:30 -0000 1.35.2.19 +++ ext/socket/socket.c 27 Jan 2003 00:54:25 -0000 @@ -171,5 +171,4 @@ sock_new(class, fd) MakeOpenFile(sock, fp); fp->f = rb_fdopen(fd, "r"); - fd = dup(fd); fp->f2 = rb_fdopen(fd, "w"); fp->mode = FMODE_READWRITE;