summaryrefslogtreecommitdiff
path: root/ext/ftp/php_ftp.c
diff options
context:
space:
mode:
authorMarkus Fischer <mfischer@php.net>2002-01-02 14:58:17 +0000
committerMarkus Fischer <mfischer@php.net>2002-01-02 14:58:17 +0000
commit9bde60d1487f9108ab6bd2595c12afe542082782 (patch)
treea1bdf03bb71fc582d7fdb4d2c0dac24f9b7b7309 /ext/ftp/php_ftp.c
parent8e6a16984a29c16acefbe1af7f6b2d7b2cf2d1ed (diff)
downloadphp-git-9bde60d1487f9108ab6bd2595c12afe542082782.tar.gz
- Added ftp_set_option(), ftp_get_option() and support for setting a
custom timeout. # Adding custom buffer size would be next, no promises though.
Diffstat (limited to 'ext/ftp/php_ftp.c')
-rw-r--r--ext/ftp/php_ftp.c127
1 files changed, 115 insertions, 12 deletions
diff --git a/ext/ftp/php_ftp.c b/ext/ftp/php_ftp.c
index c69c290142..80f8790f38 100644
--- a/ext/ftp/php_ftp.c
+++ b/ext/ftp/php_ftp.c
@@ -58,6 +58,8 @@ function_entry php_ftp_functions[] = {
PHP_FE(ftp_delete, NULL)
PHP_FE(ftp_site, NULL)
PHP_FE(ftp_close, NULL)
+ PHP_FE(ftp_set_option, NULL)
+ PHP_FE(ftp_get_option, NULL)
PHP_FALIAS(ftp_quit, ftp_close, NULL)
{NULL, NULL, NULL}
};
@@ -88,15 +90,12 @@ static void ftp_destructor_ftpbuf(zend_rsrc_list_entry *rsrc TSRMLS_DC)
PHP_MINIT_FUNCTION(ftp)
{
- le_ftpbuf = zend_register_list_destructors_ex(ftp_destructor_ftpbuf, NULL, "ftp", module_number);
- REGISTER_LONG_CONSTANT("FTP_ASCII", FTPTYPE_ASCII,
- CONST_PERSISTENT | CONST_CS);
- REGISTER_LONG_CONSTANT("FTP_BINARY", FTPTYPE_IMAGE,
- CONST_PERSISTENT | CONST_CS);
- REGISTER_LONG_CONSTANT("FTP_IMAGE", FTPTYPE_IMAGE,
- CONST_PERSISTENT | CONST_CS);
- REGISTER_LONG_CONSTANT("FTP_TEXT", FTPTYPE_ASCII,
- CONST_PERSISTENT | CONST_CS);
+ le_ftpbuf = zend_register_list_destructors_ex(ftp_destructor_ftpbuf, NULL, le_ftpbuf_name, module_number);
+ REGISTER_LONG_CONSTANT("FTP_ASCII", FTPTYPE_ASCII, CONST_PERSISTENT | CONST_CS);
+ REGISTER_LONG_CONSTANT("FTP_TEXT", FTPTYPE_ASCII, CONST_PERSISTENT | CONST_CS);
+ REGISTER_LONG_CONSTANT("FTP_BINARY", FTPTYPE_IMAGE, CONST_PERSISTENT | CONST_CS);
+ REGISTER_LONG_CONSTANT("FTP_IMAGE", FTPTYPE_IMAGE, CONST_PERSISTENT | CONST_CS);
+ REGISTER_LONG_CONSTANT("FTP_TIMEOUT_SEC", PHP_FTP_OPT_TIMEOUT_SEC, CONST_PERSISTENT | CONST_CS);
return SUCCESS;
}
@@ -123,14 +122,21 @@ PHP_FUNCTION(ftp_connect)
{
ftpbuf_t *ftp;
char *host;
- int host_len, port = 21;
+ int host_len, port = 0;
+ long timeout_sec = FTP_DEFAULT_TIMEOUT;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &host, &host_len, &port) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ll", &host, &host_len, &port, &timeout_sec) == FAILURE) {
return;
}
+ if (timeout_sec <= 0) {
+ php_error(E_WARNING, "%s(): timeout has to be greater than 0",
+ get_active_function_name(TSRMLS_C));
+ RETURN_FALSE;
+ }
+
/* connect */
- ftp = ftp_open(host, htons((short)port));
+ ftp = ftp_open(host, htons((short)port), timeout_sec);
if (ftp == NULL) {
RETURN_FALSE;
}
@@ -701,6 +707,103 @@ PHP_FUNCTION(ftp_close)
zend_list_delete(Z_LVAL_P(z_ftp));
}
/* }}} */
+
+/* Temporarely copied over from zend_API.c until it gets exposed */
+static char *ze_zval_type_name(zval *arg)
+{
+ switch (Z_TYPE_P(arg)) {
+ case IS_NULL:
+ return "null";
+
+ case IS_LONG:
+ return "integer";
+
+ case IS_DOUBLE:
+ return "double";
+
+ case IS_STRING:
+ return "string";
+
+ case IS_ARRAY:
+ return "array";
+
+ case IS_OBJECT:
+ return "object";
+
+ case IS_BOOL:
+ return "boolean";
+
+ case IS_RESOURCE:
+ return "resource";
+
+ default:
+ return "unknown";
+ }
+}
+
+
+/* {{{ proto bool ftp_set_option(resource stream, int option, mixed value)
+ Sets an FTP option. */
+PHP_FUNCTION(ftp_set_option)
+{
+ zval *z_ftp, *z_value;
+ long option;
+ ftpbuf_t *ftp;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlz", &z_ftp, &option, &z_value) == FAILURE) {
+ return;
+ }
+
+ ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf);
+
+ switch (option) {
+ case PHP_FTP_OPT_TIMEOUT_SEC:
+ if (Z_TYPE_P(z_value) != IS_LONG) {
+ php_error(E_WARNING, "%s(): option TIMEOUT_SEC expects value of type long, %s given",
+ get_active_function_name(TSRMLS_C), ze_zval_type_name(z_value));
+ RETURN_FALSE;
+ }
+ if (Z_LVAL_P(z_value) <= 0) {
+ php_error(E_WARNING, "%s(): timeout has to be greater than 0",
+ get_active_function_name(TSRMLS_C));
+ RETURN_FALSE;
+ }
+ ftp->timeout_sec = Z_LVAL_P(z_value);
+ RETURN_TRUE;
+ break;
+ default:
+ php_error(E_WARNING, "%s(): unknown option '%d'", get_active_function_name(TSRMLS_C), option);
+ RETURN_FALSE;
+ break;
+ }
+}
+/* }}} */
+
+/* {{{ proto mixed ftp_get_option(resource stream, int option)
+ Gets an FTP option. */
+PHP_FUNCTION(ftp_get_option)
+{
+ zval *z_ftp;
+ long option;
+ ftpbuf_t *ftp;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &z_ftp, &option) == FAILURE) {
+ return;
+ }
+
+ ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf);
+
+ switch (option) {
+ case PHP_FTP_OPT_TIMEOUT_SEC:
+ RETURN_LONG(ftp->timeout_sec);
+ break;
+ default:
+ php_error(E_WARNING, "%s(): unknown option '%d'", get_active_function_name(TSRMLS_C), option);
+ RETURN_FALSE;
+ break;
+ }
+}
+/* }}} */
#endif /* HAVE_FTP */