Source

pecl-ev / util.c

Diff from to

File util.c

 		/* PHP stream or PHP socket resource  */
 		if (ZEND_FETCH_RESOURCE_NO_RETURN(stream, php_stream *, ppfd, -1, NULL, php_file_le_stream())) {
 			/* PHP stream */
-			if (php_stream_cast(stream, PHP_STREAM_AS_FD | PHP_STREAM_CAST_INTERNAL,
-						(void*) &file_desc, 1) != SUCCESS || file_desc < 0) {
-				return -1;
+			if (php_stream_can_cast(stream, PHP_STREAM_AS_FD | PHP_STREAM_CAST_INTERNAL)) {
+				if (php_stream_cast(stream, PHP_STREAM_AS_FD | PHP_STREAM_CAST_INTERNAL,
+							(void*) &file_desc, 1) != SUCCESS || file_desc < 0) {
+					return -1;
+				}
+			} else if (php_stream_can_cast(stream, PHP_STREAM_AS_STDIO | PHP_STREAM_CAST_INTERNAL)) {
+				if (php_stream_cast(stream, PHP_STREAM_AS_STDIO | PHP_STREAM_CAST_INTERNAL,
+							(void*) &file_desc, 1) != SUCCESS || file_desc < 0) {
+					return -1;
+				}
+			} else { /* STDIN, STDOUT, STDERR etc. */
+				php_stream_from_zval_no_verify(stream, ppfd);
+				if (stream == NULL) {
+					php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed obtaining fd");
+					return -1;
+				}
+				file_desc = Z_LVAL_P(*ppfd);
 			}
 		} else {
 			/* PHP socket resource */