summaryrefslogtreecommitdiff
path: root/ext/standard/streamsfuncs.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/standard/streamsfuncs.c')
-rw-r--r--ext/standard/streamsfuncs.c114
1 files changed, 114 insertions, 0 deletions
diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c
index 01a49e5679..5979c8cccb 100644
--- a/ext/standard/streamsfuncs.c
+++ b/ext/standard/streamsfuncs.c
@@ -37,6 +37,7 @@ typedef unsigned long long php_timeout_ull;
#else
#include "win32/select.h"
#include "win32/sockets.h"
+#include "win32/console.h"
typedef unsigned __int64 php_timeout_ull;
#endif
@@ -1569,6 +1570,119 @@ PHP_FUNCTION(stream_supports_lock)
RETURN_TRUE;
}
+/* {{{ proto proto stream_isatty(resource stream)
+Check if a stream is a TTY.
+*/
+PHP_FUNCTION(stream_isatty)
+{
+ zval *zsrc;
+ php_stream *stream;
+ zend_long fileno;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &zsrc) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ php_stream_from_zval(stream, zsrc);
+
+ if (php_stream_can_cast(stream, PHP_STREAM_AS_FD_FOR_SELECT) == SUCCESS) {
+ php_stream_cast(stream, PHP_STREAM_AS_FD_FOR_SELECT, (void*)&fileno, 0);
+ }
+ else if (php_stream_can_cast(stream, PHP_STREAM_AS_FD) == SUCCESS) {
+ php_stream_cast(stream, PHP_STREAM_AS_FD, (void*)&fileno, 0);
+ }
+ else {
+ RETURN_FALSE;
+ }
+
+#ifdef PHP_WIN32
+ /* Check if the Windows standard handle is redirected to file */
+ if (php_win32_console_fileno_is_console(fileno)) {
+ RETURN_TRUE;
+ }
+ else {
+ RETURN_FALSE;
+ }
+#elif HAVE_POSIX
+ /* Check if the file descriptor identifier is a terminal */
+ if (isatty(fileno)) {
+ RETURN_TRUE;
+ }
+ else {
+ RETURN_FALSE;
+ }
+#else
+ zend_stat_t stat;
+ if (zend_fstat(fileno, &stat) == 0) {
+ if ((stat.st_mode & /*S_IFMT*/0170000) == /*S_IFCHR*/0020000) {
+ RETURN_TRUE;
+ }
+ }
+ RETURN_NULL();
+#endif
+}
+
+#ifdef PHP_WIN32
+/* {{{ proto proto sapi_windows_vt100_support(resource stream[, bool enable])
+ Get or set VT100 support for the specified stream associated to an
+ output buffer of a Windows console.
+*/
+PHP_FUNCTION(sapi_windows_vt100_support)
+{
+ zval *zsrc;
+ php_stream *stream;
+ zend_bool enable;
+ zend_long fileno;
+
+ int argc = ZEND_NUM_ARGS();
+
+ if (zend_parse_parameters(argc, "r|b", &zsrc, &enable) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ php_stream_from_zval(stream, zsrc);
+
+ if (php_stream_can_cast(stream, PHP_STREAM_AS_FD_FOR_SELECT) == SUCCESS) {
+ php_stream_cast(stream, PHP_STREAM_AS_FD_FOR_SELECT, (void*)&fileno, 0);
+ }
+ else if (php_stream_can_cast(stream, PHP_STREAM_AS_FD) == SUCCESS) {
+ php_stream_cast(stream, PHP_STREAM_AS_FD, (void*)&fileno, 0);
+ }
+ else {
+ zend_internal_type_error(
+ ZEND_ARG_USES_STRICT_TYPES(),
+ "%s() was not able to analyze the specified stream",
+ get_active_function_name()
+ );
+ RETURN_FALSE;
+ }
+
+ /* Check if the file descriptor is a console */
+ if (!php_win32_console_fileno_is_console(fileno)) {
+ RETURN_FALSE;
+ }
+
+ if (argc == 1) {
+ /* Check if the Windows standard handle has VT100 control codes enabled */
+ if (php_win32_console_fileno_has_vt100(fileno)) {
+ RETURN_TRUE;
+ }
+ else {
+ RETURN_FALSE;
+ }
+ }
+ else {
+ /* Enable/disable VT100 control codes support for the specified Windows standard handle */
+ if (php_win32_console_fileno_set_vt100(fileno, enable ? TRUE : FALSE)) {
+ RETURN_TRUE;
+ }
+ else {
+ RETURN_FALSE;
+ }
+ }
+}
+#endif
+
#ifdef HAVE_SHUTDOWN
/* {{{ proto int stream_socket_shutdown(resource stream, int how)
causes all or part of a full-duplex connection on the socket associated