2
1

0002-dstogov-Fixed-PHP7-port-Restored-commented-reference-counting.patch 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746
  1. From 073067ba96ac99ed5696d27f13ca6c8124986e74 Mon Sep 17 00:00:00 2001
  2. From: Jan-E <github@ehrhardt.nl>
  3. Date: Thu, 28 Jun 2018 08:43:48 +0200
  4. Subject: [PATCH] @dstogov Fixed PHP7 port. Restored commented reference
  5. counting.
  6. Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
  7. [Retrieved from:
  8. https://github.com/php/pecl-networking-ssh2/commit/073067ba96ac99ed5696d27f13ca6c8124986e74]
  9. ---
  10. php_ssh2.h | 14 ++---
  11. ssh2.c | 26 ++++-----
  12. ssh2_fopen_wrappers.c | 129 ++++++++++++++++++------------------------
  13. ssh2_sftp.c | 59 +++++++++----------
  14. 4 files changed, 102 insertions(+), 126 deletions(-)
  15. diff --git a/php_ssh2.h b/php_ssh2.h
  16. index d010ff9..2bbaa26 100644
  17. --- a/php_ssh2.h
  18. +++ b/php_ssh2.h
  19. @@ -73,14 +73,14 @@ typedef struct _php_ssh2_sftp_data {
  20. LIBSSH2_SESSION *session;
  21. LIBSSH2_SFTP *sftp;
  22. - int session_rsrcid;
  23. + zend_resource *session_rsrc;
  24. } php_ssh2_sftp_data;
  25. typedef struct _php_ssh2_listener_data {
  26. LIBSSH2_SESSION *session;
  27. LIBSSH2_LISTENER *listener;
  28. - int session_rsrcid;
  29. + zend_resource *session_rsrc;
  30. } php_ssh2_listener_data;
  31. #include "libssh2_publickey.h"
  32. @@ -89,7 +89,7 @@ typedef struct _php_ssh2_pkey_subsys_data {
  33. LIBSSH2_SESSION *session;
  34. LIBSSH2_PUBLICKEY *pkey;
  35. - int session_rsrcid;
  36. + zend_resource *session_rsrc;
  37. } php_ssh2_pkey_subsys_data;
  38. #define SSH2_FETCH_NONAUTHENTICATED_SESSION(session, zsession) \
  39. @@ -118,8 +118,8 @@ typedef struct _php_ssh2_channel_data {
  40. char is_blocking;
  41. long timeout;
  42. - /* Resource ID */
  43. - int session_rsrcid;
  44. + /* Resource */
  45. + zend_resource *session_rsrc;
  46. /* Allow one stream to be closed while the other is kept open */
  47. unsigned char *refcount;
  48. @@ -151,8 +151,8 @@ PHP_FUNCTION(ssh2_sftp_realpath);
  49. LIBSSH2_SESSION *php_ssh2_session_connect(char *host, int port, zval *methods, zval *callbacks);
  50. void php_ssh2_sftp_dtor(zend_resource *rsrc);
  51. php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stream_context *context,
  52. - LIBSSH2_SESSION **psession, int *presource_id,
  53. - LIBSSH2_SFTP **psftp, int *psftp_rsrcid);
  54. + LIBSSH2_SESSION **psession, zend_resource **presource,
  55. + LIBSSH2_SFTP **psftp, zend_resource **psftp_rsrc);
  56. extern php_stream_ops php_ssh2_channel_stream_ops;
  57. diff --git a/ssh2.c b/ssh2.c
  58. index e73867e..849766b 100644
  59. --- a/ssh2.c
  60. +++ b/ssh2.c
  61. @@ -772,9 +772,8 @@ PHP_FUNCTION(ssh2_forward_listen)
  62. data = emalloc(sizeof(php_ssh2_listener_data));
  63. data->session = session;
  64. - data->session_rsrcid = Z_LVAL_P(zsession);
  65. - //TODO Sean-Der
  66. - //zend_list_addref(data->session_rsrcid);
  67. + data->session_rsrc = Z_RES_P(zsession);
  68. + Z_ADDREF_P(zsession);
  69. data->listener = listener;
  70. RETURN_RES(zend_register_resource(data, le_ssh2_listener));
  71. @@ -810,7 +809,7 @@ PHP_FUNCTION(ssh2_forward_accept)
  72. channel_data->channel = channel;
  73. channel_data->streamid = 0;
  74. channel_data->is_blocking = 0;
  75. - channel_data->session_rsrcid = data->session_rsrcid;
  76. + channel_data->session_rsrc = data->session_rsrc;
  77. channel_data->refcount = NULL;
  78. stream = php_stream_alloc(&php_ssh2_channel_stream_ops, channel_data, 0, "r+");
  79. @@ -820,8 +819,12 @@ PHP_FUNCTION(ssh2_forward_accept)
  80. libssh2_channel_free(channel);
  81. RETURN_FALSE;
  82. }
  83. - //TODO Sean-Der
  84. - //zend_list_addref(channel_data->session_rsrcid);
  85. +
  86. +#if PHP_VERSION_ID < 70300
  87. + GC_REFCOUNT(channel_data->session_rsrc)++;
  88. +#else
  89. + GC_ADDREF(channel_data->session_rsrc);
  90. +#endif
  91. php_stream_to_zval(stream, return_value);
  92. }
  93. @@ -975,9 +978,8 @@ PHP_FUNCTION(ssh2_publickey_init)
  94. data = emalloc(sizeof(php_ssh2_pkey_subsys_data));
  95. data->session = session;
  96. - data->session_rsrcid = Z_RES_P(zsession)->handle;
  97. - //TODO Sean-Der
  98. - //zend_list_addref(data->session_rsrcid);
  99. + data->session_rsrc = Z_RES_P(zsession);
  100. + Z_ADDREF_P(zsession);
  101. data->pkey = pkey;
  102. RETURN_RES(zend_register_resource(data, le_ssh2_pkey_subsys));
  103. @@ -1280,8 +1282,7 @@ static void php_ssh2_listener_dtor(zend_resource *rsrc)
  104. LIBSSH2_LISTENER *listener = data->listener;
  105. libssh2_channel_forward_cancel(listener);
  106. - // TODO Sean-Der
  107. - //zend_list_delete(data->session_rsrcid);
  108. + zend_list_delete(data->session_rsrc);
  109. efree(data);
  110. }
  111. @@ -1291,8 +1292,7 @@ static void php_ssh2_pkey_subsys_dtor(zend_resource *rsrc)
  112. LIBSSH2_PUBLICKEY *pkey = data->pkey;
  113. libssh2_publickey_shutdown(pkey);
  114. - // TODO Sean-Der
  115. - //zend_list_delete(data->session_rsrcid);
  116. + zend_list_delete(data->session_rsrc);
  117. efree(data);
  118. }
  119. diff --git a/ssh2_fopen_wrappers.c b/ssh2_fopen_wrappers.c
  120. index f2f3475..c4eb9dc 100644
  121. --- a/ssh2_fopen_wrappers.c
  122. +++ b/ssh2_fopen_wrappers.c
  123. @@ -47,11 +47,9 @@ static size_t php_ssh2_channel_stream_write(php_stream *stream, const char *buf,
  124. php_ssh2_channel_data *abstract = (php_ssh2_channel_data*)stream->abstract;
  125. size_t writestate;
  126. LIBSSH2_SESSION *session;
  127. - zval *zresource;
  128. libssh2_channel_set_blocking(abstract->channel, abstract->is_blocking);
  129. - zresource = php_ssh2_zval_from_resource_handle(abstract->session_rsrcid);
  130. - session = (LIBSSH2_SESSION *)zend_fetch_resource(Z_RES_P(zresource), PHP_SSH2_SESSION_RES_NAME, le_ssh2_session);
  131. + session = (LIBSSH2_SESSION *)zend_fetch_resource(abstract->session_rsrc, PHP_SSH2_SESSION_RES_NAME, le_ssh2_session);
  132. @@ -90,12 +88,10 @@ static size_t php_ssh2_channel_stream_read(php_stream *stream, char *buf, size_t
  133. php_ssh2_channel_data *abstract = (php_ssh2_channel_data*)stream->abstract;
  134. ssize_t readstate;
  135. LIBSSH2_SESSION *session;
  136. - zval *zresource;
  137. stream->eof = libssh2_channel_eof(abstract->channel);
  138. libssh2_channel_set_blocking(abstract->channel, abstract->is_blocking);
  139. - zresource = php_ssh2_zval_from_resource_handle(abstract->session_rsrcid);
  140. - session = (LIBSSH2_SESSION *)zend_fetch_resource(Z_RES_P(zresource), PHP_SSH2_SESSION_RES_NAME, le_ssh2_session);
  141. + session = (LIBSSH2_SESSION *)zend_fetch_resource(abstract->session_rsrc, PHP_SSH2_SESSION_RES_NAME, le_ssh2_session);
  142. #ifdef PHP_SSH2_SESSION_TIMEOUT
  143. if (abstract->is_blocking) {
  144. @@ -137,8 +133,7 @@ static int php_ssh2_channel_stream_close(php_stream *stream, int close_handle)
  145. }
  146. libssh2_channel_eof(abstract->channel);
  147. libssh2_channel_free(abstract->channel);
  148. - //TODO Sean-Der
  149. - //zend_list_delete(abstract->session_rsrcid);
  150. + zend_list_delete(abstract->session_rsrc);
  151. }
  152. efree(abstract);
  153. @@ -207,8 +202,8 @@ php_stream_ops php_ssh2_channel_stream_ops = {
  154. * Parse an ssh2.*:// path
  155. */
  156. php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stream_context *context,
  157. - LIBSSH2_SESSION **psession, int *presource_id,
  158. - LIBSSH2_SFTP **psftp, int *psftp_rsrcid)
  159. + LIBSSH2_SESSION **psession, zend_resource **presource,
  160. + LIBSSH2_SFTP **psftp, zend_resource **psftp_rsrc)
  161. {
  162. php_ssh2_sftp_data *sftp_data = NULL;
  163. LIBSSH2_SESSION *session;
  164. @@ -283,11 +278,10 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre
  165. sftp_data = (php_ssh2_sftp_data *)zend_fetch_resource(Z_RES_P(zresource), PHP_SSH2_SFTP_RES_NAME, le_ssh2_sftp);
  166. if (sftp_data) {
  167. /* Want the sftp layer */
  168. - //TODO Sean-Der
  169. - //zend_list_addref(resource_id);
  170. - *psftp_rsrcid = resource_id;
  171. + Z_ADDREF_P(zresource);
  172. + *psftp_rsrc = Z_RES_P(zresource);
  173. *psftp = sftp_data->sftp;
  174. - *presource_id = sftp_data->session_rsrcid;
  175. + *presource = sftp_data->session_rsrc;
  176. *psession = sftp_data->session;
  177. return resource;
  178. }
  179. @@ -305,18 +299,16 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre
  180. sftp_data = emalloc(sizeof(php_ssh2_sftp_data));
  181. sftp_data->sftp = sftp;
  182. sftp_data->session = session;
  183. - sftp_data->session_rsrcid = resource_id;
  184. - //TODO Sean-Der
  185. - //zend_list_addref(resource_id);
  186. - *psftp_rsrcid = zend_register_resource(sftp_data, le_ssh2_sftp)->handle;
  187. + sftp_data->session_rsrc = Z_RES_P(zresource);
  188. + Z_ADDREF_P(zresource);
  189. + *psftp_rsrc = zend_register_resource(sftp_data, le_ssh2_sftp);
  190. *psftp = sftp;
  191. - *presource_id = resource_id;
  192. + *presource = Z_RES_P(zresource);
  193. *psession = session;
  194. return resource;
  195. }
  196. - //TODO Sean-Der
  197. - //zend_list_addref(resource_id);
  198. - *presource_id = resource_id;
  199. + Z_ADDREF_P(zresource);
  200. + *presource = Z_RES_P(zresource);
  201. *psession = session;
  202. return resource;
  203. }
  204. @@ -330,9 +322,9 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre
  205. sftp_data = (php_ssh2_sftp_data *)zend_fetch_resource(Z_RES_P(tmpzval), PHP_SSH2_SFTP_RES_NAME, le_ssh2_sftp);
  206. if (sftp_data) {
  207. Z_ADDREF_P(tmpzval);
  208. - *psftp_rsrcid = Z_LVAL_P(tmpzval);
  209. + *psftp_rsrc = Z_RES_P(tmpzval);
  210. *psftp = sftp_data->sftp;
  211. - *presource_id = sftp_data->session_rsrcid;
  212. + *presource = sftp_data->session_rsrc;
  213. *psession = sftp_data->session;
  214. return resource;
  215. }
  216. @@ -354,17 +346,17 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre
  217. sftp_data = emalloc(sizeof(php_ssh2_sftp_data));
  218. sftp_data->sftp = sftp;
  219. sftp_data->session = session;
  220. - sftp_data->session_rsrcid = Z_LVAL_P(tmpzval);
  221. + sftp_data->session_rsrc = Z_RES_P(tmpzval);
  222. Z_ADDREF_P(tmpzval);
  223. - *psftp_rsrcid = zend_register_resource(sftp_data, le_ssh2_sftp)->handle;
  224. + *psftp_rsrc = zend_register_resource(sftp_data, le_ssh2_sftp);
  225. *psftp = sftp;
  226. - *presource_id = Z_RES_P(tmpzval)->handle;
  227. + *presource = Z_RES_P(tmpzval);
  228. *psession = session;
  229. return resource;
  230. }
  231. Z_ADDREF_P(tmpzval);
  232. *psession = session;
  233. - *presource_id = Z_LVAL_P(tmpzval);
  234. + *presource = Z_RES_P(tmpzval);
  235. return resource;
  236. }
  237. }
  238. @@ -465,8 +457,7 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre
  239. /* Auth failure */
  240. php_url_free(resource);
  241. - //TODO Sean-Der
  242. - //zend_list_delete(Z_LVAL(zsession));
  243. + zend_list_delete(Z_RES(zsession));
  244. return NULL;
  245. session_authed:
  246. @@ -480,24 +471,22 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre
  247. sftp = libssh2_sftp_init(session);
  248. if (!sftp) {
  249. php_url_free(resource);
  250. - //TODO Sean-Der
  251. - //zend_list_delete(Z_LVAL(zsession));
  252. + zend_list_delete(Z_RES(zsession));
  253. return NULL;
  254. }
  255. sftp_data = emalloc(sizeof(php_ssh2_sftp_data));
  256. sftp_data->session = session;
  257. sftp_data->sftp = sftp;
  258. - sftp_data->session_rsrcid = Z_LVAL(zsession);
  259. + sftp_data->session_rsrc = Z_RES(zsession);
  260. //TODO Sean-Der
  261. //ZEND_REGISTER_RESOURCE(sftp_data, le_ssh2_sftp);
  262. - *psftp_rsrcid = Z_LVAL(zsftp);
  263. + *psftp_rsrc = Z_RES(zsftp);
  264. *psftp = sftp;
  265. }
  266. - //TODO may be undefined
  267. - *presource_id = Z_LVAL(zsession);
  268. + *presource = Z_RES(zsession);
  269. *psession = session;
  270. return resource;
  271. @@ -511,7 +500,7 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre
  272. /* {{{ php_ssh2_shell_open
  273. * Make a stream from a session
  274. */
  275. -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)
  276. +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)
  277. {
  278. LIBSSH2_CHANNEL *channel;
  279. php_ssh2_channel_data *channel_data;
  280. @@ -578,7 +567,7 @@ static php_stream *php_ssh2_shell_open(LIBSSH2_SESSION *session, int resource_id
  281. channel_data->streamid = 0;
  282. channel_data->is_blocking = 0;
  283. channel_data->timeout = 0;
  284. - channel_data->session_rsrcid = resource_id;
  285. + channel_data->session_rsrc = resource;
  286. channel_data->refcount = NULL;
  287. stream = php_stream_alloc(&php_ssh2_channel_stream_ops, channel_data, 0, "r+");
  288. @@ -599,11 +588,12 @@ static php_stream *php_ssh2_fopen_wrapper_shell(php_stream_wrapper *wrapper, con
  289. zend_long width = PHP_SSH2_DEFAULT_TERM_WIDTH;
  290. zend_long height = PHP_SSH2_DEFAULT_TERM_HEIGHT;
  291. zend_long type = PHP_SSH2_DEFAULT_TERM_UNIT;
  292. - int resource_id = 0, terminal_len = sizeof(PHP_SSH2_DEFAULT_TERMINAL) - 1;
  293. + zend_resource *rsrc = NULL;
  294. + int terminal_len = sizeof(PHP_SSH2_DEFAULT_TERMINAL) - 1;
  295. php_url *resource;
  296. char *s;
  297. - resource = php_ssh2_fopen_wraper_parse_path(path, "shell", context, &session, &resource_id, NULL, NULL);
  298. + resource = php_ssh2_fopen_wraper_parse_path(path, "shell", context, &session, &rsrc, NULL, NULL);
  299. if (!resource || !session) {
  300. return NULL;
  301. }
  302. @@ -677,10 +667,9 @@ static php_stream *php_ssh2_fopen_wrapper_shell(php_stream_wrapper *wrapper, con
  303. /* TODO: Accept resolution and environment vars as URL style parameters
  304. * ssh2.shell://hostorresource/terminal/99x99c?envvar=envval&envvar=envval....
  305. */
  306. - stream = php_ssh2_shell_open(session, resource_id, terminal, terminal_len, environment, width, height, type);
  307. + stream = php_ssh2_shell_open(session, rsrc, terminal, terminal_len, environment, width, height, type);
  308. if (!stream) {
  309. - //TODO Sean-Der
  310. - //zend_list_delete(resource_id);
  311. + zend_list_delete(rsrc);
  312. }
  313. php_url_free(resource);
  314. @@ -730,7 +719,7 @@ PHP_FUNCTION(ssh2_shell)
  315. SSH2_FETCH_AUTHENTICATED_SESSION(session, zsession);
  316. - stream = php_ssh2_shell_open(session, Z_RES_P(zsession)->handle, term, term_len, environment, width, height, type);
  317. + stream = php_ssh2_shell_open(session, Z_RES_P(zsession), term, term_len, environment, width, height, type);
  318. if (!stream) {
  319. RETURN_FALSE;
  320. }
  321. @@ -749,7 +738,7 @@ PHP_FUNCTION(ssh2_shell)
  322. /* {{{ php_ssh2_exec_command
  323. * Make a stream from a session
  324. */
  325. -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)
  326. +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)
  327. {
  328. LIBSSH2_CHANNEL *channel;
  329. php_ssh2_channel_data *channel_data;
  330. @@ -819,7 +808,7 @@ static php_stream *php_ssh2_exec_command(LIBSSH2_SESSION *session, int resource_
  331. channel_data->streamid = 0;
  332. channel_data->is_blocking = 0;
  333. channel_data->timeout = 0;
  334. - channel_data->session_rsrcid = resource_id;
  335. + channel_data->session_rsrc = rsrc;
  336. channel_data->refcount = NULL;
  337. stream = php_stream_alloc(&php_ssh2_channel_stream_ops, channel_data, 0, "r+");
  338. @@ -836,7 +825,7 @@ static php_stream *php_ssh2_fopen_wrapper_exec(php_stream_wrapper *wrapper, cons
  339. LIBSSH2_SESSION *session = NULL;
  340. php_stream *stream;
  341. zval *tmpzval, *environment = NULL;
  342. - int resource_id = 0;
  343. + zend_resource *rsrc = NULL;
  344. php_url *resource;
  345. char *terminal = NULL;
  346. int terminal_len = 0;
  347. @@ -844,14 +833,13 @@ static php_stream *php_ssh2_fopen_wrapper_exec(php_stream_wrapper *wrapper, cons
  348. long height = PHP_SSH2_DEFAULT_TERM_HEIGHT;
  349. long type = PHP_SSH2_DEFAULT_TERM_UNIT;
  350. - resource = php_ssh2_fopen_wraper_parse_path(path, "exec", context, &session, &resource_id, NULL, NULL);
  351. + resource = php_ssh2_fopen_wraper_parse_path(path, "exec", context, &session, &rsrc, NULL, NULL);
  352. if (!resource || !session) {
  353. return NULL;
  354. }
  355. if (!resource->path) {
  356. php_url_free(resource);
  357. - //TODO Sean-Der
  358. - //zend_list_delete(resource_id);
  359. + zend_list_delete(rsrc);
  360. return NULL;
  361. }
  362. @@ -893,10 +881,9 @@ static php_stream *php_ssh2_fopen_wrapper_exec(php_stream_wrapper *wrapper, cons
  363. zval_ptr_dtor(copyval);
  364. }
  365. - stream = php_ssh2_exec_command(session, resource_id, SSH2_URL_STR(resource->path) + 1, terminal, terminal_len, environment, width, height, type);
  366. + stream = php_ssh2_exec_command(session, rsrc, SSH2_URL_STR(resource->path) + 1, terminal, terminal_len, environment, width, height, type);
  367. if (!stream) {
  368. - // TODO Sean-Der
  369. - //zend_list_delete(resource_id);
  370. + zend_list_delete(rsrc);
  371. }
  372. php_url_free(resource);
  373. @@ -963,7 +950,7 @@ PHP_FUNCTION(ssh2_exec)
  374. SSH2_FETCH_AUTHENTICATED_SESSION(session, zsession);
  375. - stream = php_ssh2_exec_command(session, Z_RES_P(zsession)->handle, command, term, term_len, environment, width, height, type);
  376. + stream = php_ssh2_exec_command(session, Z_RES_P(zsession), command, term, term_len, environment, width, height, type);
  377. if (!stream) {
  378. RETURN_FALSE;
  379. }
  380. @@ -982,7 +969,7 @@ PHP_FUNCTION(ssh2_exec)
  381. /* {{{ php_ssh2_scp_xfer
  382. * Make a stream from a session
  383. */
  384. -static php_stream *php_ssh2_scp_xfer(LIBSSH2_SESSION *session, int resource_id, char *filename)
  385. +static php_stream *php_ssh2_scp_xfer(LIBSSH2_SESSION *session, zend_resource *rsrc, char *filename)
  386. {
  387. LIBSSH2_CHANNEL *channel;
  388. php_ssh2_channel_data *channel_data;
  389. @@ -1002,7 +989,7 @@ static php_stream *php_ssh2_scp_xfer(LIBSSH2_SESSION *session, int resource_id,
  390. channel_data->streamid = 0;
  391. channel_data->is_blocking = 0;
  392. channel_data->timeout = 0;
  393. - channel_data->session_rsrcid = resource_id;
  394. + channel_data->session_rsrc = rsrc;
  395. channel_data->refcount = NULL;
  396. stream = php_stream_alloc(&php_ssh2_channel_stream_ops, channel_data, 0, "r");
  397. @@ -1018,28 +1005,26 @@ static php_stream *php_ssh2_fopen_wrapper_scp(php_stream_wrapper *wrapper, const
  398. {
  399. LIBSSH2_SESSION *session = NULL;
  400. php_stream *stream;
  401. - int resource_id = 0;
  402. + zend_resource *rsrc = NULL;
  403. php_url *resource;
  404. if (strchr(mode, '+') || strchr(mode, 'a') || strchr(mode, 'w')) {
  405. return NULL;
  406. }
  407. - resource = php_ssh2_fopen_wraper_parse_path(path, "scp", context, &session, &resource_id, NULL, NULL);
  408. + resource = php_ssh2_fopen_wraper_parse_path(path, "scp", context, &session, &rsrc, NULL, NULL);
  409. if (!resource || !session) {
  410. return NULL;
  411. }
  412. if (!resource->path) {
  413. php_url_free(resource);
  414. - //TODO Sean-Der
  415. - //zend_list_delete(resource_id);
  416. + zend_list_delete(rsrc);
  417. return NULL;
  418. }
  419. - stream = php_ssh2_scp_xfer(session, resource_id, SSH2_URL_STR(resource->path));
  420. + stream = php_ssh2_scp_xfer(session, rsrc, SSH2_URL_STR(resource->path));
  421. if (!stream) {
  422. - //TODO Sean-Der
  423. - //zend_list_delete(resource_id);
  424. + zend_list_delete(rsrc);
  425. }
  426. php_url_free(resource);
  427. @@ -1231,7 +1216,7 @@ PHP_FUNCTION(ssh2_scp_send)
  428. /* {{{ php_ssh2_direct_tcpip
  429. * Make a stream from a session
  430. */
  431. -static php_stream *php_ssh2_direct_tcpip(LIBSSH2_SESSION *session, int resource_id, char *host, int port)
  432. +static php_stream *php_ssh2_direct_tcpip(LIBSSH2_SESSION *session, zend_resource *rsrc, char *host, int port)
  433. {
  434. LIBSSH2_CHANNEL *channel;
  435. php_ssh2_channel_data *channel_data;
  436. @@ -1251,7 +1236,7 @@ static php_stream *php_ssh2_direct_tcpip(LIBSSH2_SESSION *session, int resource_
  437. channel_data->streamid = 0;
  438. channel_data->is_blocking = 0;
  439. channel_data->timeout = 0;
  440. - channel_data->session_rsrcid = resource_id;
  441. + channel_data->session_rsrc = rsrc;
  442. channel_data->refcount = NULL;
  443. stream = php_stream_alloc(&php_ssh2_channel_stream_ops, channel_data, 0, "r+");
  444. @@ -1270,9 +1255,9 @@ static php_stream *php_ssh2_fopen_wrapper_tunnel(php_stream_wrapper *wrapper, co
  445. php_url *resource;
  446. char *host = NULL;
  447. int port = 0;
  448. - int resource_id = 0;
  449. + zend_resource *rsrc;
  450. - resource = php_ssh2_fopen_wraper_parse_path(path, "tunnel", context, &session, &resource_id, NULL, NULL);
  451. + resource = php_ssh2_fopen_wraper_parse_path(path, "tunnel", context, &session, &rsrc, NULL, NULL);
  452. if (!resource || !session) {
  453. return NULL;
  454. }
  455. @@ -1303,15 +1288,13 @@ static php_stream *php_ssh2_fopen_wrapper_tunnel(php_stream_wrapper *wrapper, co
  456. if ((port <= 0) || (port > 65535) || !host || (strlen(host) == 0)) {
  457. /* Invalid connection criteria */
  458. php_url_free(resource);
  459. - //TODO Sean-Der
  460. - //zend_list_delete(resource_id);
  461. + zend_list_delete(rsrc);
  462. return NULL;
  463. }
  464. - stream = php_ssh2_direct_tcpip(session, resource_id, host, port);
  465. + stream = php_ssh2_direct_tcpip(session, rsrc, host, port);
  466. if (!stream) {
  467. - // TODO Sean-Der
  468. - //zend_list_delete(resource_id);
  469. + zend_list_delete(rsrc);
  470. }
  471. php_url_free(resource);
  472. @@ -1352,7 +1335,7 @@ PHP_FUNCTION(ssh2_tunnel)
  473. SSH2_FETCH_AUTHENTICATED_SESSION(session, zsession);
  474. - stream = php_ssh2_direct_tcpip(session, Z_RES_P(zsession)->handle, host, port);
  475. + stream = php_ssh2_direct_tcpip(session, Z_RES_P(zsession), host, port);
  476. if (!stream) {
  477. RETURN_FALSE;
  478. }
  479. diff --git a/ssh2_sftp.c b/ssh2_sftp.c
  480. index 6332be8..256fc70 100644
  481. --- a/ssh2_sftp.c
  482. +++ b/ssh2_sftp.c
  483. @@ -40,8 +40,7 @@ void php_ssh2_sftp_dtor(zend_resource *rsrc)
  484. libssh2_sftp_shutdown(data->sftp);
  485. - // TODO Sean-Der
  486. - //zend_list_delete(data->session_rsrcid);
  487. + zend_list_delete(data->session_rsrc);
  488. efree(data);
  489. }
  490. @@ -50,7 +49,7 @@ void php_ssh2_sftp_dtor(zend_resource *rsrc)
  491. * SFTP File Ops *
  492. ***************** */
  493. -inline unsigned long php_ssh2_parse_fopen_modes(char *openmode) {
  494. +unsigned long php_ssh2_parse_fopen_modes(char *openmode) {
  495. unsigned long flags = 0;
  496. if (strchr(openmode, 'a')) {
  497. @@ -101,7 +100,7 @@ inline int php_ssh2_sftp_attr2ssb(php_stream_statbuf *ssb, LIBSSH2_SFTP_ATTRIBUT
  498. typedef struct _php_ssh2_sftp_handle_data {
  499. LIBSSH2_SFTP_HANDLE *handle;
  500. - long sftp_rsrcid;
  501. + zend_resource *sftp_rsrc;
  502. } php_ssh2_sftp_handle_data;
  503. /* {{{ php_ssh2_sftp_stream_write
  504. @@ -139,8 +138,7 @@ static int php_ssh2_sftp_stream_close(php_stream *stream, int close_handle)
  505. php_ssh2_sftp_handle_data *data = (php_ssh2_sftp_handle_data*)stream->abstract;
  506. libssh2_sftp_close(data->handle);
  507. - //TODO Sean-Der
  508. - //zend_list_delete(data->sftp_rsrcid);
  509. + zend_list_delete(data->sftp_rsrc);
  510. efree(data);
  511. return 0;
  512. @@ -226,12 +224,12 @@ static php_stream *php_ssh2_sftp_stream_opener(php_stream_wrapper *wrapper, cons
  513. LIBSSH2_SFTP *sftp = NULL;
  514. LIBSSH2_SFTP_HANDLE *handle;
  515. php_stream *stream;
  516. - int resource_id = 0, sftp_rsrcid = 0;
  517. + zend_resource *rsrc = NULL, *sftp_rsrc = NULL;
  518. php_url *resource;
  519. unsigned long flags;
  520. long perms = 0644;
  521. - resource = php_ssh2_fopen_wraper_parse_path(filename, "sftp", context, &session, &resource_id, &sftp, &sftp_rsrcid);
  522. + resource = php_ssh2_fopen_wraper_parse_path(filename, "sftp", context, &session, &rsrc, &sftp, &sftp_rsrc);
  523. if (!resource || !session || !sftp) {
  524. return NULL;
  525. }
  526. @@ -242,20 +240,18 @@ static php_stream *php_ssh2_sftp_stream_opener(php_stream_wrapper *wrapper, cons
  527. if (!handle) {
  528. php_error_docref(NULL, E_WARNING, "Unable to open %s on remote host", filename);
  529. php_url_free(resource);
  530. - //TODO Sean-Der
  531. - //zend_list_delete(sftp_rsrcid);
  532. + zend_list_delete(sftp_rsrc);
  533. return NULL;
  534. }
  535. data = emalloc(sizeof(php_ssh2_sftp_handle_data));
  536. data->handle = handle;
  537. - data->sftp_rsrcid = sftp_rsrcid;
  538. + data->sftp_rsrc = sftp_rsrc;
  539. stream = php_stream_alloc(&php_ssh2_sftp_stream_ops, data, 0, mode);
  540. if (!stream) {
  541. libssh2_sftp_close(handle);
  542. - // TODO Sean-Der
  543. - //zend_list_delete(sftp_rsrcid);
  544. + zend_list_delete(sftp_rsrc);
  545. efree(data);
  546. }
  547. php_url_free(resource);
  548. @@ -303,8 +299,7 @@ static int php_ssh2_sftp_dirstream_close(php_stream *stream, int close_handle)
  549. php_ssh2_sftp_handle_data *data = (php_ssh2_sftp_handle_data*)stream->abstract;
  550. libssh2_sftp_close(data->handle);
  551. - //TODO Sean_der
  552. - //zend_list_delete(data->sftp_rsrcid);
  553. + zend_list_delete(data->sftp_rsrc);
  554. efree(data);
  555. return 0;
  556. @@ -333,10 +328,10 @@ static php_stream *php_ssh2_sftp_dirstream_opener(php_stream_wrapper *wrapper, c
  557. LIBSSH2_SFTP *sftp = NULL;
  558. LIBSSH2_SFTP_HANDLE *handle;
  559. php_stream *stream;
  560. - int resource_id = 0, sftp_rsrcid = 0;
  561. + zend_resource *rsrc = NULL, *sftp_rsrc = NULL;
  562. php_url *resource;
  563. - resource = php_ssh2_fopen_wraper_parse_path(filename, "sftp", context, &session, &resource_id, &sftp, &sftp_rsrcid);
  564. + resource = php_ssh2_fopen_wraper_parse_path(filename, "sftp", context, &session, &rsrc, &sftp, &sftp_rsrc);
  565. if (!resource || !session || !sftp) {
  566. return NULL;
  567. }
  568. @@ -345,20 +340,18 @@ static php_stream *php_ssh2_sftp_dirstream_opener(php_stream_wrapper *wrapper, c
  569. if (!handle) {
  570. php_error_docref(NULL, E_WARNING, "Unable to open %s on remote host", filename);
  571. php_url_free(resource);
  572. - //TODO Sean-Der
  573. - //zend_list_delete(sftp_rsrcid);
  574. + zend_list_delete(sftp_rsrc);
  575. return NULL;
  576. }
  577. data = emalloc(sizeof(php_ssh2_sftp_handle_data));
  578. data->handle = handle;
  579. - data->sftp_rsrcid = sftp_rsrcid;
  580. + data->sftp_rsrc = sftp_rsrc;
  581. stream = php_stream_alloc(&php_ssh2_sftp_dirstream_ops, data, 0, mode);
  582. if (!stream) {
  583. libssh2_sftp_close(handle);
  584. - //TODO Sean-Der
  585. - //zend_list_delete(sftp_rsrcid);
  586. + zend_list_delete(sftp_rsrc);
  587. efree(data);
  588. }
  589. php_url_free(resource);
  590. @@ -378,10 +371,10 @@ static int php_ssh2_sftp_urlstat(php_stream_wrapper *wrapper, const char *url, i
  591. LIBSSH2_SFTP_ATTRIBUTES attrs;
  592. LIBSSH2_SESSION *session = NULL;
  593. LIBSSH2_SFTP *sftp = NULL;
  594. - int resource_id = 0, sftp_rsrcid = 0;
  595. + zend_resource *rsrc = NULL, *sftp_rsrc = NULL;
  596. php_url *resource;
  597. - resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &resource_id, &sftp, &sftp_rsrcid);
  598. + resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &rsrc, &sftp, &sftp_rsrc);
  599. if (!resource || !session || !sftp || !resource->path) {
  600. return -1;
  601. }
  602. @@ -408,11 +401,11 @@ static int php_ssh2_sftp_unlink(php_stream_wrapper *wrapper, const char *url, in
  603. {
  604. LIBSSH2_SESSION *session = NULL;
  605. LIBSSH2_SFTP *sftp = NULL;
  606. - int resource_id = 0, sftp_rsrcid = 0;
  607. + zend_resource *rsrc = NULL, *sftp_rsrc = NULL;
  608. php_url *resource;
  609. int result;
  610. - resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &resource_id, &sftp, &sftp_rsrcid);
  611. + resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &rsrc, &sftp, &sftp_rsrc);
  612. if (!resource || !session || !sftp || !resource->path) {
  613. if (resource) {
  614. php_url_free(resource);
  615. @@ -436,7 +429,7 @@ static int php_ssh2_sftp_rename(php_stream_wrapper *wrapper, const char *url_fro
  616. {
  617. LIBSSH2_SESSION *session = NULL;
  618. LIBSSH2_SFTP *sftp = NULL;
  619. - int resource_id = 0, sftp_rsrcid = 0;
  620. + zend_resource *rsrc = NULL, *sftp_rsrc = NULL;
  621. php_url *resource, *resource_to;
  622. int result;
  623. @@ -453,7 +446,7 @@ static int php_ssh2_sftp_rename(php_stream_wrapper *wrapper, const char *url_fro
  624. return 0;
  625. }
  626. - resource = php_ssh2_fopen_wraper_parse_path(url_from, "sftp", context, &session, &resource_id, &sftp, &sftp_rsrcid);
  627. + resource = php_ssh2_fopen_wraper_parse_path(url_from, "sftp", context, &session, &rsrc, &sftp, &sftp_rsrc);
  628. if (!resource || !session || !sftp || !resource->path) {
  629. if (resource) {
  630. php_url_free(resource);
  631. @@ -479,11 +472,11 @@ static int php_ssh2_sftp_mkdir(php_stream_wrapper *wrapper, const char *url, int
  632. {
  633. LIBSSH2_SESSION *session = NULL;
  634. LIBSSH2_SFTP *sftp = NULL;
  635. - int resource_id = 0, sftp_rsrcid = 0;
  636. + zend_resource *rsrc = NULL, *sftp_rsrc = NULL;
  637. php_url *resource;
  638. int result;
  639. - resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &resource_id, &sftp, &sftp_rsrcid);
  640. + resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &rsrc, &sftp, &sftp_rsrc);
  641. if (!resource || !session || !sftp || !resource->path) {
  642. if (resource) {
  643. php_url_free(resource);
  644. @@ -515,11 +508,11 @@ static int php_ssh2_sftp_rmdir(php_stream_wrapper *wrapper, const char *url, int
  645. {
  646. LIBSSH2_SESSION *session = NULL;
  647. LIBSSH2_SFTP *sftp = NULL;
  648. - int resource_id = 0, sftp_rsrcid = 0;
  649. + zend_resource *rsrc = NULL, *sftp_rsrc = NULL;
  650. php_url *resource;
  651. int result;
  652. - resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &resource_id, &sftp, &sftp_rsrcid);
  653. + resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &rsrc, &sftp, &sftp_rsrc);
  654. if (!resource || !session || !sftp || !resource->path) {
  655. if (resource) {
  656. php_url_free(resource);
  657. @@ -591,7 +584,7 @@ PHP_FUNCTION(ssh2_sftp)
  658. data = emalloc(sizeof(php_ssh2_sftp_data));
  659. data->session = session;
  660. data->sftp = sftp;
  661. - data->session_rsrcid = Z_RES_P(zsession)->handle;
  662. + data->session_rsrc = Z_RES_P(zsession);
  663. Z_ADDREF_P(zsession);
  664. RETURN_RES(zend_register_resource(data, le_ssh2_sftp));