diff options
Diffstat (limited to 'sapi/phpdbg/phpdbg_cmd.c')
| -rw-r--r-- | sapi/phpdbg/phpdbg_cmd.c | 82 | 
1 files changed, 26 insertions, 56 deletions
| diff --git a/sapi/phpdbg/phpdbg_cmd.c b/sapi/phpdbg/phpdbg_cmd.c index d91acb1d17..5c74adfdcd 100644 --- a/sapi/phpdbg/phpdbg_cmd.c +++ b/sapi/phpdbg/phpdbg_cmd.c @@ -703,80 +703,30 @@ PHPDBG_API int phpdbg_stack_execute(phpdbg_param_t *stack, zend_bool allow_async  PHPDBG_API char *phpdbg_read_input(char *buffered TSRMLS_DC) /* {{{ */  { +	char buf[PHPDBG_MAX_CMD];  	char *cmd = NULL;  	char *buffer = NULL; -	if (!(PHPDBG_G(flags) & PHPDBG_IS_QUITTING)) { +	if ((PHPDBG_G(flags) & (PHPDBG_IS_STOPPING | PHPDBG_IS_RUNNING)) != PHPDBG_IS_STOPPING) {  		if ((PHPDBG_G(flags) & PHPDBG_IS_REMOTE) && (buffered == NULL) && !phpdbg_active_sigsafe_mem(TSRMLS_C)) {  			fflush(PHPDBG_G(io)[PHPDBG_STDOUT].ptr);  		}  		if (buffered == NULL) { -			if (0) { -disconnect: -				PHPDBG_G(flags) |= (PHPDBG_IS_QUITTING|PHPDBG_IS_DISCONNECTED); -				zend_bailout(); -				return NULL; -			} -  #define USE_LIB_STAR (defined(HAVE_LIBREADLINE) || defined(HAVE_LIBEDIT)) -  			/* note: EOF makes readline write prompt again in local console mode - and ignored if compiled without readline */ -			/* strongly assuming to be in blocking mode... */  #if USE_LIB_STAR  readline:  			if (PHPDBG_G(flags) & PHPDBG_IS_REMOTE)  #endif  			{ -				char buf[PHPDBG_MAX_CMD]; -				int bytes = PHPDBG_G(input_buflen), len = 0; -				if (PHPDBG_G(input_buflen)) { -					memcpy(buf, PHPDBG_G(input_buffer), bytes); -				} -  				phpdbg_write("prompt", "", "%s", phpdbg_get_prompt(TSRMLS_C)); -				PHPDBG_G(last_was_newline) = 1; - -				do { -					int i; -					if (bytes <= 0) {  -						continue; -					} - -					for (i = len; i < len + bytes; i++) { -						if (buf[i] == '\x03') { -							if (i != len + bytes - 1) { -								memmove(buf + i, buf + i + 1, len + bytes - i - 1); -							} -							len--; -							i--; -							continue; -						} -						if (buf[i] == '\n') { -							PHPDBG_G(input_buflen) = len + bytes - 1 - i; -							if (PHPDBG_G(input_buflen)) { -								memcpy(PHPDBG_G(input_buffer), buf + i + 1, PHPDBG_G(input_buflen)); -							} -							if (i != PHPDBG_MAX_CMD - 1) { -								buf[i + 1] = 0; -							} -							cmd = buf; -							goto end; -						} -					} -					len += bytes; -					/* XXX export the timeout through INI??*/ -				} while ((bytes = phpdbg_mixed_read(PHPDBG_G(io)[PHPDBG_STDIN].fd, buf + len, PHPDBG_MAX_CMD - len, -1 TSRMLS_CC)) > 0); - -				if (bytes <= 0) { -					goto disconnect; -				} - -				cmd = buf; +				phpdbg_consume_stdin_line(cmd = buf TSRMLS_CC);  			}  #if USE_LIB_STAR  			else {  				cmd = readline(phpdbg_get_prompt(TSRMLS_C)); +				PHPDBG_G(last_was_newline) = 1;  			}  			if (!cmd) { @@ -790,8 +740,7 @@ readline:  		} else {  			cmd = buffered;  		} -end: -		PHPDBG_G(last_was_newline) = 1; +  		buffer = estrdup(cmd);  #if USE_LIB_STAR @@ -829,3 +778,24 @@ PHPDBG_API void phpdbg_destroy_input(char **input TSRMLS_DC) /*{{{ */  {  	efree(*input);  } /* }}} */ + +PHPDBG_API int phpdbg_ask_user_permission(const char *question TSRMLS_DC) { +	if (!(PHPDBG_G(flags) & PHPDBG_WRITE_XML)) { +		char buf[PHPDBG_MAX_CMD]; +		phpdbg_out("%s", question); +		phpdbg_out(" (type y or n): "); + +		while (1) { +			phpdbg_consume_stdin_line(buf TSRMLS_CC); +			if (buf[1] == '\n' && (buf[0] == 'y' || buf[0] == 'n')) { +				if (buf[0] == 'y') { +					return SUCCESS; +				} +				return FAILURE; +			} +			phpdbg_out("Please enter either y (yes) or n (no): "); +		} +	} + +	return SUCCESS; +} | 
