summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnaud Le Blanc <lbarnaud@php.net>2009-04-07 16:11:57 +0000
committerArnaud Le Blanc <lbarnaud@php.net>2009-04-07 16:11:57 +0000
commit2b3e1ecece03c15e06afe13112732a5613e25fa0 (patch)
treec69a1b3c33788709f2ede67985d20bf4f6df19bd
parentff4522e7dc923c009585b7a005aee0bfa1bdcaeb (diff)
downloadphp-git-2b3e1ecece03c15e06afe13112732a5613e25fa0.tar.gz
MFH: Fixed bug #47893 (CLI aborts on non blocking stdout)
-rw-r--r--NEWS1
-rw-r--r--sapi/cli/php_cli.c31
2 files changed, 31 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index 2e97324135..2e84e299f8 100644
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,7 @@ PHP NEWS
- Fixed segfault on invalid session.save_path. (Hannes)
- Fixed bug #47903 ("@" operator does not work with string offsets). (Felipe)
+- Fixed bug #47893 (CLI aborts on non blocking stdout). (Arnaud)
- Fixed bug #47849 (Non-deep import loses the namespace). (Rob)
- Fixed bug #47845 (PDO_Firebird omits first row from query). (Lars W)
- Fixed bug #47831 (Compile warning for strnlen() in main/spprintf.c).
diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c
index 1d9516cc8d..22c2fd28ed 100644
--- a/sapi/cli/php_cli.c
+++ b/sapi/cli/php_cli.c
@@ -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;
@@ -224,15 +230,38 @@ static void print_extensions(TSRMLS_D) /* {{{ */
#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;