develooper Front page | perl.perl5.porters | Postings from October 2003

Re: [perl #24067] IO::Handle::error doesn't report errors

Thread Previous | Thread Next
From:
Dave Mitchell
Date:
October 18, 2003 04:57
Subject:
Re: [perl #24067] IO::Handle::error doesn't report errors
Message ID:
20031018115722.GB25146@fdgroup.com
On Mon, Sep 29, 2003 at 03:43:41PM -0000, peff-perlbug@peff.net (via RT) wrote:
> -----------------------------------------------------------------
> The following perl program writes 4096 bytes to a file, checking for errors:
> 
> $ cat foo.pl
> use IO::File;
> my $fh = new IO::File($ARGV[0], 'w');
> $fh->print('a' x 4096) || print "print failed: $!\n";
> print "errors: " . ($fh->error() ? "yes ($!)" : "no") . "\n";
> 
> When running it on a regular file, it works as expected:
> $ perl foo.pl foo.out
> errors: no
> 
> However, when an error actually occurs, the print statement returns an error
> but $fh->error does not return true:
> $ perl foo.pl /dev/full
> print failed: No space left on device
> errors: no
> 
> IO.xs shows that IO::Handle::error just calls PerlIO_error, which typically
> just calls PerlIOBase_error to check the PERLIO_F_ERROR flag. However, if I
> run gdb on the perl binary, I see that:
> 
>  - PerlIO_write is called with (in my case) f=0x81a70e4
>  - PerlIOBuf_flush correctly sets the flag with the same f=0x81a70e4, and
>    sets the PERLIO_F_ERROR flag on f->flags
>  - PerlIO_error gets called with f=0x81a70e4 (from Perl_do_print), and
>    correctly returns that an error occurred
>  - PerlIO_error gets called with f=0x81a70e0, whose flags don't have an
>    error; this is *not* for the error message printed to stdout (I also saw
>    that happen, and it has a different address).
> 
> Whatever the address of the original PerlIO handle is, the final call to
> PerlIO_error always has an address 4 bytes less (the size of a pointer on my
> platform).

In IO.xs, XS_IO__Handle_error is set up to report errors on the input
stream only, which is why it's seeing the wrong result.
That is to say, it effectively calls PerlIO_error(IoIFP(io)) rather than
IoOFP(io).  Anyone have a clue how to handle this, because I dont!

Dave.

-- 
"Strange women lying in ponds distributing swords is no basis for a system
of government. Supreme executive power derives from a mandate from the
masses, not from some farcical aquatic ceremony."
Dennis - Monty Python and the Holy Grail.

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About