lbarnaud Tue Apr 7 16:10:35 2009 UTC
Modified files:
/php-src/sapi/cli php_cli.c
Log:
Fixed bug #47893 (CLI aborts on non blocking stdout)
http://cvs.php.net/viewvc.cgi/php-src/sapi/cli/php_cli.c?r1=1.206&r2=1.207&diff_format=u
Index: php-src/sapi/cli/php_cli.c
diff -u php-src/sapi/cli/php_cli.c:1.206 php-src/sapi/cli/php_cli.c:1.207
--- php-src/sapi/cli/php_cli.c:1.206 Tue Mar 10 23:40:02 2009
+++ php-src/sapi/cli/php_cli.c Tue Apr 7 16:10:35 2009
@@ -20,7 +20,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_cli.c,v 1.206 2009/03/10 23:40:02 helly Exp $ */
+/* $Id: php_cli.c,v 1.207 2009/04/07 16:10:35 lbarnaud Exp $ */
#include "php.h"
#include "php_globals.h"
@@ -91,6 +91,12 @@
#include "php_getopt.h"
+#ifndef PHP_WIN32
+# define php_select(m, r, w, e, t) select(m, r, w, e, t)
+#else
+# include "win32/select.h"
+#endif
+
PHPAPI extern char *php_ini_opened_path;
PHPAPI extern char *php_ini_scanned_files;
@@ -228,15 +234,38 @@
#define STDOUT_FILENO 1
#endif
+static inline int sapi_cli_select(int fd)
+{
+ fd_set wfd, dfd;
+ struct timeval tv;
+ int ret;
+
+ FD_ZERO(&wfd);
+ FD_ZERO(&dfd);
+
+ PHP_SAFE_FD_SET(fd, &wfd);
+
+ tv.tv_sec = FG(default_socket_timeout);
+ tv.tv_usec = 0;
+
+ ret = php_select(fd+1, &dfd, &wfd, &dfd, &tv);
+
+ return ret != -1;
+}
+
static inline size_t sapi_cli_single_write(const char *str, uint str_length)
/* {{{ */
{
#ifdef PHP_WRITE_STDOUT
long ret;
- ret = write(STDOUT_FILENO, str, str_length);
+ do {
+ ret = write(STDOUT_FILENO, str, str_length);
+ } while (ret <= 0 && errno == EAGAIN && sapi_cli_select(STDOUT_FILENO));
+
if (ret <= 0) {
return 0;
}
+
return ret;
#else
size_t ret;
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php