lbarnaud Tue Nov 4 17:07:21 2008 UTC Added files: (Branch: PHP_5_2) /php-src/ext/standard/tests/streams stream_get_line_nb.phpt
Modified files: /php-src/main/streams streams.c /php-src NEWS Log: MFH: Fixed stream_get_line() to behave as documented on non-blocking streams http://cvs.php.net/viewvc.cgi/php-src/main/streams/streams.c?r1=1.82.2.6.2.28&r2=1.82.2.6.2.29&diff_format=u Index: php-src/main/streams/streams.c diff -u php-src/main/streams/streams.c:1.82.2.6.2.28 php-src/main/streams/streams.c:1.82.2.6.2.29 --- php-src/main/streams/streams.c:1.82.2.6.2.28 Mon Nov 3 23:29:50 2008 +++ php-src/main/streams/streams.c Tue Nov 4 17:07:20 2008 @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: streams.c,v 1.82.2.6.2.28 2008/11/03 23:29:50 lbarnaud Exp $ */ +/* $Id: streams.c,v 1.82.2.6.2.29 2008/11/04 17:07:20 lbarnaud Exp $ */ #define _GNU_SOURCE #include "php.h" @@ -881,6 +881,9 @@ } if (!e) { + if (seek_len < maxlen && !stream->eof) { + return NULL; + } toread = maxlen; } else { toread = e - (char *) stream->readbuf - stream->readpos; http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.1301&r2=1.2027.2.547.2.1302&diff_format=u Index: php-src/NEWS diff -u php-src/NEWS:1.2027.2.547.2.1301 php-src/NEWS:1.2027.2.547.2.1302 --- php-src/NEWS:1.2027.2.547.2.1301 Tue Nov 4 00:43:06 2008 +++ php-src/NEWS Tue Nov 4 17:07:20 2008 @@ -43,6 +43,8 @@ filter). (Arnaud) - Fixed bug #42294 (Unified solution for round() based on C99 round). (Ilia) +- Fixed stream_get_line() to behave as documented on non-blocking streams. + (Arnaud) - Fixed endless loop in PDOStatement::debugDumpParams(). (jonah.harris at gmail dot com) - Fixed ability to use "internal" heaps in extensions. (Arnaud, Dmitry) http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/streams/stream_get_line_nb.phpt?view=markup&rev=1.1 Index: php-src/ext/standard/tests/streams/stream_get_line_nb.phpt +++ php-src/ext/standard/tests/streams/stream_get_line_nb.phpt --TEST-- stream_get_line() on non-blocking stream --SKIPIF-- <?php $sockets = @stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, 0); if (!$sockets) die("skip"); fclose($sockets[0]); fclose($sockets[1]); ?> --FILE-- <?php /** * Tests that stream_get_line() behaves as documented on non-blocking streams: * Never return incomplete lines, except on documented conditions: * length bytes have been read, the string specified by ending is found, EOF. */ $sockets = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, 0); var_dump($sockets); stream_set_blocking($sockets[1], 0); $eol = b'<EOL>'; fwrite($sockets[0], b"line start"); var_dump(stream_get_line($sockets[1], 8192, $eol)); // Does not returns incomplete line (EOL not found) var_dump(stream_get_line($sockets[1], 8192, $eol)); fwrite($sockets[0], b", line end"); fwrite($sockets[0], b", $eol"); var_dump(stream_get_line($sockets[1], 8192, $eol)); // Returns full line (EOL found) var_dump(stream_get_line($sockets[1], 8192, $eol)); // Nothing to read var_dump(stream_get_line($sockets[1], 8192, $eol)); fwrite($sockets[0], b"incomplete line"); var_dump(stream_get_line($sockets[1], strlen(b"incomplete line"), $eol)); // EOL not found but $length has been read, return incomplete line fwrite($sockets[0], b"incomplete line"); var_dump(stream_get_line($sockets[1], 8192, $eol)); // Does not returns incomplete line (EOL not found) var_dump(fread($sockets[1], strlen(b"incomplete line"))); // Returns buffer readden by stream_get_line fwrite($sockets[0], b"end of file"); var_dump(stream_get_line($sockets[1], 8192, $eol)); // Does not returns incomplete line (EOL not found) fclose($sockets[0]); var_dump(stream_get_line($sockets[1], 8192, $eol)); // Returns incomplete line (End of file) fclose($sockets[1]); ?> --EXPECTF-- array(2) { [0]=> resource(%d) of type (stream) [1]=> resource(%d) of type (stream) } bool(false) bool(false) string(22) "line start, line end, " bool(false) bool(false) string(15) "incomplete line" bool(false) string(15) "incomplete line" bool(false) string(11) "end of file" -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php