1 --- PHP_5_3/ext/standard/ftp_fopen_wrapper.c 2011/02/27 20:10:08 308733
2 +++ PHP_5_3/ext/standard/ftp_fopen_wrapper.c 2011/02/27 20:23:54 308734
4 #define FTPS_ENCRYPT_DATA 1
5 #define GET_FTP_RESULT(stream) get_ftp_result((stream), tmp_line, sizeof(tmp_line) TSRMLS_CC)
7 +typedef struct _php_ftp_dirstream_data {
8 + php_stream *datastream;
9 + php_stream *controlstream;
10 + php_stream *dirstream;
11 +} php_ftp_dirstream_data;
15 static inline int get_ftp_result(php_stream *stream, char *buffer, size_t buffer_size TSRMLS_DC)
18 static int php_stream_ftp_stream_close(php_stream_wrapper *wrapper, php_stream *stream TSRMLS_DC)
20 - php_stream *controlstream = (php_stream *)stream->wrapperdata;
21 + php_stream *controlstream = stream->wrapperthis;
28 /* For write modes close data stream first to signal EOF to server */
29 - stream->wrapperdata = NULL;
30 - php_stream_close(stream);
33 result = GET_FTP_RESULT(controlstream);
34 if (result != 226 && result != 250) {
35 php_error_docref(NULL TSRMLS_CC, E_WARNING, "FTP server error %d:%s", result, tmp_line);
38 php_stream_write_string(controlstream, "QUIT\r\n");
39 php_stream_close(controlstream);
41 - stream->wrapperdata = NULL;
43 + stream->wrapperthis = NULL;
50 /* remember control stream */
51 - datastream->wrapperdata = (zval *)stream;
52 + datastream->wrapperthis = stream;
54 php_url_free(resource);
57 static size_t php_ftp_dirstream_read(php_stream *stream, char *buf, size_t count TSRMLS_DC)
59 php_stream_dirent *ent = (php_stream_dirent *)buf;
60 - php_stream *innerstream = (php_stream *)stream->abstract;
61 + php_stream *innerstream;
66 + innerstream = ((php_ftp_dirstream_data *)stream->abstract)->datastream;
68 if (count != sizeof(php_stream_dirent)) {
73 static int php_ftp_dirstream_close(php_stream *stream, int close_handle TSRMLS_DC)
75 - php_stream *innerstream = (php_stream *)stream->abstract;
76 + php_ftp_dirstream_data *data = stream->abstract;
78 - if (innerstream->wrapperdata) {
79 - php_stream_close((php_stream *)innerstream->wrapperdata);
80 - innerstream->wrapperdata = NULL;
82 - php_stream_close((php_stream *)stream->abstract);
83 + /* close control connection */
84 + if (data->controlstream) {
85 + php_stream_close(data->controlstream);
86 + data->controlstream = NULL;
88 + /* close data connection */
89 + php_stream_close(data->datastream);
90 + data->datastream = NULL;
93 stream->abstract = NULL;
97 php_stream * php_stream_ftp_opendir(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC)
99 php_stream *stream, *reuseid, *datastream = NULL;
100 + php_ftp_dirstream_data *dirsdata;
101 php_url *resource = NULL;
102 int result = 0, use_ssl, use_ssl_on_data = 0;
103 char *hoststart = NULL, tmp_line[512];
104 @@ -747,11 +755,14 @@
105 goto opendir_errexit;
108 - /* remember control stream */
109 - datastream->wrapperdata = (zval *)stream;
111 php_url_free(resource);
112 - return php_stream_alloc(&php_ftp_dirstream_ops, datastream, 0, mode);
114 + dirsdata = emalloc(sizeof *dirsdata);
115 + dirsdata->datastream = datastream;
116 + dirsdata->controlstream = stream;
117 + dirsdata->dirstream = php_stream_alloc(&php_ftp_dirstream_ops, dirsdata, 0, mode);
119 + return dirsdata->dirstream;