Req #39598 [Com]: error verification after fwrite()
| From: | gauthierm@php.net | Date: | Fri, 01 Mar 2013 00:04:00 +0000 |
| Subject: | Req #39598 [Com]: error verification after fwrite() | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-177483@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=39598&edit=1
ID: 39598
Comment by: gauthierm@php.net
Reported by: max at nucleus dot it
Summary: error verification after fwrite()
Status: Open
Type: Feature/Change Request
Package: Feature/Change Request
Operating System: Linux
PHP Version: 5.2.0
Block user comment: N
Private report: N
New Comment:
Here's a simple reproduce test case:
http://labs.silverorange.com/files/php-bug39598/php-bug-39598-test.phps
In this case, and EPIPE occurs. The fwrite call writes 0 bytes. No error code is
available and no PHP error is raised.
Previous Comments:
------------------------------------------------------------------------
[2006-11-22 22:53:31] max at nucleus dot it
Description:
------------
The documentation states tha fwrite() returns false in
case of error, but it doesn't do so if the actual write
fails.
For example if I asynchronously write to a pipe (such as
those obtained by proc_open()) I and the pipe is not ready
or is broken, fwrite() returns 0.
This could be a correct behaviour it I had a way to
determine the error.
The problem is that EAGAIN or EPIPE are completely
impossible to determine and I can't know if I need to wait
or I have to close the stream.
A possible solution would be to implement ferror() or
errno.
Reproduce code:
---------------
$Proc = proc_open($Cmd, $Streams, $Pipes, $CWD, $Env);
stream_set_blocking($Pipes[0], 0);
$Result = fwrite($Pipes[0], "test");
// If $Pipes[0] is not ready to receive data
// $Result is 0, but I can't know why.
// The real code I'm writing involves
// stream_select() and repeated reads and writes
// on multiple pipes.
Expected result:
----------------
fwrite() should return 0 when the stream is asynchrounous,
the C write() returns 0 and errno is EAGAIN.
fwrite() should return false in all other cases where the
C write() returns 0.
Alternatively a way to access ferror() or errno is needed.
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=39598&edit=1