Attached patch (if it comes through, Ins Allah :) overloads the
display_errors directive to accept 'stderr' as parameter which makes the
errors output to STDERR on CLI/CGI. 

Applies to PHP_5_2 branch. Default is still STDOUT.

--Jani

Index: main/main.c
===================================================================
RCS file: /repository/php-src/main/main.c,v
retrieving revision 1.640.2.23.2.46
diff -u -r1.640.2.23.2.46 main.c
--- main/main.c	15 Jul 2007 15:34:28 -0000	1.640.2.23.2.46
+++ main/main.c	18 Jul 2007 15:05:47 -0000
@@ -213,6 +213,84 @@
 }
 /* }}} */
 
+/* {{{ PHP_INI_MH
+ */
+static PHP_INI_MH(OnUpdateDisplayErrors)
+{
+	int mode = 0;
+
+	if (new_value_length == 2 && !strcasecmp("on", new_value)) {
+		mode = PHP_DISPLAY_ERRORS_STDOUT;
+	} else if (new_value_length == 3 && !strcasecmp("yes", new_value)) {
+		mode = PHP_DISPLAY_ERRORS_STDOUT;
+	} else if (new_value_length == 4 && !strcasecmp("true", new_value)) {
+		mode = PHP_DISPLAY_ERRORS_STDOUT;
+	} else if (new_value_length == 6 && !strcasecmp(new_value, "stderr")) {
+		mode = PHP_DISPLAY_ERRORS_STDERR;
+	} else if (new_value_length == 6 && !strcasecmp(new_value, "stdout")) {
+		mode = PHP_DISPLAY_ERRORS_STDOUT;
+	} else {
+		mode = atoi(new_value);
+		if (mode && mode != PHP_DISPLAY_ERRORS_STDOUT && mode != PHP_DISPLAY_ERRORS_STDERR) {
+			mode = PHP_DISPLAY_ERRORS_STDOUT;
+		}
+	}
+	PG(display_errors) = (long) mode;
+	return SUCCESS;
+}
+/* }}} */
+
+/* {{{ PHP_INI_DISP
+ */
+static PHP_INI_DISP(display_errors_mode)
+{
+	int mode, tmp_value_len;
+	char *tmp_value;
+
+	if (type == ZEND_INI_DISPLAY_ORIG && ini_entry->modified) {
+		tmp_value = (ini_entry->orig_value ? ini_entry->orig_value : NULL );
+		tmp_value_len = ini_entry->orig_value_length;
+	} else if (ini_entry->value) {
+		tmp_value = ini_entry->value;
+		tmp_value_len = ini_entry->value_length;
+	} else {
+		tmp_value = NULL;
+		tmp_value_len = 0;
+	}
+
+	if (tmp_value_len == 2 && !strcasecmp("on", tmp_value)) {
+		mode = PHP_DISPLAY_ERRORS_STDOUT;
+	} else if (tmp_value_len == 3 && !strcasecmp("yes", tmp_value)) {
+		mode = PHP_DISPLAY_ERRORS_STDOUT;
+	} else if (tmp_value_len == 4 && !strcasecmp("true", tmp_value)) {
+		mode = PHP_DISPLAY_ERRORS_STDOUT;
+	} else if (tmp_value_len == 6 && !strcasecmp(tmp_value, "stderr")) {
+		mode = PHP_DISPLAY_ERRORS_STDERR;
+	} else if (tmp_value_len == 6 && !strcasecmp(tmp_value, "stdout")) {
+		mode = PHP_DISPLAY_ERRORS_STDOUT;
+	} else {
+		mode = atoi(tmp_value);
+		if (mode && (mode != PHP_DISPLAY_ERRORS_STDOUT || mode != PHP_DISPLAY_ERRORS_STDERR)) {
+			mode = PHP_DISPLAY_ERRORS_STDOUT;
+		}
+	}
+
+	switch (mode) {
+		case PHP_DISPLAY_ERRORS_STDERR:
+			PUTS("STDERR");
+			break;
+
+		case PHP_DISPLAY_ERRORS_STDOUT:
+			PUTS("STDOUT");
+			break;
+
+		default:
+			PUTS("Off");
+			break;
+	}
+}
+/* }}} */
+
 /* Need to convert to strings and make use of:
  * PHP_SAFE_MODE
  *
@@ -246,7 +324,7 @@
 
 	STD_PHP_INI_BOOLEAN("allow_call_time_pass_reference",	"1",	PHP_INI_SYSTEM|PHP_INI_PERDIR,		OnUpdateBool,	allow_call_time_pass_reference,	zend_compiler_globals,	compiler_globals)
 	STD_PHP_INI_BOOLEAN("asp_tags",				"0",		PHP_INI_SYSTEM|PHP_INI_PERDIR,		OnUpdateBool,			asp_tags,				zend_compiler_globals,	compiler_globals)
-	STD_PHP_INI_BOOLEAN("display_errors",		"1",		PHP_INI_ALL,		OnUpdateBool,			display_errors,			php_core_globals,	core_globals)
+	STD_PHP_INI_ENTRY_EX("display_errors",		"1",		PHP_INI_ALL,		OnUpdateDisplayErrors,	display_errors,			php_core_globals,	core_globals, display_errors_mode)
 	STD_PHP_INI_BOOLEAN("display_startup_errors",	"0",	PHP_INI_ALL,		OnUpdateBool,			display_startup_errors,	php_core_globals,	core_globals)
 	STD_PHP_INI_BOOLEAN("enable_dl",			"1",		PHP_INI_SYSTEM,		OnUpdateBool,			enable_dl,				php_core_globals,	core_globals)
 	STD_PHP_INI_BOOLEAN("expose_php",			"1",		PHP_INI_SYSTEM,		OnUpdateBool,			expose_php,				php_core_globals,	core_globals)
@@ -809,7 +887,14 @@
 						php_printf("%s<br />\n<b>%s</b>:  %s in <b>%s</b> on line <b>%d</b><br />\n%s", STR_PRINT(prepend_string), error_type_str, buffer, error_filename, error_lineno, STR_PRINT(append_string));
 					}
 				} else {
-					php_printf("%s\n%s: %s in %s on line %d\n%s", STR_PRINT(prepend_string), error_type_str, buffer, error_filename, error_lineno, STR_PRINT(append_string));
+					/* Write CLI/CGI errors to stderr if display_errors = stderr */
+					if ((!strcmp(sapi_module.name, "cli") || !strcmp(sapi_module.name, "cgi")) &&
+						PG(display_errors) == PHP_DISPLAY_ERRORS_STDERR
+					) {
+						fprintf(stderr, "%s: %s in %s on line %d\n", error_type_str, buffer, error_filename, error_lineno);
+					} else {
+						php_printf("%s\n%s: %s in %s on line %d\n%s", STR_PRINT(prepend_string), error_type_str, buffer, error_filename, error_lineno, STR_PRINT(append_string));
+					}
 				}
 			}
 		}
Index: main/php_globals.h
===================================================================
RCS file: /repository/php-src/main/php_globals.h,v
retrieving revision 1.98.2.1.2.6
diff -u -r1.98.2.1.2.6 php_globals.h
--- main/php_globals.h	9 Jul 2007 17:27:23 -0000	1.98.2.1.2.6
+++ main/php_globals.h	18 Jul 2007 15:05:47 -0000
@@ -33,7 +33,11 @@
 extern ZEND_API struct _php_core_globals core_globals;
 #endif
 
+/* Error display modes */
+#define PHP_DISPLAY_ERRORS_STDOUT	1
+#define PHP_DISPLAY_ERRORS_STDERR	2
 
+/* Track vars */
 #define TRACK_VARS_POST		0
 #define TRACK_VARS_GET		1
 #define TRACK_VARS_COOKIE	2
@@ -77,7 +81,7 @@
 	long max_input_time;
 
 	zend_bool track_errors;
-	zend_bool display_errors;
+	long display_errors;
 	zend_bool display_startup_errors;
 	zend_bool log_errors;
 	long      log_errors_max_len;

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to