| 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. |
| |
| Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> |
| [Retrieved from: |
| https://github.com/php/pecl-networking-ssh2/commit/073067ba96ac99ed5696d27f13ca6c8124986e74] |
| --- |
| 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)); |