(was Re: PerlIO regerssion tests?)
Nicholas Clark [Wed, 22 Aug 2001 23:29:06 +0000 (00:29 +0100)]
Message-Id:  <20010822232906.Z82818@plum.flirble.org>

p4raw-id: //depot/perl@11747

perlio.c
pod/perlfunc.pod
t/io/binmode.t [new file with mode: 0644]

index e1730c8..90867de 100644 (file)
--- a/perlio.c
+++ b/perlio.c
@@ -1968,7 +1968,10 @@ PerlIOUnix_pushed(PerlIO *f, const char *mode, SV *arg)
   {
    PerlIOUnix *s = PerlIOSelf(f,PerlIOUnix);
    s->fd     = PerlIO_fileno(PerlIONext(f));
-   s->oflags = PerlIOUnix_oflags(mode);
+   /* XXX could (or should) we retrieve the oflags from the open file handle
+      rather than believing the "mode" we are passed in?
+      XXX Should the value on NULL mode be 0 or -1?  */
+   s->oflags = mode ? PerlIOUnix_oflags(mode) : -1;
   }
  PerlIOBase(f)->flags |= PERLIO_F_OPEN;
  return code;
index b4c3711..951fada 100644 (file)
@@ -450,13 +450,12 @@ on systems where the run-time libraries distinguish between binary and
 text files.  If FILEHANDLE is an expression, the value is taken as the
 name of the filehandle.  DISCIPLINE can be either of C<":raw"> for
 binary mode or C<":crlf"> for "text" mode.  If the DISCIPLINE is
-omitted, it defaults to C<":raw">.
+omitted, it defaults to C<":raw">.  Returns true on success, C<undef> on
+failure.
 
 binmode() should be called after open() but before any I/O is done on
 the filehandle.
 
-On many systems binmode() currently has no effect, but in future, it
-will be extended to support user-defined input and output disciplines.
 On some systems binmode() is necessary when you're not working with a
 text file.  For the sake of portability it is a good idea to always use
 it when appropriate, and to never use it when it isn't appropriate.
diff --git a/t/io/binmode.t b/t/io/binmode.t
new file mode 100644 (file)
index 0000000..76fd5a7
--- /dev/null
@@ -0,0 +1,20 @@
+#!./perl -w
+
+BEGIN {
+    chdir 't' if -d 't';
+    @INC = '../lib';
+}
+
+
+use Test::More tests => 8;
+
+ok( binmode(STDERR),            'STDERR made binary' );
+ok( binmode(STDERR, ":unix"),   '  with unix discipline' );
+ok( binmode(STDERR, ":raw"),    '  raw' );
+ok( binmode(STDERR, ":crlf"),   '  and crlf' );
+
+# If this one fails, we're in trouble.  So we just bail out.
+ok( binmode(STDOUT),            'STDOUT made binary' )      || exit(1);
+ok( binmode(STDOUT, ":unix"),   '  with unix discipline' );
+ok( binmode(STDERR, ":raw"),    '  raw' );
+ok( binmode(STDERR, ":crlf"),   '  and crlf' );