The attached diff adds 2 ftp functions. I read the README.SUBMITTING_PATCH and went thru all the steps, but there are no tests for ftp, and I didn't understand how to update the docs. So if someone would like to help me with that, great.
Basically, I modifed ftpbuf_t adding a 2 dimensional array (array of strings) to store the conversation, and an int that indicates the next element in first dimension the array. I modified ftp_putcmd and ftp_getresp to add what gets sent/recvd in the conversation. And lastly I added ftp_get_resp which returns the 3 digit return code from the server of the last command sent, and ftp_get_conv (which I would not be opposed to changing the name of, that's just what I came up with) that returns the ftp conversation as an array. Both functions must be called before ftp_close (or ftp_quit) because it frees the resource. The array I defined is 2500x4096. 4096 was already there as the FTP_BUFSIZE, 2500 maybe a little excesive but in my environment it could get that bad. :/ So I was thinking that maybe I should add a optional flag on ftp_connect on where or not to trace the conversation? Thoughts? Jess
Index: ext/ftp/ftp.c =================================================================== RCS file: /repository/php-src/ext/ftp/ftp.c,v retrieving revision 1.106 diff -u -r1.106 ftp.c --- ext/ftp/ftp.c 5 Oct 2004 23:53:09 -0000 1.106 +++ ext/ftp/ftp.c 16 Dec 2004 04:13:02 -0000 @@ -1125,6 +1125,16 @@ size = sprintf(ftp->outbuf, "%s\r\n", cmd); } + /* write command to convbuff[] */ + if(ftp->convcntr < FTP_CONV_BUFSIZE){ + if(strcmp(cmd,"PASS") != 0){ + sprintf(ftp->convbuf[ftp->convcntr], "---> %s", ftp->outbuf); + } else { + sprintf(ftp->convbuf[ftp->convcntr], "---> PASS XXXXXXXX"); + } + } + ftp->convcntr++; + data = ftp->outbuf; if (my_send(ftp, ftp->fd, data, size) != size) { @@ -1205,6 +1215,13 @@ return 0; } + /* copy contents of inbuf to convbuff[] */ + if(ftp->convcntr < FTP_CONV_BUFSIZE){ + memcpy(ftp->convbuf[ftp->convcntr], ftp->inbuf, FTP_BUFSIZE); + ftp->convcntr++; + } + + /* Break out when the end-tag is found */ if (isdigit(ftp->inbuf[0]) && isdigit(ftp->inbuf[1]) && isdigit(ftp->inbuf[2]) && ftp->inbuf[3] == ' ') { break; Index: ext/ftp/ftp.h =================================================================== RCS file: /repository/php-src/ext/ftp/ftp.h,v retrieving revision 1.42 diff -u -r1.42 ftp.h --- ext/ftp/ftp.h 8 Jan 2004 17:32:08 -0000 1.42 +++ ext/ftp/ftp.h 16 Dec 2004 04:13:02 -0000 @@ -37,6 +37,7 @@ /* XXX this should be configurable at runtime XXX */ #define FTP_BUFSIZE 4096 +#define FTP_CONV_BUFSIZE 2500 typedef enum ftptype { FTPTYPE_ASCII, @@ -84,6 +85,9 @@ int old_ssl; /* old mode = forced data encryption */ SSL *ssl_handle; /* handle for control connection */ int ssl_active; /* ssl active on control conn */ + char convbuf[FTP_CONV_BUFSIZE][FTP_BUFSIZE]; /* complete conversation */ + int convcntr; /* position of next element in convbuf */ + #endif } ftpbuf_t; Index: ext/ftp/php_ftp.c =================================================================== RCS file: /repository/php-src/ext/ftp/php_ftp.c,v retrieving revision 1.101 diff -u -r1.101 php_ftp.c --- ext/ftp/php_ftp.c 27 Sep 2004 14:25:13 -0000 1.101 +++ ext/ftp/php_ftp.c 16 Dec 2004 04:13:02 -0000 @@ -87,6 +87,8 @@ PHP_FE(ftp_nb_continue, NULL) PHP_FE(ftp_nb_put, NULL) PHP_FE(ftp_nb_fput, NULL) + PHP_FE(ftp_get_resp, NULL) + PHP_FE(ftp_get_conv, NULL) PHP_FALIAS(ftp_quit, ftp_close, NULL) {NULL, NULL, NULL} }; @@ -1236,6 +1238,49 @@ } /* }}} */ +/* {{{ proto string ftp_get_resp(resource stream) + * Returns the response code of last command */ +PHP_FUNCTION(ftp_get_resp) +{ + zval *z_ftp; + ftpbuf_t *ftp; + int resp; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_ftp) == FAILURE) { + return; + } + + ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); + if (0 == (resp = ftp_get_lastresp(ftp))) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); + RETURN_FALSE; + } + RETURN_LONG(resp); +} +/* }}} */ + +/* {{{ proto array ftp_get_conv(resource stream) + * Returns an array containing the entire FTP conversation */ +PHP_FUNCTION(ftp_get_conv) +{ + zval *z_ftp; + ftpbuf_t *ftp; + char *ptr1, **ptr2; + zend_bool recursive = 0; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_ftp) == FAILURE) { + return; + } + + ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); + + array_init(return_value); + for (ptr1 = (char*)ftp->convbuf; **ptr2; ptr1 += FTP_BUFSIZE) { + *ptr2 = ptr1; + add_next_index_string(return_value, *ptr2, 1); + } +} +/* }}} */ + #endif /* HAVE_FTP */ /* Index: ext/ftp/php_ftp.h =================================================================== RCS file: /repository/php-src/ext/ftp/php_ftp.h,v retrieving revision 1.28 diff -u -r1.28 php_ftp.h --- ext/ftp/php_ftp.h 8 Jan 2004 17:32:08 -0000 1.28 +++ ext/ftp/php_ftp.h 16 Dec 2004 04:13:02 -0000 @@ -69,6 +69,8 @@ PHP_FUNCTION(ftp_nb_put); PHP_FUNCTION(ftp_nb_fput); PHP_FUNCTION(ftp_nb_continue); +PHP_FUNCTION(ftp_get_resp); +PHP_FUNCTION(ftp_get_conv); #define phpext_ftp_ptr php_ftp_module_ptr
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php