mirror of
https://github.com/php-win-ext/pecl-expect.git
synced 2026-03-24 05:02:05 +01:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d1c4cdc291 | ||
|
|
1931258612 | ||
|
|
f2b2ca9e3f | ||
|
|
403fa58b6f | ||
|
|
832872beac | ||
|
|
3fb8cf045d | ||
|
|
60eb6b9f16 | ||
|
|
cc2e72e3d2 | ||
|
|
d19b005e00 | ||
|
|
9d83d267c2 | ||
|
|
0fdba09ee3 | ||
|
|
7423b65a2e |
13
.github/FUNDING.yml
vendored
Normal file
13
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: [macintoshplus] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
# patreon: # Replace with a single Patreon username
|
||||
# open_collective: # Replace with a single Open Collective username
|
||||
# ko_fi: # Replace with a single Ko-fi username
|
||||
# tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
# community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
# liberapay: # Replace with a single Liberapay username
|
||||
# issuehunt: # Replace with a single IssueHunt username
|
||||
# otechie: # Replace with a single Otechie username
|
||||
# lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
|
||||
# custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
||||
130
.github/windows.yml
vendored
Normal file
130
.github/windows.yml
vendored
Normal file
@@ -0,0 +1,130 @@
|
||||
name: Publish Windows Releases
|
||||
on:
|
||||
workflow_dispatch: ~
|
||||
release:
|
||||
types: [created]
|
||||
push:
|
||||
branches: ['*']
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
build-lib:
|
||||
runs-on: windows-2022
|
||||
strategy:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
# arch: [x64, x86]
|
||||
arch: [x64]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Enable Developer Command Prompt
|
||||
uses: ilammy/msvc-dev-cmd@v1
|
||||
with:
|
||||
arch: ${{ matrix.arch }}
|
||||
- name: Build the library
|
||||
run: |
|
||||
mkdir tcl
|
||||
cd tcl
|
||||
Invoke-WebRequest -Uri https://github.com/tcltk/tcl/releases/download/core-9-0-3/tcl9.0.3-src.tar.gz -outFile tcl.tar.gz
|
||||
7z x tcl.tar.gz -so | 7z x -aoa -si -ttar -o"."
|
||||
cd tcl9.0.3\win
|
||||
mkdir install
|
||||
nmake -f Makefile.vc all INSTALLDIR=.\install
|
||||
nmake -f Makefile.vc install INSTALLDIR=.\install
|
||||
7z a tcl.zip .\install
|
||||
- name: Upload TCL library
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: tcl-${{ matrix.arch }}
|
||||
path: tcl\tcl9.0.3\win\tcl.zip
|
||||
if-no-files-found: error
|
||||
|
||||
get-extension-matrix:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
matrix: ${{ steps.extension-matrix.outputs.matrix }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
- name: Get the extension matrix
|
||||
id: extension-matrix
|
||||
uses: php/php-windows-builder/extension-matrix@v1
|
||||
with:
|
||||
arch-list: x64
|
||||
php-version-list: "8.0"
|
||||
ts-list: nts
|
||||
|
||||
build:
|
||||
needs: [get-extension-matrix, build-lib]
|
||||
runs-on: ${{ matrix.os }}
|
||||
continue-on-error: false
|
||||
strategy:
|
||||
fail-fast: true
|
||||
matrix: ${{fromJson(needs.get-extension-matrix.outputs.matrix)}}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
- name: prepare
|
||||
run: |
|
||||
mkdir ..\tcl
|
||||
- name: Download native lib
|
||||
uses: actions/download-artifact@v5
|
||||
with:
|
||||
name: tcl-${{ matrix.arch }}
|
||||
|
||||
- name: Extract native lib
|
||||
run: |
|
||||
dir
|
||||
7z x tcl.zip -o"..\tcl"
|
||||
dir ..
|
||||
dir ..\tcl
|
||||
dir ..\tcl\install\include
|
||||
dir ..\tcl\install\lib
|
||||
|
||||
- name: Setup PHP SDK
|
||||
id: setup-php-windows
|
||||
uses: php/setup-php-sdk@v0.12
|
||||
with:
|
||||
version: ${{ matrix.php-version }}
|
||||
arch: ${{ matrix.arch }}
|
||||
ts: ${{ matrix.ts }}
|
||||
|
||||
- name: Enable Developer Command Prompt
|
||||
uses: ilammy/msvc-dev-cmd@v1
|
||||
with:
|
||||
arch: ${{ matrix.arch }}
|
||||
toolset: ${{ steps.setup-php-windows.outputs.toolset }}
|
||||
|
||||
- run: phpize
|
||||
- run: ./configure --with-expect --with-extra-includes="$($Env:GITHUB_WORKSPACE)..\tcl\install\include" --with-extra-libs="$($Env:GITHUB_WORKSPACE)..\tcl\install\lib" --with-prefix=${{steps.setup-php-windows.outputs.prefix}}
|
||||
- run: nmake
|
||||
- run: nmake test TESTS=tests
|
||||
|
||||
|
||||
# - name: Upload TCL library
|
||||
# uses: actions/upload-artifact@v5
|
||||
# with:
|
||||
# name: tcl-${{ matrix.php }}-${{ matrix.arch }}
|
||||
# path: |
|
||||
# win\install\
|
||||
|
||||
# - name: Build the extension
|
||||
# uses: php/php-windows-builder/extension@v1
|
||||
# with:
|
||||
# php-version: ${{ matrix.php-version }}
|
||||
# arch: ${{ matrix.arch }}
|
||||
# ts: ${{ matrix.ts }}
|
||||
# args: '--with-expect'
|
||||
release:
|
||||
runs-on: ubuntu-latest
|
||||
needs: build
|
||||
if: ${{ github.event_name == 'release' }}
|
||||
steps:
|
||||
- name: Upload artifact to the release
|
||||
uses: php/php-windows-builder/release@v1
|
||||
with:
|
||||
release: ${{ github.event.release.tag_name }}
|
||||
35
.github/workflows/ci.yml
vendored
Normal file
35
.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
name: CI
|
||||
on:
|
||||
push:
|
||||
branches: ['*']
|
||||
jobs:
|
||||
test-linux:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
php-rel: ['8.0', '8.1', '8.2', '8.3', '8.4', '8.5']
|
||||
# php-rel: ['8.0']
|
||||
ts-state: [ts, nts]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- name: Install dependencies
|
||||
run: sudo apt-get install -y tcl-dev tcl-expect-dev
|
||||
- name: Setup PHP
|
||||
id: setup-php
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: '${{ matrix.php-rel }}'
|
||||
env:
|
||||
phpts: '${{ matrix.ts-state }}'
|
||||
|
||||
- name: build extension
|
||||
env:
|
||||
CPPFLAGS: -I/usr/include/tcl
|
||||
run: |
|
||||
phpize
|
||||
./configure --with-expect
|
||||
make
|
||||
- name: run tests
|
||||
run: make test
|
||||
25
.gitignore
vendored
Normal file
25
.gitignore
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
/config.h
|
||||
/config.h.in
|
||||
/config.log
|
||||
/config.nice
|
||||
/config.status
|
||||
/configure
|
||||
/configure.ac
|
||||
/expect.la
|
||||
/expect.lo
|
||||
/expect_fopen_wrapper.lo
|
||||
/libtool
|
||||
/Makefile
|
||||
/Makefile.fragments
|
||||
/Makefile.objects
|
||||
/run-tests.php
|
||||
/tests/*.diff
|
||||
/tests/*.exp
|
||||
/tests/*.log
|
||||
/tests/*.php
|
||||
/tests/*.out
|
||||
/tests/*.sh
|
||||
/.libs/
|
||||
/autom4te.cache/
|
||||
/build/
|
||||
/modules/
|
||||
71
README.md
Normal file
71
README.md
Normal file
@@ -0,0 +1,71 @@
|
||||
PHP extension for expect library
|
||||
================================
|
||||
|
||||
This extension allows to interact with processes through PTY, using expect library.
|
||||
|
||||
This extension uses a Tcl/Expect library: https://www.tcl-lang.org/.
|
||||
|
||||
Original author: Michael Spector
|
||||
|
||||
> **Unable to build this extension for Windows because the TCL Expect is not available on Windows.**
|
||||
|
||||
|
||||
Maintained branches:
|
||||
|
||||
| Version | Status |
|
||||
|---------|------------------------------|
|
||||
| master | unmaintened :x: |
|
||||
| v0.x | maintened :white_check_mark: |
|
||||
|
||||
Maintained PHP Versions compatibility:
|
||||
|
||||
| PHP Version | Status |
|
||||
|-------------|------------------------|
|
||||
| 5.x | no :x: |
|
||||
| 7.x | no :x: |
|
||||
| 8.0 | yes :white_check_mark: |
|
||||
| 8.1 | yes :white_check_mark: |
|
||||
| 8.2 | yes :white_check_mark: |
|
||||
| 8.3 | yes :white_check_mark: |
|
||||
| 8.4 | yes :white_check_mark: |
|
||||
| 8.5 | yes :white_check_mark: |
|
||||
|
||||
Installation system support:
|
||||
|
||||
| Platform | Status |
|
||||
|----------|------------------------|
|
||||
| PECL | no :x: |
|
||||
| PIE | yes :white_check_mark: |
|
||||
|
||||
|
||||
To install the extension, install the library `tcl-dev tcl-expect-dev` first.
|
||||
|
||||
Debian/Ubuntu/Mint:
|
||||
|
||||
```shell
|
||||
sudo apt-get install tcl-dev tcl-expect-dev
|
||||
```
|
||||
|
||||
Alpine Linux:
|
||||
|
||||
```shell
|
||||
apk add tcl-dev expect-dev
|
||||
```
|
||||
|
||||
Fedora:
|
||||
|
||||
```shell
|
||||
sudo dnf install tcl-devel expect-devel
|
||||
```
|
||||
|
||||
Arch Linux:
|
||||
|
||||
```shell
|
||||
sudo pacman -S tcl expect
|
||||
```
|
||||
|
||||
And use PIE (PHP Installer Extension) with a command like:
|
||||
|
||||
```bash
|
||||
pie install php-win-ext/expect
|
||||
```
|
||||
21
composer.json
Normal file
21
composer.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"name": "php-win-ext/expect",
|
||||
"type": "php-ext",
|
||||
"license": [
|
||||
"PHP-3.01"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Michael Spector",
|
||||
"email": "michael@php.net"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">= 8.0.0"
|
||||
},
|
||||
"php-ext": {
|
||||
"extension-name": "expect",
|
||||
"os-families-exclude": ["windows"]
|
||||
},
|
||||
"description": "This extension allows to interact with processes through PTY, using expect library."
|
||||
}
|
||||
@@ -22,7 +22,9 @@ if test "$PHP_EXPECT" != "no"; then
|
||||
done
|
||||
|
||||
AC_MSG_CHECKING(for tcl version)
|
||||
for i in $PHP_TCLDIR/tclConfig.sh /usr/lib/tcl*/tclConfig.sh \
|
||||
for i in $PHP_TCLDIR/tclConfig.sh \
|
||||
/usr/lib/tcl*/tclConfig.sh \
|
||||
/usr/lib64/tcl*/tclConfig.sh \
|
||||
/usr/$PHP_LIBDIR/tcl*/tclConfig.sh \
|
||||
/usr/local/lib/tcl*/tclConfig.sh \
|
||||
/System/Library/Frameworks/Tcl.framework/Versions/Current/tclConfig.sh;
|
||||
|
||||
171
expect.c
171
expect.c
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
| PHP Version 5, 7 and 8 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2004 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
@@ -53,7 +53,7 @@ zend_module_entry expect_module_entry = {
|
||||
expect_functions,
|
||||
PHP_MINIT(expect),
|
||||
PHP_MSHUTDOWN(expect),
|
||||
NULL,
|
||||
PHP_RINIT(expect),
|
||||
NULL,
|
||||
PHP_MINFO(expect),
|
||||
PHP_EXPECT_VERSION,
|
||||
@@ -92,7 +92,11 @@ static PHP_GSHUTDOWN_FUNCTION(expect)
|
||||
static PHP_INI_MH(OnSetExpectTimeout)
|
||||
{
|
||||
if (new_value) {
|
||||
exp_timeout = atoi(new_value);
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
exp_timeout = atoi(ZSTR_VAL(new_value));
|
||||
#else
|
||||
exp_timeout = atoi(new_value);
|
||||
#endif
|
||||
return SUCCESS;
|
||||
}
|
||||
return FAILURE;
|
||||
@@ -104,7 +108,11 @@ static PHP_INI_MH(OnSetExpectTimeout)
|
||||
static PHP_INI_MH(OnSetExpectMatchMax)
|
||||
{
|
||||
if (new_value) {
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
exp_match_max = atoi(ZSTR_VAL(new_value));
|
||||
#else
|
||||
exp_match_max = atoi(new_value);
|
||||
#endif
|
||||
return SUCCESS;
|
||||
}
|
||||
return FAILURE;
|
||||
@@ -117,10 +125,17 @@ static PHP_INI_MH(OnSetExpectMatchMax)
|
||||
static PHP_INI_MH(OnSetExpectLogUser)
|
||||
{
|
||||
if (new_value) {
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
if (strncasecmp("on", ZSTR_VAL(new_value), sizeof("on")) == 0
|
||||
|| strncasecmp("true", ZSTR_VAL(new_value), sizeof("true")) == 0
|
||||
|| strncasecmp("yes", ZSTR_VAL(new_value), sizeof("yes")) == 0
|
||||
|| strncasecmp("1", ZSTR_VAL(new_value), sizeof("1")) == 0) {
|
||||
#else
|
||||
if (strncasecmp("on", new_value, sizeof("on")) == 0
|
||||
|| strncasecmp("true", new_value, sizeof("true")) == 0
|
||||
|| strncasecmp("yes", new_value, sizeof("yes")) == 0
|
||||
|| strncasecmp("1", new_value, sizeof("1")) == 0) {
|
||||
#endif
|
||||
exp_loguser = 1;
|
||||
} else {
|
||||
exp_loguser = 0;
|
||||
@@ -136,11 +151,26 @@ static PHP_INI_MH(OnSetExpectLogUser)
|
||||
* */
|
||||
static PHP_INI_MH(OnSetExpectLogFile)
|
||||
{
|
||||
/* PHP streams cannot be opened during module startup because the resource
|
||||
* list (EG(regular_list)) is not yet initialized. The logfile will be
|
||||
* opened in RINIT once the request context is available. */
|
||||
if (stage == PHP_INI_STAGE_STARTUP || stage == PHP_INI_STAGE_SHUTDOWN) {
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
if (EXPECT_G(logfile_stream)) {
|
||||
php_stream_close(EXPECT_G(logfile_stream));
|
||||
EXPECT_G(logfile_stream) = NULL;
|
||||
exp_logfile = NULL;
|
||||
exp_logfile_all = 0;
|
||||
}
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
if (ZSTR_LEN(new_value) > 0) {
|
||||
php_stream* stream = php_stream_open_wrapper (ZSTR_VAL(new_value), "a", 0, NULL);
|
||||
#else
|
||||
if (new_value_length > 0) {
|
||||
php_stream* stream = php_stream_open_wrapper (new_value, "a", 0, NULL);
|
||||
#endif
|
||||
if (!stream) {
|
||||
php_error_docref (NULL TSRMLS_CC, E_ERROR, "could not open log file for writing");
|
||||
return FAILURE;
|
||||
@@ -212,6 +242,28 @@ PHP_MSHUTDOWN_FUNCTION(expect)
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ PHP_RINIT_FUNCTION
|
||||
* Apply ini settings that require PHP streams, skipped during MINIT. */
|
||||
PHP_RINIT_FUNCTION(expect)
|
||||
{
|
||||
if (!EXPECT_G(logfile_stream)) {
|
||||
char *logfile = zend_ini_string("expect.logfile", sizeof("expect.logfile") - 1, 0);
|
||||
if (logfile && strlen(logfile) > 0) {
|
||||
php_stream *stream = php_stream_open_wrapper(logfile, "a", 0, NULL);
|
||||
if (stream) {
|
||||
stream->flags |= PHP_STREAM_FLAG_NO_SEEK;
|
||||
if (php_stream_cast(stream, PHP_STREAM_AS_STDIO, (void **) &exp_logfile, REPORT_ERRORS) == SUCCESS) {
|
||||
EXPECT_G(logfile_stream) = stream;
|
||||
exp_logfile_all = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ PHP_MINFO_FUNCTION */
|
||||
PHP_MINFO_FUNCTION(expect)
|
||||
{
|
||||
@@ -231,19 +283,35 @@ PHP_MINFO_FUNCTION(expect)
|
||||
*/
|
||||
PHP_FUNCTION(expect_popen)
|
||||
{
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
zend_string *command = NULL;
|
||||
#else
|
||||
char *command = NULL;
|
||||
#endif
|
||||
int command_len;
|
||||
FILE *fp;
|
||||
php_stream *stream = NULL;
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
zval z_pid;
|
||||
#else
|
||||
zval *z_pid;
|
||||
#endif
|
||||
|
||||
if (ZEND_NUM_ARGS() != 1) { WRONG_PARAM_COUNT; }
|
||||
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
if (zend_parse_parameters (ZEND_NUM_ARGS() TSRMLS_CC, "S", &command) == FAILURE) {
|
||||
#else
|
||||
if (zend_parse_parameters (ZEND_NUM_ARGS() TSRMLS_CC, "s", &command, &command_len) == FAILURE) {
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
if ((fp = exp_popen (ZSTR_VAL(command))) != NULL) {
|
||||
#else
|
||||
if ((fp = exp_popen (command)) != NULL) {
|
||||
#endif
|
||||
stream = php_stream_fopen_from_pipe (fp, "");
|
||||
}
|
||||
if (!stream) {
|
||||
@@ -251,9 +319,17 @@ PHP_FUNCTION(expect_popen)
|
||||
}
|
||||
|
||||
stream->flags |= PHP_STREAM_FLAG_NO_SEEK;
|
||||
/* PTY reads may return EIO when the child exits; suppress notices (PHP 7.4+ d59aac58b3e7). */
|
||||
#ifdef PHP_STREAM_FLAG_SUPPRESS_ERRORS
|
||||
stream->flags |= PHP_STREAM_FLAG_SUPPRESS_ERRORS;
|
||||
#endif
|
||||
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
ZVAL_LONG (&z_pid, exp_pid);
|
||||
#else
|
||||
MAKE_STD_ZVAL (z_pid);
|
||||
ZVAL_LONG (z_pid, exp_pid);
|
||||
#endif
|
||||
stream->wrapperdata = z_pid;
|
||||
|
||||
php_stream_to_zval(stream, return_value);
|
||||
@@ -267,20 +343,36 @@ PHP_FUNCTION(expect_popen)
|
||||
PHP_FUNCTION(expect_expectl)
|
||||
{
|
||||
struct exp_case *ecases, *ecases_ptr, matchedcase;
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
zval *z_stream, *z_cases, *z_match=NULL, *z_case, *z_value;
|
||||
zend_ulong key;
|
||||
#else
|
||||
zval *z_stream, *z_cases, *z_match=NULL, **z_case, **z_value;
|
||||
ulong key;
|
||||
#endif
|
||||
php_stream *stream;
|
||||
int fd, argc;
|
||||
ulong key;
|
||||
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
HashPosition pos;
|
||||
#endif
|
||||
|
||||
if (ZEND_NUM_ARGS() < 2 || ZEND_NUM_ARGS() > 3) { WRONG_PARAM_COUNT; }
|
||||
|
||||
if (zend_parse_parameters (ZEND_NUM_ARGS() TSRMLS_CC, "ra|z", &z_stream, &z_cases, &z_match) == FAILURE) {
|
||||
if (zend_parse_parameters (ZEND_NUM_ARGS() TSRMLS_CC, "ra|z/", &z_stream, &z_cases, &z_match) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
php_stream_from_zval (stream, z_stream);
|
||||
#else
|
||||
php_stream_from_zval (stream, &z_stream);
|
||||
#endif
|
||||
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
if (Z_TYPE(stream->wrapperdata) != IS_LONG) {
|
||||
#else
|
||||
if (!stream->wrapperdata) {
|
||||
#endif
|
||||
php_error_docref (NULL TSRMLS_CC, E_ERROR, "supplied argument is not a valid stream resource");
|
||||
return;
|
||||
}
|
||||
@@ -293,14 +385,24 @@ PHP_FUNCTION(expect_expectl)
|
||||
ecases = (struct exp_case*) safe_emalloc (argc + 1, sizeof(struct exp_case), 0);
|
||||
ecases_ptr = ecases;
|
||||
|
||||
zend_hash_internal_pointer_reset (Z_ARRVAL_P(z_cases));
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
zend_hash_internal_pointer_reset_ex (Z_ARRVAL_P(z_cases), &pos);
|
||||
|
||||
while ((z_case = zend_hash_get_current_data_ex (Z_ARRVAL_P(z_cases), &pos)) != NULL)
|
||||
{
|
||||
zval *z_pattern, *z_exp_type;
|
||||
zend_hash_get_current_key_ex(Z_ARRVAL_P(z_cases), NULL, &key, &pos);
|
||||
|
||||
if (Z_TYPE_P(z_case) != IS_ARRAY) {
|
||||
#else
|
||||
zend_hash_internal_pointer_reset (Z_ARRVAL_P(z_cases));
|
||||
while (zend_hash_get_current_data (Z_ARRVAL_P(z_cases), (void **)&z_case) == SUCCESS)
|
||||
{
|
||||
zval **z_pattern, **z_exp_type;
|
||||
zend_hash_get_current_key(Z_ARRVAL_P(z_cases), NULL, &key, 0);
|
||||
|
||||
if (Z_TYPE_PP(z_case) != IS_ARRAY) {
|
||||
#endif
|
||||
efree (ecases);
|
||||
php_error_docref (NULL TSRMLS_CC, E_ERROR, "expect case must be an array");
|
||||
return;
|
||||
@@ -310,20 +412,36 @@ PHP_FUNCTION(expect_expectl)
|
||||
ecases_ptr->type = exp_glob;
|
||||
|
||||
/* Gather pattern */
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
if ((z_pattern = zend_hash_index_find(Z_ARRVAL_P(z_case), 0)) == NULL) {
|
||||
#else
|
||||
if (zend_hash_index_find(Z_ARRVAL_PP(z_case), 0, (void **)&z_pattern) != SUCCESS) {
|
||||
#endif
|
||||
efree (ecases);
|
||||
php_error_docref (NULL TSRMLS_CC, E_ERROR, "missing parameter for pattern at index: 0");
|
||||
return;
|
||||
}
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
if (Z_TYPE_P(z_pattern) != IS_STRING) {
|
||||
#else
|
||||
if (Z_TYPE_PP(z_pattern) != IS_STRING) {
|
||||
#endif
|
||||
efree (ecases);
|
||||
php_error_docref (NULL TSRMLS_CC, E_ERROR, "pattern must be of string type");
|
||||
return;
|
||||
}
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
ecases_ptr->pattern = Z_STRVAL_P(z_pattern);
|
||||
#else
|
||||
ecases_ptr->pattern = Z_STRVAL_PP(z_pattern);
|
||||
#endif
|
||||
|
||||
/* Gather value */
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
if (zend_hash_index_find(Z_ARRVAL_P(z_case), 1) == NULL) {
|
||||
#else
|
||||
if (zend_hash_index_find(Z_ARRVAL_PP(z_case), 1, (void **)&z_value) != SUCCESS) {
|
||||
#endif
|
||||
efree (ecases);
|
||||
php_error_docref (NULL TSRMLS_CC, E_ERROR, "missing parameter for value at index: 1");
|
||||
return;
|
||||
@@ -331,22 +449,39 @@ PHP_FUNCTION(expect_expectl)
|
||||
ecases_ptr->value = key;
|
||||
|
||||
/* Gather expression type (optional, default: EXPECT_GLOB) */
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
if ((z_exp_type = zend_hash_index_find(Z_ARRVAL_P(z_case), 2)) != NULL) {
|
||||
if (Z_TYPE_P(z_exp_type) != IS_LONG) {
|
||||
#else
|
||||
if (zend_hash_index_find(Z_ARRVAL_PP(z_case), 2, (void **)&z_exp_type) == SUCCESS) {
|
||||
if (Z_TYPE_PP(z_exp_type) != IS_LONG) {
|
||||
#endif
|
||||
efree (ecases);
|
||||
php_error_docref (NULL TSRMLS_CC, E_ERROR, "expression type must be an integer constant");
|
||||
return;
|
||||
}
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
if (Z_LVAL_P(z_exp_type) != exp_glob && Z_LVAL_P(z_exp_type) != exp_exact && Z_LVAL_P(z_exp_type) != exp_regexp) {
|
||||
#else
|
||||
if (Z_LVAL_PP(z_exp_type) != exp_glob && Z_LVAL_PP(z_exp_type) != exp_exact && Z_LVAL_PP(z_exp_type) != exp_regexp) {
|
||||
#endif
|
||||
efree (ecases);
|
||||
php_error_docref (NULL TSRMLS_CC, E_ERROR, "expression type must be either EXPECT_GLOB, EXPECT_EXACT or EXPECT_REGEXP");
|
||||
return;
|
||||
}
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
ecases_ptr->type = Z_LVAL_P(z_exp_type);
|
||||
#else
|
||||
ecases_ptr->type = Z_LVAL_PP(z_exp_type);
|
||||
#endif
|
||||
}
|
||||
|
||||
ecases_ptr++;
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
zend_hash_move_forward_ex(Z_ARRVAL_P(z_cases), &pos);
|
||||
#else
|
||||
zend_hash_move_forward(Z_ARRVAL_P(z_cases));
|
||||
#endif
|
||||
}
|
||||
ecases_ptr->pattern = NULL;
|
||||
ecases_ptr->re = NULL;
|
||||
@@ -362,9 +497,21 @@ PHP_FUNCTION(expect_expectl)
|
||||
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);
|
||||
#if PHP_MAJOR_VERSION > 7 || (PHP_MAJOR_VERSION == 7 && PHP_MINOR_VERSION >= 4)
|
||||
z_match = zend_try_array_init(z_match);
|
||||
if (!z_match) {
|
||||
return;
|
||||
}
|
||||
add_index_string(z_match, 0, tmp);
|
||||
#elif PHP_MAJOR_VERSION >= 7
|
||||
zval_dtor(z_match);
|
||||
array_init(z_match);
|
||||
add_index_string(z_match, 0, tmp);
|
||||
#else
|
||||
zval_dtor (z_match);
|
||||
array_init(z_match);
|
||||
add_index_string(z_match, 0, tmp, 1);
|
||||
#endif
|
||||
/* Get case that was matched */
|
||||
matchedcase = ecases[key];
|
||||
/* If there are subpattern matches ... */
|
||||
@@ -377,7 +524,11 @@ PHP_FUNCTION(expect_expectl)
|
||||
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);
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
add_next_index_string(z_match, sub_match);
|
||||
#else
|
||||
add_next_index_string(z_match, sub_match, 1);
|
||||
#endif
|
||||
efree (sub_match);
|
||||
}
|
||||
}
|
||||
@@ -385,9 +536,15 @@ PHP_FUNCTION(expect_expectl)
|
||||
efree (tmp);
|
||||
}
|
||||
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
if ((z_case = zend_hash_index_find (Z_ARRVAL_P(z_cases), key)) != NULL) {
|
||||
if ((z_value = zend_hash_index_find(Z_ARRVAL_P(z_case), 1)) != NULL) {
|
||||
*return_value = *z_value;
|
||||
#else
|
||||
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;
|
||||
#endif
|
||||
zval_copy_ctor (return_value);
|
||||
case_found = 1;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
| PHP Version 5 and 7 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2004 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
@@ -23,19 +23,41 @@
|
||||
#include "php_streams.h"
|
||||
#include <sys/wait.h>
|
||||
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
php_stream *php_expect_stream_open (php_stream_wrapper *wrapper, const char *command, const char *mode, int options,
|
||||
zend_string **opened_command, php_stream_context *context STREAMS_DC TSRMLS_DC)
|
||||
#elif PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 6
|
||||
php_stream *php_expect_stream_open (php_stream_wrapper *wrapper, const char *command, const char *mode, int options,
|
||||
char **opened_command, php_stream_context *context STREAMS_DC TSRMLS_DC)
|
||||
#else
|
||||
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)
|
||||
#endif
|
||||
{
|
||||
FILE *fp;
|
||||
if (strncasecmp("expect://", command, sizeof("expect://")-1) == 0) {
|
||||
command += sizeof("expect://")-1;
|
||||
}
|
||||
|
||||
#if PHP_MAJOR_VERSION >= 7 || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 6)
|
||||
if ((fp = exp_popen((char*)command)) != NULL) {
|
||||
#else
|
||||
if ((fp = exp_popen(command)) != NULL) {
|
||||
#endif
|
||||
php_stream* stream = php_stream_fopen_from_pipe (fp, mode);
|
||||
stream->flags |= PHP_STREAM_FLAG_NO_SEEK;
|
||||
/* PTY reads may return EIO when the child exits; suppress notices (PHP 7.4+ d59aac58b3e7). */
|
||||
#ifdef PHP_STREAM_FLAG_SUPPRESS_ERRORS
|
||||
stream->flags |= PHP_STREAM_FLAG_SUPPRESS_ERRORS;
|
||||
#endif
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
zval z_pid;
|
||||
ZVAL_LONG (&z_pid, exp_pid);
|
||||
#else
|
||||
zval *z_pid;
|
||||
MAKE_STD_ZVAL (z_pid);
|
||||
ZVAL_LONG (z_pid, exp_pid);
|
||||
#endif
|
||||
stream->wrapperdata = z_pid;
|
||||
return stream;
|
||||
}
|
||||
@@ -45,11 +67,20 @@ php_stream *php_expect_stream_open (php_stream_wrapper *wrapper, char *command,
|
||||
|
||||
static int php_expect_stream_close (php_stream_wrapper *wrapper, php_stream *stream TSRMLS_DC)
|
||||
{
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
zval* z_pid = &(stream->wrapperdata);
|
||||
#else
|
||||
zval* z_pid = stream->wrapperdata;
|
||||
#endif
|
||||
int s = 0;
|
||||
waitpid (Z_LVAL_P(z_pid), &s, 0);
|
||||
#if PHP_MAJOR_VERSION >= 7
|
||||
zval_ptr_dtor (z_pid);
|
||||
php_stream_free(stream, PHP_STREAM_FREE_CLOSE);
|
||||
#else
|
||||
zval_ptr_dtor (&z_pid);
|
||||
stream->wrapperdata = NULL;
|
||||
#endif
|
||||
return s;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
10
package.xml
10
package.xml
@@ -14,11 +14,11 @@ http://pear.php.net/dtd/package-2.0.xsd">
|
||||
<email>michael@php.net</email>
|
||||
<active>yes</active>
|
||||
</lead>
|
||||
<date>2015-09-11</date>
|
||||
<time>15:25:00</time>
|
||||
<date>2020-01-13</date>
|
||||
<time>18:00:00</time>
|
||||
<version>
|
||||
<release>0.3.3</release>
|
||||
<api>0.3.3</api>
|
||||
<release>0.4.0</release>
|
||||
<api>0.4.0</api>
|
||||
</version>
|
||||
<stability>
|
||||
<release>stable</release>
|
||||
@@ -51,7 +51,7 @@ http://pear.php.net/dtd/package-2.0.xsd">
|
||||
<required>
|
||||
<php>
|
||||
<min>4.0.0</min>
|
||||
<max>5.99.99</max>
|
||||
<max>8.99.99</max>
|
||||
</php>
|
||||
<pearinstaller>
|
||||
<min>1.4.0b1</min>
|
||||
|
||||
17
php_expect.h
17
php_expect.h
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
| PHP Version 5, 7 and 8 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2004 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
@@ -37,7 +37,7 @@
|
||||
extern zend_module_entry expect_module_entry;
|
||||
#define phpext_expect_ptr &expect_module_entry
|
||||
|
||||
#define PHP_EXPECT_VERSION "0.3.3"
|
||||
#define PHP_EXPECT_VERSION "0.4.1"
|
||||
|
||||
#ifdef PHP_WIN32
|
||||
#define PHP_EXPECT_API __declspec(dllexport)
|
||||
@@ -47,6 +47,7 @@ extern zend_module_entry expect_module_entry;
|
||||
|
||||
PHP_MINIT_FUNCTION(expect);
|
||||
PHP_MSHUTDOWN_FUNCTION(expect);
|
||||
PHP_RINIT_FUNCTION(expect);
|
||||
PHP_MINFO_FUNCTION(expect);
|
||||
|
||||
PHP_FUNCTION(expect_popen);
|
||||
@@ -68,6 +69,18 @@ ZEND_END_MODULE_GLOBALS(expect)
|
||||
#include "TSRM.h"
|
||||
#endif /* ZTS */
|
||||
|
||||
|
||||
#if ZEND_MODULE_API_NO >= 20190128
|
||||
#ifndef TSRMLS_CC
|
||||
#define TSRMLS_CC
|
||||
#endif
|
||||
#ifndef TSRMLS_DC
|
||||
#define TSRMLS_DC
|
||||
#endif
|
||||
#ifndef TSRMLS_FETCH
|
||||
#define TSRMLS_FETCH()
|
||||
#endif
|
||||
#endif
|
||||
#endif /* PHP_EXPECT_H */
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user