summaryrefslogtreecommitdiff
path: root/main/streams/xp_socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/streams/xp_socket.c')
-rw-r--r--main/streams/xp_socket.c40
1 files changed, 23 insertions, 17 deletions
diff --git a/main/streams/xp_socket.c b/main/streams/xp_socket.c
index 511e1570d1..56fc4fcd4f 100644
--- a/main/streams/xp_socket.c
+++ b/main/streams/xp_socket.c
@@ -75,30 +75,36 @@ retry:
didwrite = send(sock->socket, buf, XP_SOCK_BUF_SIZE(count), (sock->is_blocked && ptimeout) ? MSG_DONTWAIT : 0);
if (didwrite <= 0) {
- int err = php_socket_errno();
char *estr;
+ int err = php_socket_errno();
+ if (err == EWOULDBLOCK || err == EAGAIN) {
+ if (sock->is_blocked) {
+ int retval;
- if (sock->is_blocked && (err == EWOULDBLOCK || err == EAGAIN)) {
- int retval;
-
- sock->timeout_event = 0;
+ sock->timeout_event = 0;
- do {
- retval = php_pollfd_for(sock->socket, POLLOUT, ptimeout);
+ do {
+ retval = php_pollfd_for(sock->socket, POLLOUT, ptimeout);
- if (retval == 0) {
- sock->timeout_event = 1;
- break;
- }
+ if (retval == 0) {
+ sock->timeout_event = 1;
+ break;
+ }
- if (retval > 0) {
- /* writable now; retry */
- goto retry;
- }
+ if (retval > 0) {
+ /* writable now; retry */
+ goto retry;
+ }
- err = php_socket_errno();
- } while (err == EINTR);
+ err = php_socket_errno();
+ } while (err == EINTR);
+ } else {
+ /* EWOULDBLOCK/EAGAIN is not an error for a non-blocking stream.
+ * Report zero byte write instead. */
+ return 0;
+ }
}
+
estr = php_socket_strerror(err, NULL, 0);
php_error_docref(NULL, E_NOTICE, "send of " ZEND_LONG_FMT " bytes failed with errno=%d %s",
(zend_long)count, err, estr);