[win32] another 'old' patch
Roderick Schertler [Fri, 19 Dec 1997 12:52:36 +0000 (07:52 -0500)]
Message-Id: <pzg1npp6e3.fsf@eeyore.ibcinc.com>
Subject: [PERL] [PATCH] Re: Problem with open >&=

p4raw-id: //depot/win32/perl@610

doio.c
t/op/misc.t

diff --git a/doio.c b/doio.c
index de0cdee..cc038e2 100644 (file)
--- a/doio.c
+++ b/doio.c
@@ -92,6 +92,7 @@ do_open(GV *gv, register char *name, I32 len, int as_raw, int rawmode, int rawpe
     PerlIO *fp;
     int fd;
     int result;
+    bool was_fdopen = FALSE;
 
     forkprocess = 1;           /* assume true if no fork */
 
@@ -221,6 +222,8 @@ do_open(GV *gv, register char *name, I32 len, int as_raw, int rawmode, int rawpe
                    }
                    if (dodup)
                        fd = PerlLIO_dup(fd);
+                   else
+                       was_fdopen = TRUE;
                    if (!(fp = PerlIO_fdopen(fd,mode))) {
                        if (dodup)
                            PerlLIO_close(fd);
@@ -330,7 +333,8 @@ do_open(GV *gv, register char *name, I32 len, int as_raw, int rawmode, int rawpe
            sv = *av_fetch(fdpid,fd,TRUE);
            (void)SvUPGRADE(sv, SVt_IV);
            SvIVX(sv) = pid;
-           PerlIO_close(fp);
+           if (!was_fdopen)
+               PerlIO_close(fp);
 
        }
        fp = saveifp;
index 1ca45db..40c9c38 100755 (executable)
@@ -358,3 +358,13 @@ init <b>
 end <c>
 argv <>
 ########
+-l
+# fdopen from a system descriptor to a system descriptor used to close
+# the former.
+open STDERR, '>&=STDOUT' or die $!;
+select STDOUT; $| = 1; print fileno STDOUT;
+select STDERR; $| = 1; print fileno STDERR;
+EXPECT
+1
+2
+########