summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--073067ba96ac99ed5696d27f13ca6c8124986e74.patch743
-rw-r--r--PHPINFO7
-rw-r--r--REFLECTION2
-rw-r--r--a8835aab2c15e794fce13bd927295719e384ad2d.patch299
-rw-r--r--php-pecl-ssh2.spec17
5 files changed, 1063 insertions, 5 deletions
diff --git a/073067ba96ac99ed5696d27f13ca6c8124986e74.patch b/073067ba96ac99ed5696d27f13ca6c8124986e74.patch
new file mode 100644
index 0000000..d266edb
--- /dev/null
+++ b/073067ba96ac99ed5696d27f13ca6c8124986e74.patch
@@ -0,0 +1,743 @@
+From 073067ba96ac99ed5696d27f13ca6c8124986e74 Mon Sep 17 00:00:00 2001
+From: Jan-E <github@ehrhardt.nl>
+Date: Thu, 28 Jun 2018 08:43:48 +0200
+Subject: [PATCH] @dstogov Fixed PHP7 port. Restored commented reference
+ counting.
+
+---
+ php_ssh2.h | 14 +++---
+ ssh2.c | 26 +++++-----
+ ssh2_fopen_wrappers.c | 129 ++++++++++++++++++++++----------------------------
+ ssh2_sftp.c | 59 ++++++++++-------------
+ 4 files changed, 102 insertions(+), 126 deletions(-)
+
+diff --git a/php_ssh2.h b/php_ssh2.h
+index d010ff9..2bbaa26 100644
+--- a/php_ssh2.h
++++ b/php_ssh2.h
+@@ -73,14 +73,14 @@ typedef struct _php_ssh2_sftp_data {
+ LIBSSH2_SESSION *session;
+ LIBSSH2_SFTP *sftp;
+
+- int session_rsrcid;
++ zend_resource *session_rsrc;
+ } php_ssh2_sftp_data;
+
+ typedef struct _php_ssh2_listener_data {
+ LIBSSH2_SESSION *session;
+ LIBSSH2_LISTENER *listener;
+
+- int session_rsrcid;
++ zend_resource *session_rsrc;
+ } php_ssh2_listener_data;
+
+ #include "libssh2_publickey.h"
+@@ -89,7 +89,7 @@ typedef struct _php_ssh2_pkey_subsys_data {
+ LIBSSH2_SESSION *session;
+ LIBSSH2_PUBLICKEY *pkey;
+
+- int session_rsrcid;
++ zend_resource *session_rsrc;
+ } php_ssh2_pkey_subsys_data;
+
+ #define SSH2_FETCH_NONAUTHENTICATED_SESSION(session, zsession) \
+@@ -118,8 +118,8 @@ typedef struct _php_ssh2_channel_data {
+ char is_blocking;
+ long timeout;
+
+- /* Resource ID */
+- int session_rsrcid;
++ /* Resource */
++ zend_resource *session_rsrc;
+
+ /* Allow one stream to be closed while the other is kept open */
+ unsigned char *refcount;
+@@ -151,8 +151,8 @@ PHP_FUNCTION(ssh2_sftp_realpath);
+ LIBSSH2_SESSION *php_ssh2_session_connect(char *host, int port, zval *methods, zval *callbacks);
+ void php_ssh2_sftp_dtor(zend_resource *rsrc);
+ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stream_context *context,
+- LIBSSH2_SESSION **psession, int *presource_id,
+- LIBSSH2_SFTP **psftp, int *psftp_rsrcid);
++ LIBSSH2_SESSION **psession, zend_resource **presource,
++ LIBSSH2_SFTP **psftp, zend_resource **psftp_rsrc);
+
+ extern php_stream_ops php_ssh2_channel_stream_ops;
+
+diff --git a/ssh2.c b/ssh2.c
+index e73867e..849766b 100644
+--- a/ssh2.c
++++ b/ssh2.c
+@@ -772,9 +772,8 @@ PHP_FUNCTION(ssh2_forward_listen)
+
+ data = emalloc(sizeof(php_ssh2_listener_data));
+ data->session = session;
+- data->session_rsrcid = Z_LVAL_P(zsession);
+- //TODO Sean-Der
+- //zend_list_addref(data->session_rsrcid);
++ data->session_rsrc = Z_RES_P(zsession);
++ Z_ADDREF_P(zsession);
+ data->listener = listener;
+
+ RETURN_RES(zend_register_resource(data, le_ssh2_listener));
+@@ -810,7 +809,7 @@ PHP_FUNCTION(ssh2_forward_accept)
+ channel_data->channel = channel;
+ channel_data->streamid = 0;
+ channel_data->is_blocking = 0;
+- channel_data->session_rsrcid = data->session_rsrcid;
++ channel_data->session_rsrc = data->session_rsrc;
+ channel_data->refcount = NULL;
+
+ stream = php_stream_alloc(&php_ssh2_channel_stream_ops, channel_data, 0, "r+");
+@@ -820,8 +819,12 @@ PHP_FUNCTION(ssh2_forward_accept)
+ libssh2_channel_free(channel);
+ RETURN_FALSE;
+ }
+- //TODO Sean-Der
+- //zend_list_addref(channel_data->session_rsrcid);
++
++#if PHP_VERSION_ID < 70300
++ GC_REFCOUNT(channel_data->session_rsrc)++;
++#else
++ GC_ADDREF(channel_data->session_rsrc);
++#endif
+
+ php_stream_to_zval(stream, return_value);
+ }
+@@ -975,9 +978,8 @@ PHP_FUNCTION(ssh2_publickey_init)
+
+ data = emalloc(sizeof(php_ssh2_pkey_subsys_data));
+ data->session = session;
+- data->session_rsrcid = Z_RES_P(zsession)->handle;
+- //TODO Sean-Der
+- //zend_list_addref(data->session_rsrcid);
++ data->session_rsrc = Z_RES_P(zsession);
++ Z_ADDREF_P(zsession);
+ data->pkey = pkey;
+
+ RETURN_RES(zend_register_resource(data, le_ssh2_pkey_subsys));
+@@ -1280,8 +1282,7 @@ static void php_ssh2_listener_dtor(zend_resource *rsrc)
+ LIBSSH2_LISTENER *listener = data->listener;
+
+ libssh2_channel_forward_cancel(listener);
+- // TODO Sean-Der
+- //zend_list_delete(data->session_rsrcid);
++ zend_list_delete(data->session_rsrc);
+ efree(data);
+ }
+
+@@ -1291,8 +1292,7 @@ static void php_ssh2_pkey_subsys_dtor(zend_resource *rsrc)
+ LIBSSH2_PUBLICKEY *pkey = data->pkey;
+
+ libssh2_publickey_shutdown(pkey);
+- // TODO Sean-Der
+- //zend_list_delete(data->session_rsrcid);
++ zend_list_delete(data->session_rsrc);
+ efree(data);
+ }
+
+diff --git a/ssh2_fopen_wrappers.c b/ssh2_fopen_wrappers.c
+index f2f3475..c4eb9dc 100644
+--- a/ssh2_fopen_wrappers.c
++++ b/ssh2_fopen_wrappers.c
+@@ -47,11 +47,9 @@ static size_t php_ssh2_channel_stream_write(php_stream *stream, const char *buf,
+ php_ssh2_channel_data *abstract = (php_ssh2_channel_data*)stream->abstract;
+ size_t writestate;
+ LIBSSH2_SESSION *session;
+- zval *zresource;
+
+ libssh2_channel_set_blocking(abstract->channel, abstract->is_blocking);
+- zresource = php_ssh2_zval_from_resource_handle(abstract->session_rsrcid);
+- session = (LIBSSH2_SESSION *)zend_fetch_resource(Z_RES_P(zresource), PHP_SSH2_SESSION_RES_NAME, le_ssh2_session);
++ session = (LIBSSH2_SESSION *)zend_fetch_resource(abstract->session_rsrc, PHP_SSH2_SESSION_RES_NAME, le_ssh2_session);
+
+
+
+@@ -90,12 +88,10 @@ static size_t php_ssh2_channel_stream_read(php_stream *stream, char *buf, size_t
+ php_ssh2_channel_data *abstract = (php_ssh2_channel_data*)stream->abstract;
+ ssize_t readstate;
+ LIBSSH2_SESSION *session;
+- zval *zresource;
+
+ stream->eof = libssh2_channel_eof(abstract->channel);
+ libssh2_channel_set_blocking(abstract->channel, abstract->is_blocking);
+- zresource = php_ssh2_zval_from_resource_handle(abstract->session_rsrcid);
+- session = (LIBSSH2_SESSION *)zend_fetch_resource(Z_RES_P(zresource), PHP_SSH2_SESSION_RES_NAME, le_ssh2_session);
++ session = (LIBSSH2_SESSION *)zend_fetch_resource(abstract->session_rsrc, PHP_SSH2_SESSION_RES_NAME, le_ssh2_session);
+
+ #ifdef PHP_SSH2_SESSION_TIMEOUT
+ if (abstract->is_blocking) {
+@@ -137,8 +133,7 @@ static int php_ssh2_channel_stream_close(php_stream *stream, int close_handle)
+ }
+ libssh2_channel_eof(abstract->channel);
+ libssh2_channel_free(abstract->channel);
+- //TODO Sean-Der
+- //zend_list_delete(abstract->session_rsrcid);
++ zend_list_delete(abstract->session_rsrc);
+ }
+ efree(abstract);
+
+@@ -207,8 +202,8 @@ php_stream_ops php_ssh2_channel_stream_ops = {
+ * Parse an ssh2.*:// path
+ */
+ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stream_context *context,
+- LIBSSH2_SESSION **psession, int *presource_id,
+- LIBSSH2_SFTP **psftp, int *psftp_rsrcid)
++ LIBSSH2_SESSION **psession, zend_resource **presource,
++ LIBSSH2_SFTP **psftp, zend_resource **psftp_rsrc)
+ {
+ php_ssh2_sftp_data *sftp_data = NULL;
+ LIBSSH2_SESSION *session;
+@@ -283,11 +278,10 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre
+ sftp_data = (php_ssh2_sftp_data *)zend_fetch_resource(Z_RES_P(zresource), PHP_SSH2_SFTP_RES_NAME, le_ssh2_sftp);
+ if (sftp_data) {
+ /* Want the sftp layer */
+- //TODO Sean-Der
+- //zend_list_addref(resource_id);
+- *psftp_rsrcid = resource_id;
++ Z_ADDREF_P(zresource);
++ *psftp_rsrc = Z_RES_P(zresource);
+ *psftp = sftp_data->sftp;
+- *presource_id = sftp_data->session_rsrcid;
++ *presource = sftp_data->session_rsrc;
+ *psession = sftp_data->session;
+ return resource;
+ }
+@@ -305,18 +299,16 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre
+ sftp_data = emalloc(sizeof(php_ssh2_sftp_data));
+ sftp_data->sftp = sftp;
+ sftp_data->session = session;
+- sftp_data->session_rsrcid = resource_id;
+- //TODO Sean-Der
+- //zend_list_addref(resource_id);
+- *psftp_rsrcid = zend_register_resource(sftp_data, le_ssh2_sftp)->handle;
++ sftp_data->session_rsrc = Z_RES_P(zresource);
++ Z_ADDREF_P(zresource);
++ *psftp_rsrc = zend_register_resource(sftp_data, le_ssh2_sftp);
+ *psftp = sftp;
+- *presource_id = resource_id;
++ *presource = Z_RES_P(zresource);
+ *psession = session;
+ return resource;
+ }
+- //TODO Sean-Der
+- //zend_list_addref(resource_id);
+- *presource_id = resource_id;
++ Z_ADDREF_P(zresource);
++ *presource = Z_RES_P(zresource);
+ *psession = session;
+ return resource;
+ }
+@@ -330,9 +322,9 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre
+ sftp_data = (php_ssh2_sftp_data *)zend_fetch_resource(Z_RES_P(tmpzval), PHP_SSH2_SFTP_RES_NAME, le_ssh2_sftp);
+ if (sftp_data) {
+ Z_ADDREF_P(tmpzval);
+- *psftp_rsrcid = Z_LVAL_P(tmpzval);
++ *psftp_rsrc = Z_RES_P(tmpzval);
+ *psftp = sftp_data->sftp;
+- *presource_id = sftp_data->session_rsrcid;
++ *presource = sftp_data->session_rsrc;
+ *psession = sftp_data->session;
+ return resource;
+ }
+@@ -354,17 +346,17 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre
+ sftp_data = emalloc(sizeof(php_ssh2_sftp_data));
+ sftp_data->sftp = sftp;
+ sftp_data->session = session;
+- sftp_data->session_rsrcid = Z_LVAL_P(tmpzval);
++ sftp_data->session_rsrc = Z_RES_P(tmpzval);
+ Z_ADDREF_P(tmpzval);
+- *psftp_rsrcid = zend_register_resource(sftp_data, le_ssh2_sftp)->handle;
++ *psftp_rsrc = zend_register_resource(sftp_data, le_ssh2_sftp);
+ *psftp = sftp;
+- *presource_id = Z_RES_P(tmpzval)->handle;
++ *presource = Z_RES_P(tmpzval);
+ *psession = session;
+ return resource;
+ }
+ Z_ADDREF_P(tmpzval);
+ *psession = session;
+- *presource_id = Z_LVAL_P(tmpzval);
++ *presource = Z_RES_P(tmpzval);
+ return resource;
+ }
+ }
+@@ -465,8 +457,7 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre
+
+ /* Auth failure */
+ php_url_free(resource);
+- //TODO Sean-Der
+- //zend_list_delete(Z_LVAL(zsession));
++ zend_list_delete(Z_RES(zsession));
+ return NULL;
+
+ session_authed:
+@@ -480,24 +471,22 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre
+ sftp = libssh2_sftp_init(session);
+ if (!sftp) {
+ php_url_free(resource);
+- //TODO Sean-Der
+- //zend_list_delete(Z_LVAL(zsession));
++ zend_list_delete(Z_RES(zsession));
+ return NULL;
+ }
+
+ sftp_data = emalloc(sizeof(php_ssh2_sftp_data));
+ sftp_data->session = session;
+ sftp_data->sftp = sftp;
+- sftp_data->session_rsrcid = Z_LVAL(zsession);
++ sftp_data->session_rsrc = Z_RES(zsession);
+
+ //TODO Sean-Der
+ //ZEND_REGISTER_RESOURCE(sftp_data, le_ssh2_sftp);
+- *psftp_rsrcid = Z_LVAL(zsftp);
++ *psftp_rsrc = Z_RES(zsftp);
+ *psftp = sftp;
+ }
+
+- //TODO may be undefined
+- *presource_id = Z_LVAL(zsession);
++ *presource = Z_RES(zsession);
+ *psession = session;
+
+ return resource;
+@@ -511,7 +500,7 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre
+ /* {{{ php_ssh2_shell_open
+ * Make a stream from a session
+ */
+-static php_stream *php_ssh2_shell_open(LIBSSH2_SESSION *session, int resource_id, char *term, int term_len, zval *environment, long width, long height, long type)
++static php_stream *php_ssh2_shell_open(LIBSSH2_SESSION *session, zend_resource *resource, char *term, int term_len, zval *environment, long width, long height, long type)
+ {
+ LIBSSH2_CHANNEL *channel;
+ php_ssh2_channel_data *channel_data;
+@@ -578,7 +567,7 @@ static php_stream *php_ssh2_shell_open(LIBSSH2_SESSION *session, int resource_id
+ channel_data->streamid = 0;
+ channel_data->is_blocking = 0;
+ channel_data->timeout = 0;
+- channel_data->session_rsrcid = resource_id;
++ channel_data->session_rsrc = resource;
+ channel_data->refcount = NULL;
+
+ stream = php_stream_alloc(&php_ssh2_channel_stream_ops, channel_data, 0, "r+");
+@@ -599,11 +588,12 @@ static php_stream *php_ssh2_fopen_wrapper_shell(php_stream_wrapper *wrapper, con
+ zend_long width = PHP_SSH2_DEFAULT_TERM_WIDTH;
+ zend_long height = PHP_SSH2_DEFAULT_TERM_HEIGHT;
+ zend_long type = PHP_SSH2_DEFAULT_TERM_UNIT;
+- int resource_id = 0, terminal_len = sizeof(PHP_SSH2_DEFAULT_TERMINAL) - 1;
++ zend_resource *rsrc = NULL;
++ int terminal_len = sizeof(PHP_SSH2_DEFAULT_TERMINAL) - 1;
+ php_url *resource;
+ char *s;
+
+- resource = php_ssh2_fopen_wraper_parse_path(path, "shell", context, &session, &resource_id, NULL, NULL);
++ resource = php_ssh2_fopen_wraper_parse_path(path, "shell", context, &session, &rsrc, NULL, NULL);
+ if (!resource || !session) {
+ return NULL;
+ }
+@@ -677,10 +667,9 @@ static php_stream *php_ssh2_fopen_wrapper_shell(php_stream_wrapper *wrapper, con
+ /* TODO: Accept resolution and environment vars as URL style parameters
+ * ssh2.shell://hostorresource/terminal/99x99c?envvar=envval&envvar=envval....
+ */
+- stream = php_ssh2_shell_open(session, resource_id, terminal, terminal_len, environment, width, height, type);
++ stream = php_ssh2_shell_open(session, rsrc, terminal, terminal_len, environment, width, height, type);
+ if (!stream) {
+- //TODO Sean-Der
+- //zend_list_delete(resource_id);
++ zend_list_delete(rsrc);
+ }
+ php_url_free(resource);
+
+@@ -730,7 +719,7 @@ PHP_FUNCTION(ssh2_shell)
+
+ SSH2_FETCH_AUTHENTICATED_SESSION(session, zsession);
+
+- stream = php_ssh2_shell_open(session, Z_RES_P(zsession)->handle, term, term_len, environment, width, height, type);
++ stream = php_ssh2_shell_open(session, Z_RES_P(zsession), term, term_len, environment, width, height, type);
+ if (!stream) {
+ RETURN_FALSE;
+ }
+@@ -749,7 +738,7 @@ PHP_FUNCTION(ssh2_shell)
+ /* {{{ php_ssh2_exec_command
+ * Make a stream from a session
+ */
+-static php_stream *php_ssh2_exec_command(LIBSSH2_SESSION *session, int resource_id, char *command, char *term, int term_len, zval *environment, long width, long height, long type)
++static php_stream *php_ssh2_exec_command(LIBSSH2_SESSION *session, zend_resource *rsrc, char *command, char *term, int term_len, zval *environment, long width, long height, long type)
+ {
+ LIBSSH2_CHANNEL *channel;
+ php_ssh2_channel_data *channel_data;
+@@ -819,7 +808,7 @@ static php_stream *php_ssh2_exec_command(LIBSSH2_SESSION *session, int resource_
+ channel_data->streamid = 0;
+ channel_data->is_blocking = 0;
+ channel_data->timeout = 0;
+- channel_data->session_rsrcid = resource_id;
++ channel_data->session_rsrc = rsrc;
+ channel_data->refcount = NULL;
+
+ stream = php_stream_alloc(&php_ssh2_channel_stream_ops, channel_data, 0, "r+");
+@@ -836,7 +825,7 @@ static php_stream *php_ssh2_fopen_wrapper_exec(php_stream_wrapper *wrapper, cons
+ LIBSSH2_SESSION *session = NULL;
+ php_stream *stream;
+ zval *tmpzval, *environment = NULL;
+- int resource_id = 0;
++ zend_resource *rsrc = NULL;
+ php_url *resource;
+ char *terminal = NULL;
+ int terminal_len = 0;
+@@ -844,14 +833,13 @@ static php_stream *php_ssh2_fopen_wrapper_exec(php_stream_wrapper *wrapper, cons
+ long height = PHP_SSH2_DEFAULT_TERM_HEIGHT;
+ long type = PHP_SSH2_DEFAULT_TERM_UNIT;
+
+- resource = php_ssh2_fopen_wraper_parse_path(path, "exec", context, &session, &resource_id, NULL, NULL);
++ resource = php_ssh2_fopen_wraper_parse_path(path, "exec", context, &session, &rsrc, NULL, NULL);
+ if (!resource || !session) {
+ return NULL;
+ }
+ if (!resource->path) {
+ php_url_free(resource);
+- //TODO Sean-Der
+- //zend_list_delete(resource_id);
++ zend_list_delete(rsrc);
+ return NULL;
+ }
+
+@@ -893,10 +881,9 @@ static php_stream *php_ssh2_fopen_wrapper_exec(php_stream_wrapper *wrapper, cons
+ zval_ptr_dtor(copyval);
+ }
+
+- stream = php_ssh2_exec_command(session, resource_id, SSH2_URL_STR(resource->path) + 1, terminal, terminal_len, environment, width, height, type);
++ stream = php_ssh2_exec_command(session, rsrc, SSH2_URL_STR(resource->path) + 1, terminal, terminal_len, environment, width, height, type);
+ if (!stream) {
+- // TODO Sean-Der
+- //zend_list_delete(resource_id);
++ zend_list_delete(rsrc);
+ }
+ php_url_free(resource);
+
+@@ -963,7 +950,7 @@ PHP_FUNCTION(ssh2_exec)
+
+ SSH2_FETCH_AUTHENTICATED_SESSION(session, zsession);
+
+- stream = php_ssh2_exec_command(session, Z_RES_P(zsession)->handle, command, term, term_len, environment, width, height, type);
++ stream = php_ssh2_exec_command(session, Z_RES_P(zsession), command, term, term_len, environment, width, height, type);
+ if (!stream) {
+ RETURN_FALSE;
+ }
+@@ -982,7 +969,7 @@ PHP_FUNCTION(ssh2_exec)
+ /* {{{ php_ssh2_scp_xfer
+ * Make a stream from a session
+ */
+-static php_stream *php_ssh2_scp_xfer(LIBSSH2_SESSION *session, int resource_id, char *filename)
++static php_stream *php_ssh2_scp_xfer(LIBSSH2_SESSION *session, zend_resource *rsrc, char *filename)
+ {
+ LIBSSH2_CHANNEL *channel;
+ php_ssh2_channel_data *channel_data;
+@@ -1002,7 +989,7 @@ static php_stream *php_ssh2_scp_xfer(LIBSSH2_SESSION *session, int resource_id,
+ channel_data->streamid = 0;
+ channel_data->is_blocking = 0;
+ channel_data->timeout = 0;
+- channel_data->session_rsrcid = resource_id;
++ channel_data->session_rsrc = rsrc;
+ channel_data->refcount = NULL;
+
+ stream = php_stream_alloc(&php_ssh2_channel_stream_ops, channel_data, 0, "r");
+@@ -1018,28 +1005,26 @@ static php_stream *php_ssh2_fopen_wrapper_scp(php_stream_wrapper *wrapper, const
+ {
+ LIBSSH2_SESSION *session = NULL;
+ php_stream *stream;
+- int resource_id = 0;
++ zend_resource *rsrc = NULL;
+ php_url *resource;
+
+ if (strchr(mode, '+') || strchr(mode, 'a') || strchr(mode, 'w')) {
+ return NULL;
+ }
+
+- resource = php_ssh2_fopen_wraper_parse_path(path, "scp", context, &session, &resource_id, NULL, NULL);
++ resource = php_ssh2_fopen_wraper_parse_path(path, "scp", context, &session, &rsrc, NULL, NULL);
+ if (!resource || !session) {
+ return NULL;
+ }
+ if (!resource->path) {
+ php_url_free(resource);
+- //TODO Sean-Der
+- //zend_list_delete(resource_id);
++ zend_list_delete(rsrc);
+ return NULL;
+ }
+
+- stream = php_ssh2_scp_xfer(session, resource_id, SSH2_URL_STR(resource->path));
++ stream = php_ssh2_scp_xfer(session, rsrc, SSH2_URL_STR(resource->path));
+ if (!stream) {
+- //TODO Sean-Der
+- //zend_list_delete(resource_id);
++ zend_list_delete(rsrc);
+ }
+ php_url_free(resource);
+
+@@ -1231,7 +1216,7 @@ PHP_FUNCTION(ssh2_scp_send)
+ /* {{{ php_ssh2_direct_tcpip
+ * Make a stream from a session
+ */
+-static php_stream *php_ssh2_direct_tcpip(LIBSSH2_SESSION *session, int resource_id, char *host, int port)
++static php_stream *php_ssh2_direct_tcpip(LIBSSH2_SESSION *session, zend_resource *rsrc, char *host, int port)
+ {
+ LIBSSH2_CHANNEL *channel;
+ php_ssh2_channel_data *channel_data;
+@@ -1251,7 +1236,7 @@ static php_stream *php_ssh2_direct_tcpip(LIBSSH2_SESSION *session, int resource_
+ channel_data->streamid = 0;
+ channel_data->is_blocking = 0;
+ channel_data->timeout = 0;
+- channel_data->session_rsrcid = resource_id;
++ channel_data->session_rsrc = rsrc;
+ channel_data->refcount = NULL;
+
+ stream = php_stream_alloc(&php_ssh2_channel_stream_ops, channel_data, 0, "r+");
+@@ -1270,9 +1255,9 @@ static php_stream *php_ssh2_fopen_wrapper_tunnel(php_stream_wrapper *wrapper, co
+ php_url *resource;
+ char *host = NULL;
+ int port = 0;
+- int resource_id = 0;
++ zend_resource *rsrc;
+
+- resource = php_ssh2_fopen_wraper_parse_path(path, "tunnel", context, &session, &resource_id, NULL, NULL);
++ resource = php_ssh2_fopen_wraper_parse_path(path, "tunnel", context, &session, &rsrc, NULL, NULL);
+ if (!resource || !session) {
+ return NULL;
+ }
+@@ -1303,15 +1288,13 @@ static php_stream *php_ssh2_fopen_wrapper_tunnel(php_stream_wrapper *wrapper, co
+ if ((port <= 0) || (port > 65535) || !host || (strlen(host) == 0)) {
+ /* Invalid connection criteria */
+ php_url_free(resource);
+- //TODO Sean-Der
+- //zend_list_delete(resource_id);
++ zend_list_delete(rsrc);
+ return NULL;
+ }
+
+- stream = php_ssh2_direct_tcpip(session, resource_id, host, port);
++ stream = php_ssh2_direct_tcpip(session, rsrc, host, port);
+ if (!stream) {
+- // TODO Sean-Der
+- //zend_list_delete(resource_id);
++ zend_list_delete(rsrc);
+ }
+ php_url_free(resource);
+
+@@ -1352,7 +1335,7 @@ PHP_FUNCTION(ssh2_tunnel)
+
+ SSH2_FETCH_AUTHENTICATED_SESSION(session, zsession);
+
+- stream = php_ssh2_direct_tcpip(session, Z_RES_P(zsession)->handle, host, port);
++ stream = php_ssh2_direct_tcpip(session, Z_RES_P(zsession), host, port);
+ if (!stream) {
+ RETURN_FALSE;
+ }
+diff --git a/ssh2_sftp.c b/ssh2_sftp.c
+index 6332be8..256fc70 100644
+--- a/ssh2_sftp.c
++++ b/ssh2_sftp.c
+@@ -40,8 +40,7 @@ void php_ssh2_sftp_dtor(zend_resource *rsrc)
+
+ libssh2_sftp_shutdown(data->sftp);
+
+- // TODO Sean-Der
+- //zend_list_delete(data->session_rsrcid);
++ zend_list_delete(data->session_rsrc);
+
+ efree(data);
+ }
+@@ -50,7 +49,7 @@ void php_ssh2_sftp_dtor(zend_resource *rsrc)
+ * SFTP File Ops *
+ ***************** */
+
+-inline unsigned long php_ssh2_parse_fopen_modes(char *openmode) {
++unsigned long php_ssh2_parse_fopen_modes(char *openmode) {
+ unsigned long flags = 0;
+
+ if (strchr(openmode, 'a')) {
+@@ -101,7 +100,7 @@ inline int php_ssh2_sftp_attr2ssb(php_stream_statbuf *ssb, LIBSSH2_SFTP_ATTRIBUT
+ typedef struct _php_ssh2_sftp_handle_data {
+ LIBSSH2_SFTP_HANDLE *handle;
+
+- long sftp_rsrcid;
++ zend_resource *sftp_rsrc;
+ } php_ssh2_sftp_handle_data;
+
+ /* {{{ php_ssh2_sftp_stream_write
+@@ -139,8 +138,7 @@ static int php_ssh2_sftp_stream_close(php_stream *stream, int close_handle)
+ php_ssh2_sftp_handle_data *data = (php_ssh2_sftp_handle_data*)stream->abstract;
+
+ libssh2_sftp_close(data->handle);
+- //TODO Sean-Der
+- //zend_list_delete(data->sftp_rsrcid);
++ zend_list_delete(data->sftp_rsrc);
+ efree(data);
+
+ return 0;
+@@ -226,12 +224,12 @@ static php_stream *php_ssh2_sftp_stream_opener(php_stream_wrapper *wrapper, cons
+ LIBSSH2_SFTP *sftp = NULL;
+ LIBSSH2_SFTP_HANDLE *handle;
+ php_stream *stream;
+- int resource_id = 0, sftp_rsrcid = 0;
++ zend_resource *rsrc = NULL, *sftp_rsrc = NULL;
+ php_url *resource;
+ unsigned long flags;
+ long perms = 0644;
+
+- resource = php_ssh2_fopen_wraper_parse_path(filename, "sftp", context, &session, &resource_id, &sftp, &sftp_rsrcid);
++ resource = php_ssh2_fopen_wraper_parse_path(filename, "sftp", context, &session, &rsrc, &sftp, &sftp_rsrc);
+ if (!resource || !session || !sftp) {
+ return NULL;
+ }
+@@ -242,20 +240,18 @@ static php_stream *php_ssh2_sftp_stream_opener(php_stream_wrapper *wrapper, cons
+ if (!handle) {
+ php_error_docref(NULL, E_WARNING, "Unable to open %s on remote host", filename);
+ php_url_free(resource);
+- //TODO Sean-Der
+- //zend_list_delete(sftp_rsrcid);
++ zend_list_delete(sftp_rsrc);
+ return NULL;
+ }
+
+ data = emalloc(sizeof(php_ssh2_sftp_handle_data));
+ data->handle = handle;
+- data->sftp_rsrcid = sftp_rsrcid;
++ data->sftp_rsrc = sftp_rsrc;
+
+ stream = php_stream_alloc(&php_ssh2_sftp_stream_ops, data, 0, mode);
+ if (!stream) {
+ libssh2_sftp_close(handle);
+- // TODO Sean-Der
+- //zend_list_delete(sftp_rsrcid);
++ zend_list_delete(sftp_rsrc);
+ efree(data);
+ }
+ php_url_free(resource);
+@@ -303,8 +299,7 @@ static int php_ssh2_sftp_dirstream_close(php_stream *stream, int close_handle)
+ php_ssh2_sftp_handle_data *data = (php_ssh2_sftp_handle_data*)stream->abstract;
+
+ libssh2_sftp_close(data->handle);
+- //TODO Sean_der
+- //zend_list_delete(data->sftp_rsrcid);
++ zend_list_delete(data->sftp_rsrc);
+ efree(data);
+
+ return 0;
+@@ -333,10 +328,10 @@ static php_stream *php_ssh2_sftp_dirstream_opener(php_stream_wrapper *wrapper, c
+ LIBSSH2_SFTP *sftp = NULL;
+ LIBSSH2_SFTP_HANDLE *handle;
+ php_stream *stream;
+- int resource_id = 0, sftp_rsrcid = 0;
++ zend_resource *rsrc = NULL, *sftp_rsrc = NULL;
+ php_url *resource;
+
+- resource = php_ssh2_fopen_wraper_parse_path(filename, "sftp", context, &session, &resource_id, &sftp, &sftp_rsrcid);
++ resource = php_ssh2_fopen_wraper_parse_path(filename, "sftp", context, &session, &rsrc, &sftp, &sftp_rsrc);
+ if (!resource || !session || !sftp) {
+ return NULL;
+ }
+@@ -345,20 +340,18 @@ static php_stream *php_ssh2_sftp_dirstream_opener(php_stream_wrapper *wrapper, c
+ if (!handle) {
+ php_error_docref(NULL, E_WARNING, "Unable to open %s on remote host", filename);
+ php_url_free(resource);
+- //TODO Sean-Der
+- //zend_list_delete(sftp_rsrcid);
++ zend_list_delete(sftp_rsrc);
+ return NULL;
+ }
+
+ data = emalloc(sizeof(php_ssh2_sftp_handle_data));
+ data->handle = handle;
+- data->sftp_rsrcid = sftp_rsrcid;
++ data->sftp_rsrc = sftp_rsrc;
+
+ stream = php_stream_alloc(&php_ssh2_sftp_dirstream_ops, data, 0, mode);
+ if (!stream) {
+ libssh2_sftp_close(handle);
+- //TODO Sean-Der
+- //zend_list_delete(sftp_rsrcid);
++ zend_list_delete(sftp_rsrc);
+ efree(data);
+ }
+ php_url_free(resource);
+@@ -378,10 +371,10 @@ static int php_ssh2_sftp_urlstat(php_stream_wrapper *wrapper, const char *url, i
+ LIBSSH2_SFTP_ATTRIBUTES attrs;
+ LIBSSH2_SESSION *session = NULL;
+ LIBSSH2_SFTP *sftp = NULL;
+- int resource_id = 0, sftp_rsrcid = 0;
++ zend_resource *rsrc = NULL, *sftp_rsrc = NULL;
+ php_url *resource;
+
+- resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &resource_id, &sftp, &sftp_rsrcid);
++ resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &rsrc, &sftp, &sftp_rsrc);
+ if (!resource || !session || !sftp || !resource->path) {
+ return -1;
+ }
+@@ -408,11 +401,11 @@ static int php_ssh2_sftp_unlink(php_stream_wrapper *wrapper, const char *url, in
+ {
+ LIBSSH2_SESSION *session = NULL;
+ LIBSSH2_SFTP *sftp = NULL;
+- int resource_id = 0, sftp_rsrcid = 0;
++ zend_resource *rsrc = NULL, *sftp_rsrc = NULL;
+ php_url *resource;
+ int result;
+
+- resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &resource_id, &sftp, &sftp_rsrcid);
++ resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &rsrc, &sftp, &sftp_rsrc);
+ if (!resource || !session || !sftp || !resource->path) {
+ if (resource) {
+ php_url_free(resource);
+@@ -436,7 +429,7 @@ static int php_ssh2_sftp_rename(php_stream_wrapper *wrapper, const char *url_fro
+ {
+ LIBSSH2_SESSION *session = NULL;
+ LIBSSH2_SFTP *sftp = NULL;
+- int resource_id = 0, sftp_rsrcid = 0;
++ zend_resource *rsrc = NULL, *sftp_rsrc = NULL;
+ php_url *resource, *resource_to;
+ int result;
+
+@@ -453,7 +446,7 @@ static int php_ssh2_sftp_rename(php_stream_wrapper *wrapper, const char *url_fro
+ return 0;
+ }
+
+- resource = php_ssh2_fopen_wraper_parse_path(url_from, "sftp", context, &session, &resource_id, &sftp, &sftp_rsrcid);
++ resource = php_ssh2_fopen_wraper_parse_path(url_from, "sftp", context, &session, &rsrc, &sftp, &sftp_rsrc);
+ if (!resource || !session || !sftp || !resource->path) {
+ if (resource) {
+ php_url_free(resource);
+@@ -479,11 +472,11 @@ static int php_ssh2_sftp_mkdir(php_stream_wrapper *wrapper, const char *url, int
+ {
+ LIBSSH2_SESSION *session = NULL;
+ LIBSSH2_SFTP *sftp = NULL;
+- int resource_id = 0, sftp_rsrcid = 0;
++ zend_resource *rsrc = NULL, *sftp_rsrc = NULL;
+ php_url *resource;
+ int result;
+
+- resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &resource_id, &sftp, &sftp_rsrcid);
++ resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &rsrc, &sftp, &sftp_rsrc);
+ if (!resource || !session || !sftp || !resource->path) {
+ if (resource) {
+ php_url_free(resource);
+@@ -515,11 +508,11 @@ static int php_ssh2_sftp_rmdir(php_stream_wrapper *wrapper, const char *url, int
+ {
+ LIBSSH2_SESSION *session = NULL;
+ LIBSSH2_SFTP *sftp = NULL;
+- int resource_id = 0, sftp_rsrcid = 0;
++ zend_resource *rsrc = NULL, *sftp_rsrc = NULL;
+ php_url *resource;
+ int result;
+
+- resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &resource_id, &sftp, &sftp_rsrcid);
++ resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &rsrc, &sftp, &sftp_rsrc);
+ if (!resource || !session || !sftp || !resource->path) {
+ if (resource) {
+ php_url_free(resource);
+@@ -591,7 +584,7 @@ PHP_FUNCTION(ssh2_sftp)
+ data = emalloc(sizeof(php_ssh2_sftp_data));
+ data->session = session;
+ data->sftp = sftp;
+- data->session_rsrcid = Z_RES_P(zsession)->handle;
++ data->session_rsrc = Z_RES_P(zsession);
+ Z_ADDREF_P(zsession);
+
+ RETURN_RES(zend_register_resource(data, le_ssh2_sftp));
diff --git a/PHPINFO b/PHPINFO
new file mode 100644
index 0000000..efa5ebd
--- /dev/null
+++ b/PHPINFO
@@ -0,0 +1,7 @@
+
+ssh2
+
+SSH2 support => enabled
+extension version => 1.1.2
+libssh2 version => 1.8.0
+banner => SSH-2.0-libssh2_1.8.0
diff --git a/REFLECTION b/REFLECTION
index 1f3a38e..945e2dc 100644
--- a/REFLECTION
+++ b/REFLECTION
@@ -1,4 +1,4 @@
-Extension [ <persistent> extension #133 ssh2 version 1.1.2 ] {
+Extension [ <persistent> extension #143 ssh2 version 1.1.2 ] {
- Constants [21] {
Constant [ integer SSH2_FINGERPRINT_MD5 ] { 0 }
diff --git a/a8835aab2c15e794fce13bd927295719e384ad2d.patch b/a8835aab2c15e794fce13bd927295719e384ad2d.patch
new file mode 100644
index 0000000..eb4c967
--- /dev/null
+++ b/a8835aab2c15e794fce13bd927295719e384ad2d.patch
@@ -0,0 +1,299 @@
+From a8835aab2c15e794fce13bd927295719e384ad2d Mon Sep 17 00:00:00 2001
+From: Remi Collet <remi@php.net>
+Date: Thu, 28 Jun 2018 07:10:35 +0200
+Subject: [PATCH] fix php_url fields usage for PHP 7.3
+
+---
+ php_ssh2.h | 8 ++++++++
+ ssh2_fopen_wrappers.c | 55 ++++++++++++++++++++++++++++++++-------------------
+ ssh2_sftp.c | 20 +++++++++----------
+ 3 files changed, 53 insertions(+), 30 deletions(-)
+
+diff --git a/php_ssh2.h b/php_ssh2.h
+index 734b795..d010ff9 100644
+--- a/php_ssh2.h
++++ b/php_ssh2.h
+@@ -166,6 +166,14 @@ extern php_stream_wrapper php_ssh2_sftp_wrapper;
+ extern int le_ssh2_session;
+ extern int le_ssh2_sftp;
+
++#if PHP_VERSION_ID < 70300
++#define SSH2_URL_STR(a) (a)
++#define SSH2_URL_LEN(a) strlen(a)
++#else
++#define SSH2_URL_STR(a) ZSTR_VAL(a)
++#define SSH2_URL_LEN(a) ZSTR_LEN(a)
++#endif
++
+ #endif /* PHP_SSH2_H */
+
+ /*
+diff --git a/ssh2_fopen_wrappers.c b/ssh2_fopen_wrappers.c
+index 2f96ca4..f2f3475 100644
+--- a/ssh2_fopen_wrappers.c
++++ b/ssh2_fopen_wrappers.c
+@@ -215,7 +215,7 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre
+ php_url *resource;
+ zval *methods = NULL, *callbacks = NULL, zsession, *tmpzval;
+ zend_long resource_id;
+- char *h, *s, *username = NULL, *password = NULL, *pubkey_file = NULL, *privkey_file = NULL;
++ char *h, *username = NULL, *password = NULL, *pubkey_file = NULL, *privkey_file = NULL;
+ int username_len = 0, password_len = 0;
+
+ h = strstr(path, "Resource id #");
+@@ -233,13 +233,13 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre
+ return NULL;
+ }
+
+- if (strncmp(resource->scheme, "ssh2.", sizeof("ssh2.") - 1)) {
++ if (strncmp(SSH2_URL_STR(resource->scheme), "ssh2.", sizeof("ssh2.") - 1)) {
+ /* Not an ssh wrapper */
+ php_url_free(resource);
+ return NULL;
+ }
+
+- if (strcmp(resource->scheme + sizeof("ssh2.") - 1, type)) {
++ if (strcmp(SSH2_URL_STR(resource->scheme) + sizeof("ssh2.") - 1, type)) {
+ /* Wrong ssh2. wrapper type */
+ php_url_free(resource);
+ return NULL;
+@@ -253,13 +253,27 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre
+ Find resource->path in the path string, then copy the entire string from the original path.
+ This includes ?query#fragment in the path string
+ */
++// TODO copy seems uneeded
++#if PHP_VERSION_ID < 70300
++ {
++ char * s;
++
+ s = resource->path;
+ resource->path = estrdup(strstr(path, resource->path));
+ efree(s);
++ }
++#else
++ {
++ zend_string *tmp;
++
++ tmp = resource->path;
++ resource->path = zend_string_init(ZSTR_VAL(resource->path), ZSTR_LEN(resource->path), 0);
++ zend_string_release(tmp);
++ }
++#endif
+
+ /* Look for a resource ID to reuse a session */
+- s = resource->host;
+- if (is_numeric_string(s, strlen(s), &resource_id, NULL, 0) == IS_LONG) {
++ if (is_numeric_string(SSH2_URL_STR(resource->host), SSH2_URL_LEN(resource->host), &resource_id, NULL, 0) == IS_LONG) {
+ php_ssh2_sftp_data *sftp_data;
+ zval *zresource;
+
+@@ -309,7 +323,7 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre
+ }
+
+ /* Fallback on finding it in the context */
+- if (resource->host[0] == 0 && context && psftp &&
++ if (SSH2_URL_STR(resource->host)[0] == 0 && context && psftp &&
+ (tmpzval = php_stream_context_get_option(context, "ssh2", "sftp")) != NULL &&
+ Z_TYPE_P(tmpzval) == IS_RESOURCE) {
+ php_ssh2_sftp_data *sftp_data;
+@@ -323,7 +337,7 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre
+ return resource;
+ }
+ }
+- if (resource->host[0] == 0 && context &&
++ if (SSH2_URL_STR(resource->host)[0] == 0 && context &&
+ (tmpzval = php_stream_context_get_option(context, "ssh2", "session")) != NULL &&
+ Z_TYPE_P(tmpzval) == IS_RESOURCE) {
+ session = (LIBSSH2_SESSION *)zend_fetch_resource(Z_RES_P(tmpzval), PHP_SSH2_SESSION_RES_NAME, le_ssh2_session);
+@@ -399,19 +413,19 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre
+ }
+
+ if (resource->user) {
+- int len = strlen(resource->user);
++ int len = SSH2_URL_LEN(resource->user);
+
+ if (len) {
+- username = resource->user;
++ username = SSH2_URL_STR(resource->user);
+ username_len = len;
+ }
+ }
+
+ if (resource->pass) {
+- int len = strlen(resource->pass);
++ int len = SSH2_URL_LEN(resource->pass);
+
+ if (len) {
+- password = resource->pass;
++ password = SSH2_URL_STR(resource->pass);
+ password_len = len;
+ }
+ }
+@@ -422,7 +436,7 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre
+ return NULL;
+ }
+
+- session = php_ssh2_session_connect(resource->host, resource->port, methods, callbacks);
++ session = php_ssh2_session_connect(SSH2_URL_STR(resource->host), resource->port, methods, callbacks);
+ if (!session) {
+ /* Unable to connect! */
+ php_url_free(resource);
+@@ -482,6 +496,7 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre
+ *psftp = sftp;
+ }
+
++ //TODO may be undefined
+ *presource_id = Z_LVAL(zsession);
+ *psession = session;
+
+@@ -527,7 +542,7 @@ static php_stream *php_ssh2_shell_open(LIBSSH2_SESSION *session, int resource_id
+ zval_copy_ctor(&copyval);
+ convert_to_string(&copyval);
+ if (libssh2_channel_setenv_ex(channel, key->val, key->len, Z_STRVAL(copyval), Z_STRLEN(copyval))) {
+- php_error_docref(NULL, E_WARNING, "Failed setting %s=%s on remote end", key, Z_STRVAL(copyval));
++ php_error_docref(NULL, E_WARNING, "Failed setting %s=%s on remote end", ZSTR_VAL(key), Z_STRVAL(copyval));
+ }
+ zval_dtor(&copyval);
+ }
+@@ -631,7 +646,7 @@ static php_stream *php_ssh2_fopen_wrapper_shell(php_stream_wrapper *wrapper, con
+ zval_ptr_dtor(&copyval);
+ }
+
+- s = resource->path ? resource->path : NULL;
++ s = resource->path ? SSH2_URL_STR(resource->path) : NULL;
+
+ if (s && s[0] == '/') {
+ /* Terminal type encoded into URL overrides context terminal type */
+@@ -766,7 +781,7 @@ static php_stream *php_ssh2_exec_command(LIBSSH2_SESSION *session, int resource_
+ zval_copy_ctor(&copyval);
+ convert_to_string(&copyval);
+ if (libssh2_channel_setenv_ex(channel, key->val, key->len, Z_STRVAL(copyval), Z_STRLEN(copyval))) {
+- php_error_docref(NULL, E_WARNING, "Failed setting %s=%s on remote end", key, Z_STRVAL(copyval));
++ php_error_docref(NULL, E_WARNING, "Failed setting %s=%s on remote end", ZSTR_VAL(key), Z_STRVAL(copyval));
+ }
+ zval_dtor(&copyval);
+ }
+@@ -878,7 +893,7 @@ static php_stream *php_ssh2_fopen_wrapper_exec(php_stream_wrapper *wrapper, cons
+ zval_ptr_dtor(copyval);
+ }
+
+- stream = php_ssh2_exec_command(session, resource_id, resource->path + 1, terminal, terminal_len, environment, width, height, type);
++ stream = php_ssh2_exec_command(session, resource_id, SSH2_URL_STR(resource->path) + 1, terminal, terminal_len, environment, width, height, type);
+ if (!stream) {
+ // TODO Sean-Der
+ //zend_list_delete(resource_id);
+@@ -1021,7 +1036,7 @@ static php_stream *php_ssh2_fopen_wrapper_scp(php_stream_wrapper *wrapper, const
+ return NULL;
+ }
+
+- stream = php_ssh2_scp_xfer(session, resource_id, resource->path);
++ stream = php_ssh2_scp_xfer(session, resource_id, SSH2_URL_STR(resource->path));
+ if (!stream) {
+ //TODO Sean-Der
+ //zend_list_delete(resource_id);
+@@ -1147,7 +1162,7 @@ PHP_FUNCTION(ssh2_scp_send)
+ char *error_msg = NULL;
+
+ last_error = libssh2_session_last_error(session, &error_msg, NULL, 0);
+- php_error_docref(NULL, E_WARNING, "Failure creating remote file: %s", error_msg);
++ php_error_docref(NULL, E_WARNING, "Failure creating remote file: %s (%d)", error_msg, last_error);
+ php_stream_close(local_file);
+ RETURN_FALSE;
+ }
+@@ -1262,10 +1277,10 @@ static php_stream *php_ssh2_fopen_wrapper_tunnel(php_stream_wrapper *wrapper, co
+ return NULL;
+ }
+
+- if (resource->path && resource->path[0] == '/') {
++ if (resource->path && SSH2_URL_STR(resource->path)[0] == '/') {
+ char *colon;
+
+- host = resource->path + 1;
++ host = SSH2_URL_STR(resource->path) + 1;
+ if (*host == '[') {
+ /* IPv6 Encapsulated Format */
+ host++;
+diff --git a/ssh2_sftp.c b/ssh2_sftp.c
+index 13f89f0..6332be8 100644
+--- a/ssh2_sftp.c
++++ b/ssh2_sftp.c
+@@ -238,7 +238,7 @@ static php_stream *php_ssh2_sftp_stream_opener(php_stream_wrapper *wrapper, cons
+
+ flags = php_ssh2_parse_fopen_modes((char *)mode);
+
+- handle = libssh2_sftp_open(sftp, resource->path, flags, perms);
++ handle = libssh2_sftp_open(sftp, SSH2_URL_STR(resource->path), flags, perms);
+ if (!handle) {
+ php_error_docref(NULL, E_WARNING, "Unable to open %s on remote host", filename);
+ php_url_free(resource);
+@@ -341,7 +341,7 @@ static php_stream *php_ssh2_sftp_dirstream_opener(php_stream_wrapper *wrapper, c
+ return NULL;
+ }
+
+- handle = libssh2_sftp_opendir(sftp, resource->path);
++ handle = libssh2_sftp_opendir(sftp, SSH2_URL_STR(resource->path));
+ if (!handle) {
+ php_error_docref(NULL, E_WARNING, "Unable to open %s on remote host", filename);
+ php_url_free(resource);
+@@ -386,7 +386,7 @@ static int php_ssh2_sftp_urlstat(php_stream_wrapper *wrapper, const char *url, i
+ return -1;
+ }
+
+- if (libssh2_sftp_stat_ex(sftp, resource->path, strlen(resource->path),
++ if (libssh2_sftp_stat_ex(sftp, SSH2_URL_STR(resource->path), SSH2_URL_LEN(resource->path),
+ (flags & PHP_STREAM_URL_STAT_LINK) ? LIBSSH2_SFTP_LSTAT : LIBSSH2_SFTP_STAT, &attrs)) {
+ php_url_free(resource);
+ //zend_list_delete(sftp_rsrcid);
+@@ -420,7 +420,7 @@ static int php_ssh2_sftp_unlink(php_stream_wrapper *wrapper, const char *url, in
+ return 0;
+ }
+
+- result = libssh2_sftp_unlink(sftp, resource->path);
++ result = libssh2_sftp_unlink(sftp, SSH2_URL_STR(resource->path));
+ php_url_free(resource);
+
+ //zend_list_delete(sftp_rsrcid);
+@@ -462,7 +462,7 @@ static int php_ssh2_sftp_rename(php_stream_wrapper *wrapper, const char *url_fro
+ return 0;
+ }
+
+- result = libssh2_sftp_rename(sftp, resource->path, resource_to->path);
++ result = libssh2_sftp_rename(sftp, SSH2_URL_STR(resource->path), SSH2_URL_STR(resource_to->path));
+ php_url_free(resource);
+ php_url_free(resource_to);
+
+@@ -493,13 +493,13 @@ static int php_ssh2_sftp_mkdir(php_stream_wrapper *wrapper, const char *url, int
+
+ if (options & PHP_STREAM_MKDIR_RECURSIVE) {
+ /* Just attempt to make every directory, some will fail, but we only care about the last success/failure */
+- char *p = resource->path;
++ char *p = SSH2_URL_STR(resource->path);
+ while ((p = strchr(p + 1, '/'))) {
+- libssh2_sftp_mkdir_ex(sftp, resource->path, p - resource->path, mode);
++ libssh2_sftp_mkdir_ex(sftp, SSH2_URL_STR(resource->path), p - SSH2_URL_STR(resource->path), mode);
+ }
+ }
+
+- result = libssh2_sftp_mkdir(sftp, resource->path, mode);
++ result = libssh2_sftp_mkdir(sftp, SSH2_URL_STR(resource->path), mode);
+ php_url_free(resource);
+
+ //zend_list_delete(sftp_rsrcid);
+@@ -527,7 +527,7 @@ static int php_ssh2_sftp_rmdir(php_stream_wrapper *wrapper, const char *url, int
+ return 0;
+ }
+
+- result = libssh2_sftp_rmdir(sftp, resource->path);
++ result = libssh2_sftp_rmdir(sftp, SSH2_URL_STR(resource->path));
+ php_url_free(resource);
+
+ //zend_list_delete(sftp_rsrcid);
+@@ -836,7 +836,7 @@ PHP_FUNCTION(ssh2_sftp_readlink)
+ }
+
+ if ((targ_len = libssh2_sftp_symlink_ex(data->sftp, link->val, link->len, targ, 8192, LIBSSH2_SFTP_READLINK)) < 0) {
+- php_error_docref(NULL, E_WARNING, "Unable to read link '%s'", link);
++ php_error_docref(NULL, E_WARNING, "Unable to read link '%s'", ZSTR_VAL(link));
+ RETURN_FALSE;
+ }
+
diff --git a/php-pecl-ssh2.spec b/php-pecl-ssh2.spec
index 3096a0a..c520958 100644
--- a/php-pecl-ssh2.spec
+++ b/php-pecl-ssh2.spec
@@ -1,7 +1,7 @@
# remirepo spec file for php-pecl-ssh2
# with SCL compatibility
#
-# Copyright (c) 2011-2017 Remi Collet
+# Copyright (c) 2011-2018 Remi Collet
#
# Fedora spec file for php-pecl-ssh2
#
@@ -30,7 +30,7 @@ Version: 1.1.2
Release: 0.3.%{gh_date}git%{gh_short}%{?dist}%{!?scl:%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}}
Source0: https://github.com/%{gh_owner}/%{gh_project}/archive/%{gh_commit}/%{gh_project}-%{version}%{?prever}-%{gh_short}.tar.gz
%else
-Release: 1%{?dist}%{!?scl:%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}}
+Release: 2%{?dist}%{!?scl:%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}}
Source0: http://pecl.php.net/get/%{pecl_name}-%{version}.tgz
%endif
Summary: Bindings for the libssh2 library
@@ -38,10 +38,13 @@ Summary: Bindings for the libssh2 library
%global buildver %(pkg-config --silence-errors --modversion libssh2 2>/dev/null || echo 65536)
License: PHP
-Group: Development/Languages
URL: http://pecl.php.net/package/%{pecl_name}
+Patch0: https://github.com/php/pecl-networking-ssh2/commit/a8835aab2c15e794fce13bd927295719e384ad2d.patch
+Patch1: https://github.com/php/pecl-networking-ssh2/commit/073067ba96ac99ed5696d27f13ca6c8124986e74.patch
+
BuildRequires: libssh2-devel >= 1.2
+BuildRequires: %{?dtsprefix}gcc
BuildRequires: %{?scl_prefix}php-devel > 7
BuildRequires: %{?scl_prefix}php-pear
@@ -119,6 +122,9 @@ sed -e 's/role="test"/role="src"/' \
-i package.xml
cd NTS
+%patch0 -p1 -b .up0
+%patch1 -p1 -b .up1
+
extver=$(sed -n '/#define PHP_SSH2_VERSION/{s/.*\t"//;s/".*$//;p}' php_ssh2.h)
if test "x${extver}" != "x%{version}%{?gh_date:-dev}"; then
: Error: Upstream version is now ${extver}, expecting %{version}%{?gh_date:-dev}.
@@ -193,7 +199,7 @@ done
%endif
-%if 0%{?fedora} < 24
+%if 0%{?fedora} < 24 && 0%{?rhel} < 8
# when pear installed alone, after us
%triggerin -- %{?scl_prefix}php-pear
if [ -x %{__pecl} ] ; then
@@ -231,6 +237,9 @@ fi
%changelog
+* Thu Jun 28 2018 Remi Collet <remi@remirepo.net> - 1.1.2-2
+- add upstream patches for 7.3
+
* Tue Aug 1 2017 Remi Collet <remi@remirepo.net> - 1.1.2-1
- Update to 1.1.2 (alpha, no change)