mirror of
https://github.com/php-win-ext/pecl-expect.git
synced 2026-03-24 05:02:05 +01:00
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e4b08ad2de | ||
|
|
ce1a540073 | ||
|
|
f85ba457db | ||
|
|
b7d18cfbb9 | ||
|
|
c5895a300f | ||
|
|
925378d4ae | ||
|
|
4e2f9109e1 | ||
|
|
f6251794c5 | ||
|
|
2246eef8d7 | ||
|
|
50ecf39bfd | ||
|
|
41baa86ee3 | ||
|
|
c206870203 | ||
|
|
1ac4b57036 | ||
|
|
f2d7fbb1d1 | ||
|
|
d7abe0572c | ||
|
|
e33a147aef | ||
|
|
17d7c347b8 | ||
|
|
549a25aae3 |
17
config.m4
17
config.m4
@@ -6,19 +6,20 @@ PHP_ARG_WITH(expect,for expect support,
|
||||
[ --with-expect[=DIR] Include expect support (requires libexpect >= 5.43.0).])
|
||||
|
||||
if test "$PHP_EXPECT" != "no"; then
|
||||
for i in $PHP_EXPECT /usr/local /usr ; do
|
||||
if test -f $i/include/expect.h; then
|
||||
LIBEXPECT_DIR=$i
|
||||
|
||||
for i in $PHP_EXPECT/include/expect.h $PHP_EXPECT/include/*/expect.h \
|
||||
/usr/local/include/expect.h /usr/local/include/*/expect.h \
|
||||
/usr/include/expect.h /usr/include/*/expect.h ;
|
||||
do
|
||||
if test -f $i; then
|
||||
LIBEXPECT_INCLUDE_DIR=`dirname $i`
|
||||
LIBEXPECT_DIR=`dirname $LIBEXPECT_INCLUDE_DIR`
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if test -z "$LIBEXPECT_DIR"; then
|
||||
AC_MSG_ERROR(expect extension requires libexpect version >= 5.43.0)
|
||||
fi
|
||||
|
||||
PHP_ADD_LIBRARY_WITH_PATH(expect, $LIBEXPECT_DIR/lib, EXPECT_SHARED_LIBADD)
|
||||
PHP_ADD_INCLUDE($LIBEXPECT_DIR/include)
|
||||
PHP_ADD_INCLUDE($LIBEXPECT_INCLUDE_DIR)
|
||||
|
||||
PHP_NEW_EXTENSION(expect, expect.c expect_fopen_wrapper.c, $ext_shared)
|
||||
PHP_SUBST(EXPECT_SHARED_LIBADD)
|
||||
|
||||
91
expect.c
91
expect.c
@@ -19,11 +19,23 @@
|
||||
/* $ Id: $ */
|
||||
|
||||
#include "php_expect.h"
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_expect_popen, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, command)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_expect_expectl, 0, 0, 2)
|
||||
ZEND_ARG_INFO(0, stream)
|
||||
ZEND_ARG_INFO(0, expect_cases)
|
||||
ZEND_ARG_INFO(1, match)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
/* {{{ expect_functions[] */
|
||||
function_entry expect_functions[] = {
|
||||
PHP_FE(expect_popen, NULL)
|
||||
PHP_FE(expect_expectl, NULL)
|
||||
PHP_FE(expect_popen, arginfo_expect_popen)
|
||||
PHP_FE(expect_expectl, arginfo_expect_expectl)
|
||||
{ NULL, NULL, NULL }
|
||||
};
|
||||
/* }}} */
|
||||
@@ -40,7 +52,7 @@ zend_module_entry expect_module_entry = {
|
||||
NULL,
|
||||
NULL,
|
||||
PHP_MINFO(expect),
|
||||
"0.1",
|
||||
PHP_EXPECT_VERSION,
|
||||
STANDARD_MODULE_PROPERTIES
|
||||
};
|
||||
/* }}} */
|
||||
@@ -80,11 +92,19 @@ static PHP_INI_MH(OnSetExpectLogUser)
|
||||
static PHP_INI_MH(OnSetExpectLogFile)
|
||||
{
|
||||
if (new_value_length > 0) {
|
||||
exp_logfile = fopen (new_value, "a");
|
||||
if (!exp_logfile) {
|
||||
php_error_docref (NULL TSRMLS_CC, E_ERROR, "could not open log file for writting");
|
||||
php_stream *stream = php_stream_open_wrapper (new_value, "a", 0, NULL);
|
||||
if (!stream) {
|
||||
php_error_docref (NULL TSRMLS_CC, E_ERROR, "could not open log file for writing");
|
||||
return FAILURE;
|
||||
}
|
||||
stream->flags |= PHP_STREAM_FLAG_NO_SEEK;
|
||||
if (php_stream_cast(stream, PHP_STREAM_AS_STDIO, (void **) &exp_logfile, REPORT_ERRORS) != SUCCESS) {
|
||||
return FAILURE;
|
||||
}
|
||||
exp_logfile_all = 1;
|
||||
} else {
|
||||
exp_logfile = NULL;
|
||||
exp_logfile_all = 0;
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
@@ -133,7 +153,8 @@ PHP_MSHUTDOWN_FUNCTION(expect)
|
||||
PHP_MINFO_FUNCTION(expect)
|
||||
{
|
||||
php_info_print_table_start();
|
||||
php_info_print_table_row(2, "Expect support", "enabled");
|
||||
php_info_print_table_header(2, "Expect support", "enabled");
|
||||
php_info_print_table_row(2, "Version", PHP_EXPECT_VERSION);
|
||||
php_info_print_table_row(2, "Stream wrapper support", "expect://");
|
||||
php_info_print_table_end();
|
||||
|
||||
@@ -151,6 +172,7 @@ PHP_FUNCTION(expect_popen)
|
||||
int command_len;
|
||||
FILE *fp;
|
||||
php_stream *stream = NULL;
|
||||
zval *z_pid;
|
||||
|
||||
if (ZEND_NUM_ARGS() != 1) { WRONG_PARAM_COUNT; }
|
||||
|
||||
@@ -164,32 +186,44 @@ PHP_FUNCTION(expect_popen)
|
||||
if (!stream) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
stream->flags |= PHP_STREAM_FLAG_NO_SEEK;
|
||||
|
||||
MAKE_STD_ZVAL (z_pid);
|
||||
ZVAL_LONG (z_pid, exp_pid);
|
||||
stream->wrapperdata = z_pid;
|
||||
|
||||
php_stream_to_zval(stream, return_value);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{
|
||||
* proto mixed expect_expectl (resource stream, array expect_cases)
|
||||
* proto mixed expect_expectl (resource stream, array expect_cases [, array match])
|
||||
*/
|
||||
PHP_FUNCTION(expect_expectl)
|
||||
{
|
||||
struct exp_case *ecases, *ec;
|
||||
zval *z_stream, *z_cases, **z_case, **z_value;
|
||||
struct exp_case *ecases, *ec, matchedcase;
|
||||
zval *z_stream, *z_cases, *z_match=NULL, **z_case, **z_value;
|
||||
php_stream *stream;
|
||||
int fd, argc;
|
||||
ulong key;
|
||||
|
||||
if (ZEND_NUM_ARGS() != 2) { WRONG_PARAM_COUNT; }
|
||||
if (ZEND_NUM_ARGS() < 2 || ZEND_NUM_ARGS() > 3) { WRONG_PARAM_COUNT; }
|
||||
|
||||
if (zend_parse_parameters (ZEND_NUM_ARGS() TSRMLS_CC, "ra", &z_stream, &z_cases) == FAILURE) {
|
||||
if (zend_parse_parameters (ZEND_NUM_ARGS() TSRMLS_CC, "ra|z", &z_stream, &z_cases, &z_match) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
php_stream_from_zval (stream, &z_stream);
|
||||
if (php_stream_cast (stream, PHP_STREAM_AS_FD, (void*)&fd, 1) != SUCCESS || fd < 0) {
|
||||
php_error_docref (NULL TSRMLS_CC, E_ERROR, "couldn't cast expect stream to a file descriptor");
|
||||
return;
|
||||
|
||||
if (!stream->wrapperdata) {
|
||||
php_error_docref (NULL TSRMLS_CC, E_ERROR, "supplied argument is not a valid stream resource");
|
||||
return;
|
||||
}
|
||||
|
||||
if (php_stream_cast (stream, PHP_STREAM_AS_FD, (void*)&fd, REPORT_ERRORS) != SUCCESS || fd < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
argc = zend_hash_num_elements (Z_ARRVAL_P(z_cases));
|
||||
@@ -255,6 +289,33 @@ PHP_FUNCTION(expect_expectl)
|
||||
|
||||
key = exp_expectv (fd, ecases);
|
||||
|
||||
int exp_match_len = exp_match_end - exp_match;
|
||||
if (z_match && exp_match && exp_match_len > 0) {
|
||||
char *tmp = (char *)emalloc (sizeof(char) * (exp_match_len + 1));
|
||||
strlcpy (tmp, exp_match, exp_match_len + 1);
|
||||
zval_dtor (z_match);
|
||||
array_init(z_match);
|
||||
add_index_string(z_match, 0, tmp, 1);
|
||||
/* Get case that was matched */
|
||||
matchedcase = ecases[key];
|
||||
/* If there are subpattern matches ... */
|
||||
if (matchedcase.re->startp != NULL) {
|
||||
int i;
|
||||
/* iterate across all possible 9 subpatterns (a limitation of libexpect)
|
||||
and add matching substring to matches array */
|
||||
for (i = 1; i <= 9; i++) {
|
||||
if (matchedcase.re->startp[i] != NULL) {
|
||||
int sub_match_len = matchedcase.re->endp[i] - matchedcase.re->startp[i];
|
||||
char *sub_match = (char *)emalloc (sizeof(char) * (sub_match_len + 1));
|
||||
strlcpy (sub_match, matchedcase.re->startp[i], sub_match_len + 1);
|
||||
add_next_index_string(z_match, sub_match, 1);
|
||||
efree (sub_match);
|
||||
}
|
||||
}
|
||||
}
|
||||
efree (tmp);
|
||||
}
|
||||
|
||||
if (zend_hash_index_find (Z_ARRVAL_P(z_cases), key, (void **)&z_case) == SUCCESS) {
|
||||
if (zend_hash_index_find(Z_ARRVAL_PP(z_case), 1, (void **)&z_value) == SUCCESS) {
|
||||
*return_value = **z_value;
|
||||
|
||||
@@ -21,26 +21,43 @@
|
||||
#include "php.h"
|
||||
#include "php_expect.h"
|
||||
#include "php_streams.h"
|
||||
#include <sys/wait.h>
|
||||
|
||||
php_stream *php_expect_stream_opener (php_stream_wrapper *wrapper, char *command, char *mode, int options,
|
||||
php_stream *php_expect_stream_open (php_stream_wrapper *wrapper, char *command, char *mode, int options,
|
||||
char **opened_command, php_stream_context *context STREAMS_DC TSRMLS_DC)
|
||||
{
|
||||
FILE *fp;
|
||||
|
||||
if (strncasecmp("expect://", command, sizeof("expect://")-1) == 0) {
|
||||
command += sizeof("expect://")-1;
|
||||
}
|
||||
|
||||
if ((fp = exp_popen(command)) != NULL) {
|
||||
return php_stream_fopen_from_pipe (fp, "");
|
||||
php_stream* stream = php_stream_fopen_from_pipe (fp, mode);
|
||||
zval *z_pid;
|
||||
MAKE_STD_ZVAL (z_pid);
|
||||
ZVAL_LONG (z_pid, exp_pid);
|
||||
stream->wrapperdata = z_pid;
|
||||
return stream;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int php_expect_stream_close (php_stream_wrapper *wrapper, php_stream *stream TSRMLS_DC)
|
||||
{
|
||||
zval* z_pid = stream->wrapperdata;
|
||||
int s = 0;
|
||||
waitpid (Z_LVAL_P(z_pid), &s, 0);
|
||||
zval_ptr_dtor (&z_pid);
|
||||
stream->wrapperdata = NULL;
|
||||
return s;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
static php_stream_wrapper_ops php_expect_wrapper_ops = {
|
||||
php_expect_stream_opener,
|
||||
NULL, /* close */
|
||||
php_expect_stream_open,
|
||||
php_expect_stream_close, /* close */
|
||||
NULL, /* stat */
|
||||
NULL, /* stat_url */
|
||||
NULL, /* opendir */
|
||||
|
||||
@@ -14,10 +14,11 @@
|
||||
</maintainers>
|
||||
|
||||
<release>
|
||||
<version>0.2</version>
|
||||
<date>2005-11-12</date>
|
||||
<version>0.2.5</version>
|
||||
<date>2008-11-27</date>
|
||||
<state>beta</state>
|
||||
<notes>Fixed #5941</notes>
|
||||
<notes>Fixed bug #14768 (configure error in Ubuntu 8.04)
|
||||
</notes>
|
||||
</release>
|
||||
|
||||
<filelist>
|
||||
|
||||
@@ -35,6 +35,8 @@
|
||||
extern zend_module_entry expect_module_entry;
|
||||
#define phpext_expect_ptr &expect_module_entry
|
||||
|
||||
#define PHP_EXPECT_VERSION "0.2.5-dev"
|
||||
|
||||
#ifdef PHP_WIN32
|
||||
#define PHP_EXPECT_API __declspec(dllexport)
|
||||
#else
|
||||
|
||||
24
tests/bug12268.phpt
Normal file
24
tests/bug12268.phpt
Normal file
@@ -0,0 +1,24 @@
|
||||
--TEST--
|
||||
PECL Bug #12268 CGI
|
||||
--SKIPIF--
|
||||
<?php if (!extension_loaded("expect") || php_sapi_name() == 'cli') print "skip"; ?>
|
||||
--INI--
|
||||
expect.loguser=0
|
||||
expect.logfile=php://output
|
||||
--FILE--
|
||||
<?php
|
||||
if (php_sapi_name() == 'cli') exit;
|
||||
|
||||
$stream = expect_popen("echo Hello");
|
||||
|
||||
ob_start();
|
||||
|
||||
expect_expectl ($stream, array());
|
||||
|
||||
$r = ob_get_contents();
|
||||
fclose ($stream);
|
||||
|
||||
print "Output: $r";
|
||||
?>
|
||||
--EXPECT--
|
||||
Output: Hello
|
||||
14
tests/bug6996.phpt
Normal file
14
tests/bug6996.phpt
Normal file
@@ -0,0 +1,14 @@
|
||||
--TEST--
|
||||
PECL Bug #6996
|
||||
--SKIPIF--
|
||||
<?php if (!extension_loaded("expect")) print "skip"; ?>
|
||||
--FILE--
|
||||
<?php
|
||||
$stream = popen ("expect://echo 2>/dev/null", "r");
|
||||
|
||||
expect_expectl ($stream, array());
|
||||
|
||||
fclose ($stream);
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: expect_expectl(): supplied argument is not a valid stream resource in %s on line %d
|
||||
Reference in New Issue
Block a user