diff options
Diffstat (limited to 'ext/ftp')
-rw-r--r-- | ext/ftp/CREDITS | 2 | ||||
-rw-r--r-- | ext/ftp/config.m4 | 11 | ||||
-rw-r--r-- | ext/ftp/ftp.c | 1914 | ||||
-rw-r--r-- | ext/ftp/ftp.h | 206 | ||||
-rw-r--r-- | ext/ftp/php_ftp.c | 1214 | ||||
-rw-r--r-- | ext/ftp/php_ftp.h | 78 |
6 files changed, 0 insertions, 3425 deletions
diff --git a/ext/ftp/CREDITS b/ext/ftp/CREDITS deleted file mode 100644 index bf0920ad80..0000000000 --- a/ext/ftp/CREDITS +++ /dev/null @@ -1,2 +0,0 @@ -FTP -Stefan Esser, Andrew Skalski diff --git a/ext/ftp/config.m4 b/ext/ftp/config.m4 deleted file mode 100644 index 3b5f3fd641..0000000000 --- a/ext/ftp/config.m4 +++ /dev/null @@ -1,11 +0,0 @@ -dnl -dnl $Id$ -dnl - -PHP_ARG_ENABLE(ftp,whether to enable FTP support, -[ --enable-ftp Enable FTP support]) - -if test "$PHP_FTP" = "yes"; then - AC_DEFINE(HAVE_FTP,1,[Whether you want FTP support]) - PHP_NEW_EXTENSION(ftp, php_ftp.c ftp.c, $ext_shared) -fi diff --git a/ext/ftp/ftp.c b/ext/ftp/ftp.c deleted file mode 100644 index fa184aa4a3..0000000000 --- a/ext/ftp/ftp.c +++ /dev/null @@ -1,1914 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP Version 4 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2003 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 2.02 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.php.net/license/2_02.txt. | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andrew Skalski <askalski@chek.com> | - | Stefan Esser <sesser@php.net> (resume functions) | - +----------------------------------------------------------------------+ - */ - -/* $Id$ */ - -#include "php.h" - -#if HAVE_FTP - -#include <stdio.h> -#include <ctype.h> -#include <stdlib.h> -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -#include <fcntl.h> -#include <string.h> -#include <time.h> -#ifdef PHP_WIN32 -#include <winsock2.h> -#elif defined(NETWARE) -#ifdef USE_WINSOCK /* Modified to use Winsock (NOVSOCK2.H), atleast for now */ -#include <novsock2.h> -#else -#ifdef NEW_LIBC -#include <sys/socket.h> -#include <netinet/in.h> -#include <netdb.h> -#else -#include <sys/socket.h> -#endif -#endif -#else -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <netdb.h> -#endif -#include <errno.h> - -#if HAVE_SYS_TIME_H -#include <sys/time.h> -#endif - -#ifdef HAVE_SYS_SELECT_H -#include <sys/select.h> -#endif - -#if HAVE_OPENSSL_EXT -#include <openssl/ssl.h> -#endif - -#include "ftp.h" -#include "ext/standard/fsock.h" - -/* Additional headers for NetWare */ -#if defined(NETWARE) && defined(NEW_LIBC) && !defined(USE_WINSOCK) -#include <sys/select.h> -#endif - -/* sends an ftp command, returns true on success, false on error. - * it sends the string "cmd args\r\n" if args is non-null, or - * "cmd\r\n" if args is null - */ -static int ftp_putcmd( ftpbuf_t *ftp, - const char *cmd, - const char *args); - -/* wrapper around send/recv to handle timeouts */ -static int my_send(ftpbuf_t *ftp, php_socket_t s, void *buf, size_t len); -static int my_recv(ftpbuf_t *ftp, php_socket_t s, void *buf, size_t len); -static int my_accept(ftpbuf_t *ftp, php_socket_t s, struct sockaddr *addr, socklen_t *addrlen); - -/* reads a line the socket , returns true on success, false on error */ -static int ftp_readline(ftpbuf_t *ftp); - -/* reads an ftp response, returns true on success, false on error */ -static int ftp_getresp(ftpbuf_t *ftp); - -/* sets the ftp transfer type */ -static int ftp_type(ftpbuf_t *ftp, ftptype_t type); - -/* opens up a data stream */ -static databuf_t* ftp_getdata(ftpbuf_t *ftp TSRMLS_DC); - -/* accepts the data connection, returns updated data buffer */ -static databuf_t* data_accept(databuf_t *data, ftpbuf_t *ftp TSRMLS_DC); - -/* closes the data connection, returns NULL */ -static databuf_t* data_close(ftpbuf_t *ftp, databuf_t *data); - -/* generic file lister */ -static char** ftp_genlist(ftpbuf_t *ftp, const char *cmd, const char *path TSRMLS_DC); - -/* IP and port conversion box */ -union ipbox { - unsigned long l[2]; - unsigned short s[4]; - unsigned char c[8]; -}; - -/* {{{ ftp_open - */ -ftpbuf_t* -ftp_open(const char *host, short port, long timeout_sec TSRMLS_DC) -{ - ftpbuf_t *ftp; - socklen_t size; - struct timeval tv; - - - /* alloc the ftp structure */ - ftp = ecalloc(1, sizeof(*ftp)); - - tv.tv_sec = timeout_sec; - tv.tv_usec = 0; - - ftp->fd = php_network_connect_socket_to_host(host, - (unsigned short) (port ? port : 21), SOCK_STREAM, - 0, &tv, NULL, NULL TSRMLS_CC); - if (ftp->fd == -1) { - goto bail; - } - - /* Default Settings */ - ftp->timeout_sec = timeout_sec; - ftp->nb = 0; - - size = sizeof(ftp->localaddr); - memset(&ftp->localaddr, 0, size); - if (getsockname(ftp->fd, (struct sockaddr*) &ftp->localaddr, &size) == -1) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "getsockname failed: %s (%d)\n", strerror(errno), errno); - goto bail; - } - - if (!ftp_getresp(ftp) || ftp->resp != 220) { - goto bail; - } - - return ftp; - -bail: - if (ftp->fd != -1) { - closesocket(ftp->fd); - } - efree(ftp); - return NULL; -} -/* }}} */ - -/* {{{ ftp_close - */ -ftpbuf_t* -ftp_close(ftpbuf_t *ftp) -{ - if (ftp == NULL) { - return NULL; - } - if (ftp->data) { - data_close(ftp, ftp->data); - } - if (ftp->fd != -1) { -#if HAVE_OPENSSL_EXT - if (ftp->ssl_active) { - SSL_shutdown(ftp->ssl_handle); - } -#endif - closesocket(ftp->fd); - } - ftp_gc(ftp); - efree(ftp); - return NULL; -} -/* }}} */ - -/* {{{ ftp_gc - */ -void -ftp_gc(ftpbuf_t *ftp) -{ - if (ftp == NULL) { - return; - } - if (ftp->pwd) { - efree(ftp->pwd); - } - if (ftp->syst) { - efree(ftp->syst); - } -} -/* }}} */ - -/* {{{ ftp_quit - */ -int -ftp_quit(ftpbuf_t *ftp) -{ - if (ftp == NULL) { - return 0; - } - - if (!ftp_putcmd(ftp, "QUIT", NULL)) { - return 0; - } - if (!ftp_getresp(ftp) || ftp->resp != 221) { - return 0; - } - - if (ftp->pwd) { - efree(ftp->pwd); - } - - return 1; -} -/* }}} */ - -/* {{{ ftp_login - */ -int -ftp_login(ftpbuf_t *ftp, const char *user, const char *pass TSRMLS_DC) -{ -#if HAVE_OPENSSL_EXT - SSL_CTX *ctx = NULL; -#endif - if (ftp == NULL) { - return 0; - } - -#if HAVE_OPENSSL_EXT - if (ftp->use_ssl && !ftp->ssl_active) { - if (!ftp_putcmd(ftp, "AUTH", "TLS")) { - return 0; - } - if (!ftp_getresp(ftp)) { - return 0; - } - - if (ftp->resp != 234) { - if (!ftp_putcmd(ftp, "AUTH", "SSL")) { - return 0; - } - if (!ftp_getresp(ftp)) { - return 0; - } - - if (ftp->resp != 334) { - ftp->use_ssl = 0; - } else { - ftp->old_ssl = 1; - ftp->use_ssl_for_data = 1; - } - } - - /* now enable ssl if we still need to */ - if (ftp->use_ssl) { - ctx = SSL_CTX_new(SSLv23_client_method()); - if (ctx == NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "failed to create the SSL context"); - return 0; - } - - ftp->ssl_handle = SSL_new(ctx); - if (ftp->ssl_handle == NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "failed to create the SSL handle"); - SSL_CTX_free(ctx); - return 0; - } - - SSL_set_fd(ftp->ssl_handle, ftp->fd); - - if (SSL_connect(ftp->ssl_handle) <= 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "SSL/TLS handshake failed"); - SSL_shutdown(ftp->ssl_handle); - return 0; - } - - ftp->ssl_active = 1; - - if (!ftp->old_ssl) { - - /* set protection buffersize to zero */ - if (!ftp_putcmd(ftp, "PBSZ", "0")) { - return 0; - } - if (!ftp_getresp(ftp)) { - return 0; - } - - /* enable data conn encryption */ - if (!ftp_putcmd(ftp, "PROT", "P")) { - return 0; - } - if (!ftp_getresp(ftp)) { - return 0; - } - - ftp->use_ssl_for_data = (ftp->resp >= 200 && ftp->resp <=299); - } - } - } -#endif - - if (!ftp_putcmd(ftp, "USER", user)) { - return 0; - } - if (!ftp_getresp(ftp)) { - return 0; - } - if (ftp->resp == 230) { - return 1; - } - if (ftp->resp != 331) { - return 0; - } - if (!ftp_putcmd(ftp, "PASS", pass)) { - return 0; - } - if (!ftp_getresp(ftp)) { - return 0; - } - return (ftp->resp == 230); -} -/* }}} */ - -/* {{{ ftp_reinit - */ -int -ftp_reinit(ftpbuf_t *ftp) -{ - if (ftp == NULL) { - return 0; - } - - ftp_gc(ftp); - - ftp->nb = 0; - - if (!ftp_putcmd(ftp, "REIN", NULL)) { - return 0; - } - if (!ftp_getresp(ftp) || ftp->resp != 220) { - return 0; - } - - return 1; -} -/* }}} */ - -/* {{{ ftp_syst - */ -const char* -ftp_syst(ftpbuf_t *ftp) -{ - char *syst, *end; - - if (ftp == NULL) { - return NULL; - } - - /* default to cached value */ - if (ftp->syst) { - return ftp->syst; - } - if (!ftp_putcmd(ftp, "SYST", NULL)) { - return NULL; - } - if (!ftp_getresp(ftp) || ftp->resp != 215) { - return NULL; - } - syst = ftp->inbuf; - if ((end = strchr(syst, ' '))) { - *end = 0; - } - ftp->syst = estrdup(syst); - if (end) { - *end = ' '; - } - return ftp->syst; -} -/* }}} */ - -/* {{{ ftp_pwd - */ -const char* -ftp_pwd(ftpbuf_t *ftp) -{ - char *pwd, *end; - - if (ftp == NULL) { - return NULL; - } - - /* default to cached value */ - if (ftp->pwd) { - return ftp->pwd; - } - if (!ftp_putcmd(ftp, "PWD", NULL)) { - return NULL; - } - if (!ftp_getresp(ftp) || ftp->resp != 257) { - return NULL; - } - /* copy out the pwd from response */ - if ((pwd = strchr(ftp->inbuf, '"')) == NULL) { - return NULL; - } - if ((end = strrchr(++pwd, '"')) == NULL) { - return NULL; - } - *end = 0; - ftp->pwd = estrdup(pwd); - *end = '"'; - - return ftp->pwd; -} -/* }}} */ - -/* {{{ ftp_exec - */ -int -ftp_exec(ftpbuf_t *ftp, const char *cmd) -{ - if (ftp == NULL) { - return 0; - } - if (!ftp_putcmd(ftp, "SITE EXEC", cmd)) { - return 0; - } - if (!ftp_getresp(ftp) || ftp->resp != 200) { - return 0; - } - - return 1; -} -/* }}} */ - -/* {{{ ftp_raw - */ -void -ftp_raw(ftpbuf_t *ftp, const char *cmd, zval *return_value) -{ - if (ftp == NULL || cmd == NULL) { - RETURN_NULL(); - } - if (!ftp_putcmd(ftp, cmd, NULL)) { - RETURN_NULL(); - } - array_init(return_value); - while (ftp_readline(ftp)) { - add_next_index_string(return_value, ftp->inbuf, 1); - if (isdigit(ftp->inbuf[0]) && isdigit(ftp->inbuf[1]) && isdigit(ftp->inbuf[2]) && ftp->inbuf[3] == ' ') { - return; - } - } -} -/* }}} */ - -/* {{{ ftp_chdir - */ -int -ftp_chdir(ftpbuf_t *ftp, const char *dir) -{ - if (ftp == NULL) { - return 0; - } - - if (ftp->pwd) { - efree(ftp->pwd); - } - - if (!ftp_putcmd(ftp, "CWD", dir)) { - return 0; - } - if (!ftp_getresp(ftp) || ftp->resp != 250) { - return 0; - } - return 1; -} -/* }}} */ - -/* {{{ ftp_cdup - */ -int -ftp_cdup(ftpbuf_t *ftp) -{ - if (ftp == NULL) { - return 0; - } - - if (ftp->pwd) { - efree(ftp->pwd); - } - - if (!ftp_putcmd(ftp, "CDUP", NULL)) { - return 0; - } - if (!ftp_getresp(ftp) || ftp->resp != 250) { - return 0; - } - return 1; -} -/* }}} */ - -/* {{{ ftp_mkdir - */ -char* -ftp_mkdir(ftpbuf_t *ftp, const char *dir) -{ - char *mkd, *end; - - if (ftp == NULL) { - return NULL; - } - if (!ftp_putcmd(ftp, "MKD", dir)) { - return NULL; - } - if (!ftp_getresp(ftp) || ftp->resp != 257) { - return NULL; - } - /* copy out the dir from response */ - if ((mkd = strchr(ftp->inbuf, '"')) == NULL) { - mkd = estrdup(dir); - return mkd; - } - if ((end = strrchr(++mkd, '"')) == NULL) { - return NULL; - } - *end = 0; - mkd = estrdup(mkd); - *end = '"'; - - return mkd; -} -/* }}} */ - -/* {{{ ftp_rmdir - */ -int -ftp_rmdir(ftpbuf_t *ftp, const char *dir) -{ - if (ftp == NULL) { - return 0; - } - if (!ftp_putcmd(ftp, "RMD", dir)) { - return 0; - } - if (!ftp_getresp(ftp) || ftp->resp != 250) { - return 0; - } - return 1; -} -/* }}} */ - -/* {{{ ftp_chmod - */ -int -ftp_chmod(ftpbuf_t *ftp, const int mode, const char *filename, const int filename_len) -{ - char *buffer; - - if (ftp == NULL || filename_len <= 0) { - return 0; - } - - if (!(buffer = emalloc(32 + filename_len + 1))) { - return 0; - } - - sprintf(buffer, "CHMOD %o %s", mode, filename); - - if (!ftp_putcmd(ftp, "SITE", buffer)) { - efree(buffer); - return 0; - } - - efree(buffer); - - if (!ftp_getresp(ftp) || ftp->resp != 200) { - return 0; - } - - return 1; -} -/* }}} */ - - -/* {{{ ftp_nlist - */ -char** -ftp_nlist(ftpbuf_t *ftp, const char *path TSRMLS_DC) -{ - return ftp_genlist(ftp, "NLST", path TSRMLS_CC); -} -/* }}} */ - -/* {{{ ftp_list - */ -char** -ftp_list(ftpbuf_t *ftp, const char *path, int recursive TSRMLS_DC) -{ - return ftp_genlist(ftp, ((recursive) ? "LIST -R" : "LIST"), path TSRMLS_CC); -} -/* }}} */ - -/* {{{ ftp_type - */ -int -ftp_type(ftpbuf_t *ftp, ftptype_t type) -{ - char typechar[2] = "?"; - - if (ftp == NULL) { - return 0; - } - if (type == ftp->type) { - return 1; - } - if (type == FTPTYPE_ASCII) { - typechar[0] = 'A'; - } else if (type == FTPTYPE_IMAGE) { - typechar[0] = 'I'; - } else { - return 0; - } - if (!ftp_putcmd(ftp, "TYPE", typechar)) { - return 0; - } - if (!ftp_getresp(ftp) || ftp->resp != 200) { - return 0; - } - ftp->type = type; - - return 1; -} -/* }}} */ - -/* {{{ ftp_pasv - */ -int -ftp_pasv(ftpbuf_t *ftp, int pasv) -{ - char *ptr; - union ipbox ipbox; - unsigned long b[6]; - socklen_t n; - struct sockaddr *sa; - struct sockaddr_in *sin; - - if (ftp == NULL) { - return 0; - } - if (pasv && ftp->pasv == 2) { - return 1; - } - ftp->pasv = 0; - if (!pasv) { - return 1; - } - n = sizeof(ftp->pasvaddr); - memset(&ftp->pasvaddr, 0, n); - sa = (struct sockaddr *) &ftp->pasvaddr; - -#ifdef HAVE_IPV6 - if (getpeername(ftp->fd, sa, &n) < 0) { - return 0; - } - if (sa->sa_family == AF_INET6) { - struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa; - char *endptr, delimiter; - - /* try EPSV first */ - if (!ftp_putcmd(ftp, "EPSV", NULL)) { - return 0; - } - if (!ftp_getresp(ftp)) { - return 0; - } - if (ftp->resp == 229) { - /* parse out the port */ - for (ptr = ftp->inbuf; *ptr && *ptr != '('; ptr++); - if (!*ptr) { - return 0; - } - delimiter = *++ptr; - for (n = 0; *ptr && n < 3; ptr++) { - if (*ptr == delimiter) { - n++; - } - } - - sin6->sin6_port = htons((unsigned short) strtoul(ptr, &endptr, 10)); - if (ptr == endptr || *endptr != delimiter) { - return 0; - } - ftp->pasv = 2; - return 1; - } - } - - /* fall back to PASV */ -#endif - - if (!ftp_putcmd(ftp, "PASV", NULL)) { - return 0; - } - if (!ftp_getresp(ftp) || ftp->resp != 227) { - return 0; - } - /* parse out the IP and port */ - for (ptr = ftp->inbuf; *ptr && !isdigit(*ptr); ptr++); - n = sscanf(ptr, "%lu,%lu,%lu,%lu,%lu,%lu", &b[0], &b[1], &b[2], &b[3], &b[4], &b[5]); - if (n != 6) { - return 0; - } - for (n = 0; n < 6; n++) { - ipbox.c[n] = (unsigned char) b[n]; - } - sin = (struct sockaddr_in *) sa; - sin->sin_family = AF_INET; - sin->sin_addr.s_addr = ipbox.l[0]; - sin->sin_port = ipbox.s[2]; - - ftp->pasv = 2; - - return 1; -} -/* }}} */ - -/* {{{ ftp_get - */ -int -ftp_get(ftpbuf_t *ftp, php_stream *outstream, const char *path, ftptype_t type, int resumepos TSRMLS_DC) -{ - databuf_t *data = NULL; - char *ptr; - int lastch; - size_t rcvd; - char arg[11]; - - if (ftp == NULL) { - return 0; - } - if (!ftp_type(ftp, type)) { - goto bail; - } - - if ((data = ftp_getdata(ftp TSRMLS_CC)) == NULL) { - goto bail; - } - - ftp->data = data; - - if (resumepos > 0) { - if (resumepos > 2147483647) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "PHP cannot handle files greater then 2147483647 bytes.\n"); - goto bail; - } - sprintf(arg, "%u", resumepos); - if (!ftp_putcmd(ftp, "REST", arg)) { - goto bail; - } - if (!ftp_getresp(ftp) || (ftp->resp != 350)) { - goto bail; - } - } - - if (!ftp_putcmd(ftp, "RETR", path)) { - goto bail; - } - if (!ftp_getresp(ftp) || (ftp->resp != 150 && ftp->resp != 125)) { - goto bail; - } - - if ((data = data_accept(data, ftp TSRMLS_CC)) == NULL) { - goto bail; - } - - lastch = 0; - while ((rcvd = my_recv(ftp, data->fd, data->buf, FTP_BUFSIZE))) { - if (rcvd == -1) { - goto bail; - } - - if (type == FTPTYPE_ASCII) { - for (ptr = data->buf; rcvd; rcvd--, ptr++) { - if (lastch == '\r' && *ptr != '\n') - php_stream_putc(outstream, '\r'); - if (*ptr != '\r') - php_stream_putc(outstream, *ptr); - lastch = *ptr; - } - } else if (rcvd != php_stream_write(outstream, data->buf, rcvd)) { - goto bail; - } - } - - if (type == FTPTYPE_ASCII && lastch == '\r') { - php_stream_putc(outstream, '\r'); - } - - data = data_close(ftp, data); - ftp->data = NULL; - - if (!ftp_getresp(ftp) || (ftp->resp != 226 && ftp->resp != 250)) { - goto bail; - } - - return 1; -bail: - data_close(ftp, data); - ftp->data = NULL; - return 0; -} -/* }}} */ - -/* {{{ ftp_put - */ -int -ftp_put(ftpbuf_t *ftp, const char *path, php_stream *instream, ftptype_t type, int startpos TSRMLS_DC) -{ - databuf_t *data = NULL; - int size; - char *ptr; - int ch; - char arg[11]; - - if (ftp == NULL) { - return 0; - } - if (!ftp_type(ftp, type)) { - goto bail; - } - if ((data = ftp_getdata(ftp TSRMLS_CC)) == NULL) { - goto bail; - } - ftp->data = data; - - if (startpos > 0) { - if (startpos > 2147483647) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "PHP cannot handle files with a size greater then 2147483647 bytes.\n"); - goto bail; - } - sprintf(arg, "%u", startpos); - if (!ftp_putcmd(ftp, "REST", arg)) { - goto bail; - } - if (!ftp_getresp(ftp) || (ftp->resp != 350)) { - goto bail; - } - } - - if (!ftp_putcmd(ftp, "STOR", path)) { - goto bail; - } - if (!ftp_getresp(ftp) || (ftp->resp != 150 && ftp->resp != 125)) { - goto bail; - } - if ((data = data_accept(data, ftp TSRMLS_CC)) == NULL) { - goto bail; - } - - size = 0; - ptr = data->buf; - while (!php_stream_eof(instream) && (ch = php_stream_getc(instream))!=EOF) { - /* flush if necessary */ - if (FTP_BUFSIZE - size < 2) { - if (my_send(ftp, data->fd, data->buf, size) != size) { - goto bail; - } - ptr = data->buf; - size = 0; - } - - if (ch == '\n' && type == FTPTYPE_ASCII) { - *ptr++ = '\r'; - size++; - } - - *ptr++ = ch; - size++; - } - - if (size && my_send(ftp, data->fd, data->buf, size) != size) { - goto bail; - } - data = data_close(ftp, data); - - if (!ftp_getresp(ftp) || (ftp->resp != 226 && ftp->resp != 250)) { - goto bail; - } - return 1; -bail: - data_close(ftp, data); - return 0; -} -/* }}} */ - -/* {{{ ftp_size - */ -int -ftp_size(ftpbuf_t *ftp, const char *path) -{ - if (ftp == NULL) { - return -1; - } - if (!ftp_type(ftp, FTPTYPE_IMAGE)) { - return -1; - } - if (!ftp_putcmd(ftp, "SIZE", path)) { - return -1; - } - if (!ftp_getresp(ftp) || ftp->resp != 213) { - return -1; - } - return atoi(ftp->inbuf); -} -/* }}} */ - -/* {{{ ftp_mdtm - */ -time_t -ftp_mdtm(ftpbuf_t *ftp, const char *path) -{ - time_t stamp; - struct tm *gmt, tmbuf; - struct tm tm; - char *ptr; - int n; - - if (ftp == NULL) { - return -1; - } - if (!ftp_putcmd(ftp, "MDTM", path)) { - return -1; - } - if (!ftp_getresp(ftp) || ftp->resp != 213) { - return -1; - } - /* parse out the timestamp */ - for (ptr = ftp->inbuf; *ptr && !isdigit(*ptr); ptr++); - n = sscanf(ptr, "%4u%2u%2u%2u%2u%2u", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec); - if (n != 6) { - return -1; - } - tm.tm_year -= 1900; - tm.tm_mon--; - tm.tm_isdst = -1; - - /* figure out the GMT offset */ - stamp = time(NULL); - gmt = php_gmtime_r(&stamp, &tmbuf); - gmt->tm_isdst = -1; - - /* apply the GMT offset */ - tm.tm_sec += stamp - mktime(gmt); - tm.tm_isdst = gmt->tm_isdst; - - stamp = mktime(&tm); - - return stamp; -} -/* }}} */ - -/* {{{ ftp_delete - */ -int -ftp_delete(ftpbuf_t *ftp, const char *path) -{ - if (ftp == NULL) { - return 0; - } - if (!ftp_putcmd(ftp, "DELE", path)) { - return 0; - } - if (!ftp_getresp(ftp) || ftp->resp != 250) { - return 0; - } - - return 1; -} -/* }}} */ - -/* {{{ ftp_rename - */ -int -ftp_rename(ftpbuf_t *ftp, const char *src, const char *dest) -{ - if (ftp == NULL) { - return 0; - } - if (!ftp_putcmd(ftp, "RNFR", src)) { - return 0; - } - if (!ftp_getresp(ftp) || ftp->resp != 350) { - return 0; - } - if (!ftp_putcmd(ftp, "RNTO", dest)) { - return 0; - } - if (!ftp_getresp(ftp) || ftp->resp != 250) { - return 0; - } - return 1; -} -/* }}} */ - -/* {{{ ftp_site - */ -int -ftp_site(ftpbuf_t *ftp, const char *cmd) -{ - if (ftp == NULL) { - return 0; - } - if (!ftp_putcmd(ftp, "SITE", cmd)) { - return 0; - } - if (!ftp_getresp(ftp) || ftp->resp < 200 || ftp->resp >= 300) { - return 0; - } - - return 1; -} -/* }}} */ - -/* static functions */ - -/* {{{ ftp_putcmd - */ -int -ftp_putcmd(ftpbuf_t *ftp, const char *cmd, const char *args) -{ - int size; - char *data; - - /* build the output buffer */ - if (args && args[0]) { - /* "cmd args\r\n\0" */ - if (strlen(cmd) + strlen(args) + 4 > FTP_BUFSIZE) { - return 0; - } - size = sprintf(ftp->outbuf, "%s %s\r\n", cmd, args); - } else { - /* "cmd\r\n\0" */ - if (strlen(cmd) + 3 > FTP_BUFSIZE) { - return 0; - } - size = sprintf(ftp->outbuf, "%s\r\n", cmd); - } - - data = ftp->outbuf; - - if (my_send(ftp, ftp->fd, data, size) != size) { - return 0; - } - return 1; -} -/* }}} */ - -/* {{{ ftp_readline - */ -int -ftp_readline(ftpbuf_t *ftp) -{ - int size, rcvd; - char *data, *eol; - - /* shift the extra to the front */ - size = FTP_BUFSIZE; - rcvd = 0; - if (ftp->extra) { - memmove(ftp->inbuf, ftp->extra, ftp->extralen); - rcvd = ftp->extralen; - } - - data = ftp->inbuf; - - do { - size -= rcvd; - for (eol = data; rcvd; rcvd--, eol++) { - if (*eol == '\r') { - *eol = 0; - ftp->extra = eol + 1; - if (rcvd > 1 && *(eol + 1) == '\n') { - ftp->extra++; - rcvd--; - } - if ((ftp->extralen = --rcvd) == 0) { - ftp->extra = NULL; - } - return 1; - } else if (*eol == '\n') { - *eol = 0; - ftp->extra = eol + 1; - if ((ftp->extralen = --rcvd) == 0) { - ftp->extra = NULL; - } - return 1; - } - } - - data = eol; - if ((rcvd = my_recv(ftp, ftp->fd, data, size)) < 1) { - return 0; - } - } while (size); - - return 0; -} -/* }}} */ - -/* {{{ ftp_getresp - */ -int -ftp_getresp(ftpbuf_t *ftp) -{ - char *buf; - - if (ftp == NULL) { - return 0; - } - buf = ftp->inbuf; - ftp->resp = 0; - - while (1) { - - if (!ftp_readline(ftp)) { - return 0; - } - - /* 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; - } - } - - /* translate the tag */ - if (!isdigit(ftp->inbuf[0]) || !isdigit(ftp->inbuf[1]) || !isdigit(ftp->inbuf[2])) { - return 0; - } - - ftp->resp = 100 * (ftp->inbuf[0] - '0') + 10 * (ftp->inbuf[1] - '0') + (ftp->inbuf[2] - '0'); - - memmove(ftp->inbuf, ftp->inbuf + 4, FTP_BUFSIZE - 4); - - if (ftp->extra) { - ftp->extra -= 4; - } - return 1; -} -/* }}} */ - -/* {{{ my_send - */ -int -my_send(ftpbuf_t *ftp, php_socket_t s, void *buf, size_t len) -{ - fd_set write_set; - struct timeval tv; - int n, size, sent; - - size = len; - while (size) { - tv.tv_sec = ftp->timeout_sec; - tv.tv_usec = 0; - - FD_ZERO(&write_set); - FD_SET(s, &write_set); - - n = select(s + 1, NULL, &write_set, NULL, &tv); - - if (n < 1) { - -#if !defined(PHP_WIN32) && !(defined(NETWARE) && defined(USE_WINSOCK)) - if (n == 0) { - errno = ETIMEDOUT; - } -#endif - return -1; - } - -#if HAVE_OPENSSL_EXT - if (ftp->use_ssl && ftp->fd == s && ftp->ssl_active) { - sent = SSL_write(ftp->ssl_handle, buf, size); - } else if (ftp->use_ssl && ftp->fd != s && ftp->use_ssl_for_data && ftp->data->ssl_active) { - sent = SSL_write(ftp->data->ssl_handle, buf, size); - } else { -#endif - sent = send(s, buf, size, 0); -#if HAVE_OPENSSL_EXT - } -#endif - if (sent == -1) { - return -1; - } - - buf = (char*) buf + sent; - size -= sent; - } - - return len; -} -/* }}} */ - -/* {{{ my_recv - */ -int -my_recv(ftpbuf_t *ftp, php_socket_t s, void *buf, size_t len) -{ - fd_set read_set; - struct timeval tv; - int n, nr_bytes; - - tv.tv_sec = ftp->timeout_sec; - tv.tv_usec = 0; - - FD_ZERO(&read_set); - FD_SET(s, &read_set); - - n = select(s + 1, &read_set, NULL, NULL, &tv); - if (n < 1) { -#if !defined(PHP_WIN32) && !(defined(NETWARE) && defined(USE_WINSOCK)) - if (n == 0) { - errno = ETIMEDOUT; - } -#endif - return -1; - } - -#if HAVE_OPENSSL_EXT - if (ftp->use_ssl && ftp->fd == s && ftp->ssl_active) { - nr_bytes = SSL_read(ftp->ssl_handle, buf, len); - } else if (ftp->use_ssl && ftp->fd != s && ftp->use_ssl_for_data && ftp->data->ssl_active) { - nr_bytes = SSL_read(ftp->data->ssl_handle, buf, len); - } else { -#endif - nr_bytes = recv(s, buf, len, 0); -#if HAVE_OPENSSL_EXT - } -#endif - return (nr_bytes); -} -/* }}} */ - -/* {{{ data_available - */ -int -data_available(ftpbuf_t *ftp, php_socket_t s) -{ - fd_set read_set; - struct timeval tv; - int n; - - tv.tv_sec = 0; - tv.tv_usec = 1; - - FD_ZERO(&read_set); - FD_SET(s, &read_set); - n = select(s + 1, &read_set, NULL, NULL, &tv); - if (n < 1) { -#if !defined(PHP_WIN32) && !(defined(NETWARE) && defined(USE_WINSOCK)) - if (n == 0) { - errno = ETIMEDOUT; - } -#endif - return 0; - } - - return 1; -} -/* }}} */ -/* {{{ data_writeable - */ -int -data_writeable(ftpbuf_t *ftp, php_socket_t s) -{ - fd_set write_set; - struct timeval tv; - int n; - - tv.tv_sec = 0; - tv.tv_usec = 1; - - FD_ZERO(&write_set); - FD_SET(s, &write_set); - n = select(s + 1, NULL, &write_set, NULL, &tv); - if (n < 1) { -#ifndef PHP_WIN32 - if (n == 0) { - errno = ETIMEDOUT; - } -#endif - return 0; - } - - return 1; -} -/* }}} */ - -/* {{{ my_accept - */ -int -my_accept(ftpbuf_t *ftp, php_socket_t s, struct sockaddr *addr, socklen_t *addrlen) -{ - fd_set accept_set; - struct timeval tv; - int n; - - tv.tv_sec = ftp->timeout_sec; - tv.tv_usec = 0; - FD_ZERO(&accept_set); - FD_SET(s, &accept_set); - - n = select(s + 1, &accept_set, NULL, NULL, &tv); - if (n < 1) { -#if !defined(PHP_WIN32) && !(defined(NETWARE) && defined(USE_WINSOCK)) - if (n == 0) { - errno = ETIMEDOUT; - } -#endif - return -1; - } - - return accept(s, addr, addrlen); -} -/* }}} */ - -/* {{{ ftp_getdata - */ -databuf_t* -ftp_getdata(ftpbuf_t *ftp TSRMLS_DC) -{ - int fd = -1; - databuf_t *data; - php_sockaddr_storage addr; - struct sockaddr *sa; - socklen_t size; - union ipbox ipbox; - char arg[sizeof("255, 255, 255, 255, 255, 255")]; - struct timeval tv; - - - /* ask for a passive connection if we need one */ - if (ftp->pasv && !ftp_pasv(ftp, 1)) { - return NULL; - } - /* alloc the data structure */ - data = ecalloc(1, sizeof(*data)); - data->listener = -1; - data->fd = -1; - data->type = ftp->type; - - sa = (struct sockaddr *) &ftp->localaddr; - /* bind/listen */ - if ((fd = socket(sa->sa_family, SOCK_STREAM, 0)) == -1) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "socket() failed: %s (%d)\n", strerror(errno), errno); - goto bail; - } - - /* passive connection handler */ - if (ftp->pasv) { - /* clear the ready status */ - ftp->pasv = 1; - - /* connect */ - /* Win 95/98 seems not to like size > sizeof(sockaddr_in) */ - size = php_sockaddr_size(&ftp->pasvaddr); - tv.tv_sec = ftp->timeout_sec; - tv.tv_usec = 0; - if (php_connect_nonb(fd, (struct sockaddr*) &ftp->pasvaddr, size, &tv) == -1) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "php_connect_nonb() failed: %s (%d)\n", strerror(errno), errno); - goto bail; - } - - data->fd = fd; - - ftp->data = data; - return data; - } - - - /* active (normal) connection */ - - /* bind to a local address */ - php_any_addr(sa->sa_family, &addr, 0); - size = php_sockaddr_size(&addr); - - if (bind(fd, (struct sockaddr*) &addr, size) == -1) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "bind() failed: %s (%d)\n", strerror(errno), errno); - goto bail; - } - - if (getsockname(fd, (struct sockaddr*) &addr, &size) == -1) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "getsockname() failed: %s (%d)\n", strerror(errno), errno); - goto bail; - } - - if (listen(fd, 5) == -1) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "listen() failed: %s (%d)\n", strerror(errno), errno); - goto bail; - } - - data->listener = fd; - -#ifdef HAVE_IPV6 - if (sa->sa_family == AF_INET6) { - /* need to use EPRT */ - char eprtarg[INET6_ADDRSTRLEN + sizeof("|x||xxxxx|")]; - char out[INET6_ADDRSTRLEN]; - inet_ntop(AF_INET6, &((struct sockaddr_in6*) sa)->sin6_addr, out, sizeof(out)); - sprintf(eprtarg, "|2|%s|%hu|", out, ntohs(((struct sockaddr_in6 *) &addr)->sin6_port)); - - if (!ftp_putcmd(ftp, "EPRT", eprtarg)) { - goto bail; - } - - if (!ftp_getresp(ftp) || ftp->resp != 200) { - goto bail; - } - - ftp->data = data; - return data; - } -#endif - - /* send the PORT */ - ipbox.l[0] = ((struct sockaddr_in*) sa)->sin_addr.s_addr; - ipbox.s[2] = ((struct sockaddr_in*) &addr)->sin_port; - sprintf(arg, "%u,%u,%u,%u,%u,%u", ipbox.c[0], ipbox.c[1], ipbox.c[2], ipbox.c[3], ipbox.c[4], ipbox.c[5]); - - if (!ftp_putcmd(ftp, "PORT", arg)) { - goto bail; - } - if (!ftp_getresp(ftp) || ftp->resp != 200) { - goto bail; - } - - ftp->data = data; - return data; - -bail: - if (fd != -1) { - closesocket(fd); - } - efree(data); - return NULL; -} -/* }}} */ - -/* {{{ data_accept - */ -databuf_t* -data_accept(databuf_t *data, ftpbuf_t *ftp TSRMLS_DC) -{ - php_sockaddr_storage addr; - socklen_t size; - -#if HAVE_OPENSSL_EXT - SSL_CTX *ctx; -#endif - - if (data->fd != -1) { - goto data_accepted; - } - size = sizeof(addr); - data->fd = my_accept(ftp, data->listener, (struct sockaddr*) &addr, &size); - closesocket(data->listener); - data->listener = -1; - - if (data->fd == -1) { - efree(data); - return NULL; - } - -data_accepted: -#if HAVE_OPENSSL_EXT - - /* now enable ssl if we need to */ - if (ftp->use_ssl && ftp->use_ssl_for_data) { - ctx = SSL_CTX_new(SSLv23_client_method()); - if (ctx == NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "data_accept: failed to create the SSL context"); - return 0; - } - - data->ssl_handle = SSL_new(ctx); - if (data->ssl_handle == NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "data_accept: failed to create the SSL handle"); - SSL_CTX_free(ctx); - return 0; - } - - - SSL_set_fd(data->ssl_handle, data->fd); - - if (ftp->old_ssl) { - SSL_copy_session_id(data->ssl_handle, ftp->ssl_handle); - } - - if (SSL_connect(data->ssl_handle) <= 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "data_accept: SSL/TLS handshake failed"); - SSL_shutdown(data->ssl_handle); - return 0; - } - - data->ssl_active = 1; - } - -#endif - - return data; -} -/* }}} */ - -/* {{{ data_close - */ -databuf_t* -data_close(ftpbuf_t *ftp, databuf_t *data) -{ - if (data == NULL) { - return NULL; - } - if (data->listener != -1) { -#if HAVE_OPENSSL_EXT - if (data->ssl_active) { - SSL_shutdown(data->ssl_handle); - data->ssl_active = 0; - } -#endif - closesocket(data->listener); - } - if (data->fd != -1) { -#if HAVE_OPENSSL_EXT - if (data->ssl_active) { - SSL_shutdown(data->ssl_handle); - data->ssl_active = 0; - } -#endif - closesocket(data->fd); - } - if (ftp) { - ftp->data = NULL; - } - efree(data); - return NULL; -} -/* }}} */ - -/* {{{ ftp_genlist - */ -char** -ftp_genlist(ftpbuf_t *ftp, const char *cmd, const char *path TSRMLS_DC) -{ - FILE *tmpfp = NULL; - databuf_t *data = NULL; - char *ptr; - int ch, lastch; - int size, rcvd; - int lines; - char **ret = NULL; - char **entry; - char *text; - - - if ((tmpfp = tmpfile()) == NULL) { - return NULL; - } - - if (!ftp_type(ftp, FTPTYPE_ASCII)) { - goto bail; - } - - if ((data = ftp_getdata(ftp TSRMLS_CC)) == NULL) { - goto bail; - } - ftp->data = data; - - if (!ftp_putcmd(ftp, cmd, path)) { - goto bail; - } - if (!ftp_getresp(ftp) || (ftp->resp != 150 && ftp->resp != 125)) { - goto bail; - } - - /* pull data buffer into tmpfile */ - if ((data = data_accept(data, ftp TSRMLS_CC)) == NULL) { - goto bail; - } - size = 0; - lines = 0; - lastch = 0; - while ((rcvd = my_recv(ftp, data->fd, data->buf, FTP_BUFSIZE))) { - if (rcvd == -1) { - goto bail; - } - - fwrite(data->buf, rcvd, 1, tmpfp); - - size += rcvd; - for (ptr = data->buf; rcvd; rcvd--, ptr++) { - if (*ptr == '\n' && lastch == '\r') { - lines++; - } else { - size++; - } - lastch = *ptr; - } - } - - data = data_close(ftp, data); - - if (ferror(tmpfp)) { - goto bail; - } - - rewind(tmpfp); - - ret = emalloc((lines + 1) * sizeof(char**) + size * sizeof(char*)); - - entry = ret; - text = (char*) (ret + lines + 1); - *entry = text; - lastch = 0; - while ((ch = getc(tmpfp)) != EOF) { - if (ch == '\n' && lastch == '\r') { - *(text - 1) = 0; - *++entry = text; - } else { - *text++ = ch; - } - lastch = ch; - } - *entry = NULL; - - if (ferror(tmpfp)) { - goto bail; - } - fclose(tmpfp); - - if (!ftp_getresp(ftp) || (ftp->resp != 226 && ftp->resp != 250)) { - efree(ret); - return NULL; - } - - return ret; -bail: - if (data) - data_close(ftp, data); - fclose(tmpfp); - if (ret) - efree(ret); - return NULL; -} -/* }}} */ - -/* {{{ ftp_nb_get - */ -int -ftp_nb_get(ftpbuf_t *ftp, php_stream *outstream, const char *path, ftptype_t type, int resumepos TSRMLS_DC) -{ - databuf_t *data = NULL; - char arg[11]; - - if (ftp == NULL) { - goto bail; - } - - if (!ftp_type(ftp, type)) { - goto bail; - } - - if ((data = ftp_getdata(ftp TSRMLS_CC)) == NULL) { - goto bail; - } - - if (resumepos>0) { - /* We are working on an architecture that supports 64-bit integers - * since php is 32 bit by design, we bail out with warning - */ - if (resumepos > 2147483647) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "PHP cannot handle files greater then 2147483648 bytes.\n"); - goto bail; - } - sprintf(arg, "%u", resumepos); - if (!ftp_putcmd(ftp, "REST", arg)) { - goto bail; - } - if (!ftp_getresp(ftp) || (ftp->resp != 350)) { - goto bail; - } - } - - if (!ftp_putcmd(ftp, "RETR", path)) { - goto bail; - } - if (!ftp_getresp(ftp) || (ftp->resp != 150 && ftp->resp != 125)) { - goto bail; - } - - if ((data = data_accept(data, ftp TSRMLS_CC)) == NULL) { - goto bail; - } - - ftp->data = data; - ftp->stream = outstream; - ftp->lastch = 0; - ftp->nb = 1; - - return (ftp_nb_continue_read(ftp TSRMLS_CC)); - -bail: - data_close(ftp, data); - return PHP_FTP_FAILED; -} -/* }}} */ - -/* {{{ ftp_nb_continue_read - */ -int -ftp_nb_continue_read(ftpbuf_t *ftp TSRMLS_DC) -{ - databuf_t *data = NULL; - char *ptr; - int lastch; - size_t rcvd; - ftptype_t type; - - data = ftp->data; - - /* check if there is already more data */ - if (!data_available(ftp, data->fd)) { - return PHP_FTP_MOREDATA; - } - - type = ftp->type; - - lastch = ftp->lastch; - if ((rcvd = my_recv(ftp, data->fd, data->buf, FTP_BUFSIZE))) { - if (rcvd == -1) { - goto bail; - } - - if (type == FTPTYPE_ASCII) { - for (ptr = data->buf; rcvd; rcvd--, ptr++) { - if (lastch == '\r' && *ptr != '\n') { - php_stream_putc(ftp->stream, '\r'); - } - if (*ptr != '\r') { - php_stream_putc(ftp->stream, *ptr); - } - lastch = *ptr; - } - } else if (rcvd != php_stream_write(ftp->stream, data->buf, rcvd)) { - goto bail; - } - - ftp->lastch = lastch; - return PHP_FTP_MOREDATA; - } - - if (type == FTPTYPE_ASCII && lastch == '\r') { - php_stream_putc(ftp->stream, '\r'); - } - - data = data_close(ftp, data); - - if (!ftp_getresp(ftp) || (ftp->resp != 226 && ftp->resp != 250)) { - goto bail; - } - - ftp->nb = 0; - return PHP_FTP_FINISHED; -bail: - ftp->nb = 0; - data_close(ftp, data); - return PHP_FTP_FAILED; -} -/* }}} */ - -/* {{{ ftp_nb_put - */ -int -ftp_nb_put(ftpbuf_t *ftp, const char *path, php_stream *instream, ftptype_t type, int startpos TSRMLS_DC) -{ - databuf_t *data = NULL; - char arg[11]; - - if (ftp == NULL) { - return 0; - } - if (!ftp_type(ftp, type)) { - goto bail; - } - if ((data = ftp_getdata(ftp TSRMLS_CC)) == NULL) { - goto bail; - } - if (startpos > 0) { - if (startpos > 2147483647) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "PHP cannot handle files with a size greater then 2147483647 bytes.\n"); - goto bail; - } - sprintf(arg, "%u", startpos); - if (!ftp_putcmd(ftp, "REST", arg)) { - goto bail; - } - if (!ftp_getresp(ftp) || (ftp->resp != 350)) { - goto bail; - } - } - - if (!ftp_putcmd(ftp, "STOR", path)) { - goto bail; - } - if (!ftp_getresp(ftp) || (ftp->resp != 150 && ftp->resp != 125)) { - goto bail; - } - if ((data = data_accept(data, ftp TSRMLS_CC)) == NULL) { - goto bail; - } - ftp->data = data; - ftp->stream = instream; - ftp->lastch = 0; - ftp->nb = 1; - - return (ftp_nb_continue_write(ftp TSRMLS_CC)); - -bail: - data_close(ftp, data); - return PHP_FTP_FAILED; -} -/* }}} */ - - -/* {{{ ftp_nb_continue_write - */ -int -ftp_nb_continue_write(ftpbuf_t *ftp TSRMLS_DC) -{ - int size; - char *ptr; - int ch; - - /* check if we can write more data */ - if (!data_writeable(ftp, ftp->data->fd)) { - return PHP_FTP_MOREDATA; - } - - size = 0; - ptr = ftp->data->buf; - while (!php_stream_eof(ftp->stream) && (ch = php_stream_getc(ftp->stream)) != EOF) { - - if (ch == '\n' && ftp->type == FTPTYPE_ASCII) { - *ptr++ = '\r'; - size++; - } - - *ptr++ = ch; - size++; - - /* flush if necessary */ - if (FTP_BUFSIZE - size < 2) { - if (my_send(ftp, ftp->data->fd, ftp->data->buf, size) != size) { - goto bail; - } - return PHP_FTP_MOREDATA; - } - } - - if (size && my_send(ftp, ftp->data->fd, ftp->data->buf, size) != size) { - goto bail; - } - ftp->data = data_close(ftp, ftp->data); - - if (!ftp_getresp(ftp) || (ftp->resp != 226 && ftp->resp != 250)) { - goto bail; - } - ftp->nb = 0; - return PHP_FTP_FINISHED; -bail: - data_close(ftp, ftp->data); - ftp->nb = 0; - return PHP_FTP_FAILED; -} -/* }}} */ - -#endif /* HAVE_FTP */ - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - * vim600: sw=4 ts=4 fdm=marker - * vim<600: sw=4 ts=4 - */ diff --git a/ext/ftp/ftp.h b/ext/ftp/ftp.h deleted file mode 100644 index f934a989ee..0000000000 --- a/ext/ftp/ftp.h +++ /dev/null @@ -1,206 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP Version 4 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2003 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 2.02 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.php.net/license/2_02.txt. | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andrew Skalski <askalski@chek.com> | - | Stefan Esser <sesser@php.net> (resume functions) | - +----------------------------------------------------------------------+ - */ - -/* $Id$ */ - -#ifndef FTP_H -#define FTP_H - -#include "php_network.h" - -#include <stdio.h> -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif - -#define FTP_DEFAULT_TIMEOUT 90 -#define FTP_DEFAULT_AUTOSEEK 1 -#define PHP_FTP_FAILED 0 -#define PHP_FTP_FINISHED 1 -#define PHP_FTP_MOREDATA 2 - -/* XXX this should be configurable at runtime XXX */ -#define FTP_BUFSIZE 4096 - -typedef enum ftptype { - FTPTYPE_ASCII, - FTPTYPE_IMAGE -} ftptype_t; - -typedef struct databuf -{ - int listener; /* listener socket */ - php_socket_t fd; /* data connection */ - ftptype_t type; /* transfer type */ - char buf[FTP_BUFSIZE]; /* data buffer */ -#if HAVE_OPENSSL_EXT - SSL *ssl_handle; /* ssl handle */ - int ssl_active; /* flag if ssl is active or not */ -#endif -} databuf_t; - -typedef struct ftpbuf -{ - php_socket_t fd; /* control connection */ - php_sockaddr_storage localaddr; /* local address */ - int resp; /* last response code */ - char inbuf[FTP_BUFSIZE]; /* last response text */ - char *extra; /* extra characters */ - int extralen; /* number of extra chars */ - char outbuf[FTP_BUFSIZE]; /* command output buffer */ - char *pwd; /* cached pwd */ - char *syst; /* cached system type */ - ftptype_t type; /* current transfer type */ - int pasv; /* 0=off; 1=pasv; 2=ready */ - php_sockaddr_storage pasvaddr; /* passive mode address */ - long timeout_sec; /* User configureable timeout (seconds) */ - int autoseek; /* User configureable autoseek flag */ - - int nb; /* "nonblocking" transfer in progress */ - databuf_t *data; /* Data connection for "nonblocking" transfers */ - php_stream *stream; /* output stream for "nonblocking" transfers */ - int lastch; /* last char of previous call */ - int direction; /* recv = 0 / send = 1 */ - int closestream;/* close or not close stream */ -#if HAVE_OPENSSL_EXT - int use_ssl; /* enable(1) or disable(0) ssl */ - int use_ssl_for_data; /* en/disable ssl for the dataconnection */ - int old_ssl; /* old mode = forced data encryption */ - SSL *ssl_handle; /* handle for control connection */ - int ssl_active; /* ssl active on control conn */ -#endif - -} ftpbuf_t; - - - -/* open a FTP connection, returns ftpbuf (NULL on error) - * port is the ftp port in network byte order, or 0 for the default - */ -ftpbuf_t* ftp_open(const char *host, short port, long timeout_sec TSRMLS_DC); - -/* quits from the ftp session (it still needs to be closed) - * return true on success, false on error - */ -int ftp_quit(ftpbuf_t *ftp); - -/* frees up any cached data held in the ftp buffer */ -void ftp_gc(ftpbuf_t *ftp); - -/* close the FTP connection and return NULL */ -ftpbuf_t* ftp_close(ftpbuf_t *ftp); - -/* logs into the FTP server, returns true on success, false on error */ -int ftp_login(ftpbuf_t *ftp, const char *user, const char *pass TSRMLS_DC); - -/* reinitializes the connection, returns true on success, false on error */ -int ftp_reinit(ftpbuf_t *ftp); - -/* returns the remote system type (NULL on error) */ -const char* ftp_syst(ftpbuf_t *ftp); - -/* returns the present working directory (NULL on error) */ -const char* ftp_pwd(ftpbuf_t *ftp); - -/* exec a command [special features], return true on success, false on error */ -int ftp_exec(ftpbuf_t *ftp, const char *cmd); - -/* send a raw ftp command, return response as a hashtable, NULL on error */ -void ftp_raw(ftpbuf_t *ftp, const char *cmd, zval *return_value); - -/* changes directories, return true on success, false on error */ -int ftp_chdir(ftpbuf_t *ftp, const char *dir); - -/* changes to parent directory, return true on success, false on error */ -int ftp_cdup(ftpbuf_t *ftp); - -/* creates a directory, return the directory name on success, NULL on error. - * the return value must be freed - */ -char* ftp_mkdir(ftpbuf_t *ftp, const char *dir); - -/* removes a directory, return true on success, false on error */ -int ftp_rmdir(ftpbuf_t *ftp, const char *dir); - -/* Set permissions on a file */ -int ftp_chmod(ftpbuf_t *ftp, const int mode, const char *filename, const int filename_len); - -/* returns a NULL-terminated array of filenames in the given path - * or NULL on error. the return array must be freed (but don't - * free the array elements) - */ -char** ftp_nlist(ftpbuf_t *ftp, const char *path TSRMLS_DC); - -/* returns a NULL-terminated array of lines returned by the ftp - * LIST command for the given path or NULL on error. the return - * array must be freed (but don't - * free the array elements) - */ -char** ftp_list(ftpbuf_t *ftp, const char *path, int recursive TSRMLS_DC); - -/* switches passive mode on or off - * returns true on success, false on error - */ -int ftp_pasv(ftpbuf_t *ftp, int pasv); - -/* retrieves a file and saves its contents to outfp - * returns true on success, false on error - */ -int ftp_get(ftpbuf_t *ftp, php_stream *outstream, const char *path, ftptype_t type, int resumepos TSRMLS_DC); - -/* stores the data from a file, socket, or process as a file on the remote server - * returns true on success, false on error - */ -int ftp_put(ftpbuf_t *ftp, const char *path, php_stream *instream, ftptype_t type, int startpos TSRMLS_DC); - -/* returns the size of the given file, or -1 on error */ -int ftp_size(ftpbuf_t *ftp, const char *path); - -/* returns the last modified time of the given file, or -1 on error */ -time_t ftp_mdtm(ftpbuf_t *ftp, const char *path); - -/* renames a file on the server */ -int ftp_rename(ftpbuf_t *ftp, const char *src, const char *dest); - -/* deletes the file from the server */ -int ftp_delete(ftpbuf_t *ftp, const char *path); - -/* sends a SITE command to the server */ -int ftp_site(ftpbuf_t *ftp, const char *cmd); - -/* retrieves part of a file and saves its contents to outfp - * returns true on success, false on error - */ -int ftp_nb_get(ftpbuf_t *ftp, php_stream *outstream, const char *path, ftptype_t type, int resumepos TSRMLS_DC); - -/* stores the data from a file, socket, or process as a file on the remote server - * returns true on success, false on error - */ -int ftp_nb_put(ftpbuf_t *ftp, const char *path, php_stream *instream, ftptype_t type, int startpos TSRMLS_DC); - -/* continues a previous nb_(f)get command - */ -int ftp_nb_continue_read(ftpbuf_t *ftp TSRMLS_DC); - -/* continues a previous nb_(f)put command - */ -int ftp_nb_continue_write(ftpbuf_t *ftp TSRMLS_DC); - - -#endif diff --git a/ext/ftp/php_ftp.c b/ext/ftp/php_ftp.c deleted file mode 100644 index e2f19a4b47..0000000000 --- a/ext/ftp/php_ftp.c +++ /dev/null @@ -1,1214 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP Version 4 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2003 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 2.02 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.php.net/license/2_02.txt. | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andrew Skalski <askalski@chek.com> | - | Stefan Esser <sesser@php.net> (resume functions) | - +----------------------------------------------------------------------+ - */ - -/* $Id$ */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "php.h" - -#ifdef NETWARE -#ifdef USE_WINSOCK -#include <novsock2.h> -#else -#ifndef NEW_LIBC -#include <sys/socket.h> -#endif -#endif -#endif - -#if HAVE_OPENSSL_EXT -#include <openssl/ssl.h> -#endif - -#if HAVE_FTP - -#include "ext/standard/info.h" -#include "ext/standard/file.h" - -#include "php_ftp.h" -#include "ftp.h" - -static int le_ftpbuf; -#define le_ftpbuf_name "FTP Buffer" - -function_entry php_ftp_functions[] = { - PHP_FE(ftp_connect, NULL) -#if HAVE_OPENSSL_EXT - PHP_FE(ftp_ssl_connect, NULL) -#endif - PHP_FE(ftp_login, NULL) - PHP_FE(ftp_pwd, NULL) - PHP_FE(ftp_cdup, NULL) - PHP_FE(ftp_chdir, NULL) - PHP_FE(ftp_exec, NULL) - PHP_FE(ftp_raw, NULL) - PHP_FE(ftp_mkdir, NULL) - PHP_FE(ftp_rmdir, NULL) - PHP_FE(ftp_chmod, NULL) - PHP_FE(ftp_nlist, NULL) - PHP_FE(ftp_rawlist, NULL) - PHP_FE(ftp_systype, NULL) - PHP_FE(ftp_pasv, NULL) - PHP_FE(ftp_get, NULL) - PHP_FE(ftp_fget, NULL) - PHP_FE(ftp_put, NULL) - PHP_FE(ftp_fput, NULL) - PHP_FE(ftp_size, NULL) - PHP_FE(ftp_mdtm, NULL) - PHP_FE(ftp_rename, NULL) - 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_FE(ftp_nb_fget, NULL) - PHP_FE(ftp_nb_get, NULL) - PHP_FE(ftp_nb_continue, NULL) - PHP_FE(ftp_nb_put, NULL) - PHP_FE(ftp_nb_fput, NULL) - PHP_FALIAS(ftp_quit, ftp_close, NULL) - {NULL, NULL, NULL} -}; - -zend_module_entry php_ftp_module_entry = { - STANDARD_MODULE_HEADER, - "ftp", - php_ftp_functions, - PHP_MINIT(ftp), - NULL, - NULL, - NULL, - PHP_MINFO(ftp), - NO_VERSION_YET, - STANDARD_MODULE_PROPERTIES -}; - -#ifdef COMPILE_DL_FTP -ZEND_GET_MODULE(php_ftp) -#endif - -static void ftp_destructor_ftpbuf(zend_rsrc_list_entry *rsrc TSRMLS_DC) -{ - ftpbuf_t *ftp = (ftpbuf_t *)rsrc->ptr; - - ftp_close(ftp); -} - -PHP_MINIT_FUNCTION(ftp) -{ - 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_AUTORESUME", PHP_FTP_AUTORESUME, CONST_PERSISTENT | CONST_CS); - REGISTER_LONG_CONSTANT("FTP_TIMEOUT_SEC", PHP_FTP_OPT_TIMEOUT_SEC, CONST_PERSISTENT | CONST_CS); - REGISTER_LONG_CONSTANT("FTP_AUTOSEEK", PHP_FTP_OPT_AUTOSEEK, CONST_PERSISTENT | CONST_CS); - REGISTER_LONG_CONSTANT("FTP_FAILED", PHP_FTP_FAILED, CONST_PERSISTENT | CONST_CS); - REGISTER_LONG_CONSTANT("FTP_FINISHED", PHP_FTP_FINISHED, CONST_PERSISTENT | CONST_CS); - REGISTER_LONG_CONSTANT("FTP_MOREDATA", PHP_FTP_MOREDATA, CONST_PERSISTENT | CONST_CS); - return SUCCESS; -} - -PHP_MINFO_FUNCTION(ftp) -{ - php_info_print_table_start(); - php_info_print_table_row(2, "FTP support", "enabled"); - php_info_print_table_end(); -} - -#define XTYPE(xtype, mode) { \ - if (mode != FTPTYPE_ASCII && mode != FTPTYPE_IMAGE) { \ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Mode must be FTP_ASCII or FTP_BINARY"); \ - RETURN_FALSE; \ - } \ - xtype = mode; \ - } - - -/* {{{ proto resource ftp_connect(string host [, int port [, int timeout)]]) - Opens a FTP stream */ -PHP_FUNCTION(ftp_connect) -{ - ftpbuf_t *ftp; - char *host; - int host_len; - long port = 0; - long timeout_sec = FTP_DEFAULT_TIMEOUT; - - 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_docref(NULL TSRMLS_CC, E_WARNING, "Timeout has to be greater than 0"); - RETURN_FALSE; - } - - /* connect */ - if (!(ftp = ftp_open(host, (short)port, timeout_sec TSRMLS_CC))) { - RETURN_FALSE; - } - - /* autoseek for resuming */ - ftp->autoseek = FTP_DEFAULT_AUTOSEEK; -#if HAVE_OPENSSL_EXT - /* disable ssl */ - ftp->use_ssl = 0; -#endif - - ZEND_REGISTER_RESOURCE(return_value, ftp, le_ftpbuf); -} -/* }}} */ - -#if HAVE_OPENSSL_EXT -/* {{{ proto resource ftp_ssl_connect(string host [, int port [, int timeout)]]) - Opens a FTP-SSL stream */ -PHP_FUNCTION(ftp_ssl_connect) -{ - ftpbuf_t *ftp; - char *host; - int host_len; - long port = 0; - long timeout_sec = FTP_DEFAULT_TIMEOUT; - - 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_docref(NULL TSRMLS_CC, E_WARNING, "Timeout has to be greater than 0"); - RETURN_FALSE; - } - - /* connect */ - if (!(ftp = ftp_open(host, (short)port, timeout_sec TSRMLS_CC))) { - RETURN_FALSE; - } - - /* autoseek for resuming */ - ftp->autoseek = FTP_DEFAULT_AUTOSEEK; - /* enable ssl */ - ftp->use_ssl = 1; - - ZEND_REGISTER_RESOURCE(return_value, ftp, le_ftpbuf); -} -/* }}} */ -#endif - -/* {{{ proto bool ftp_login(resource stream, string username, string password) - Logs into the FTP server */ -PHP_FUNCTION(ftp_login) -{ - zval *z_ftp; - ftpbuf_t *ftp; - char *user, *pass; - int user_len, pass_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &z_ftp, &user, &user_len, &pass, &pass_len) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - - /* log in */ - if (!ftp_login(ftp, user, pass TSRMLS_CC)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); - RETURN_FALSE; - } - - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto string ftp_pwd(resource stream) - Returns the present working directory */ -PHP_FUNCTION(ftp_pwd) -{ - zval *z_ftp; - ftpbuf_t *ftp; - const char *pwd; - - 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 (!(pwd = ftp_pwd(ftp))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); - RETURN_FALSE; - } - - RETURN_STRING((char*) pwd, 1); -} -/* }}} */ - -/* {{{ proto bool ftp_cdup(resource stream) - Changes to the parent directory */ -PHP_FUNCTION(ftp_cdup) -{ - zval *z_ftp; - ftpbuf_t *ftp; - - 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 (!ftp_cdup(ftp)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); - RETURN_FALSE; - } - - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool ftp_chdir(resource stream, string directory) - Changes directories */ -PHP_FUNCTION(ftp_chdir) -{ - zval *z_ftp; - ftpbuf_t *ftp; - char *dir; - int dir_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_ftp, &dir, &dir_len) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - - /* change directories */ - if (!ftp_chdir(ftp, dir)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); - RETURN_FALSE; - } - - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool ftp_exec(resource stream, string command) - Requests execution of a program on the FTP server */ -PHP_FUNCTION(ftp_exec) -{ - pval *z_ftp; - ftpbuf_t *ftp; - char *cmd; - int cmd_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_ftp, &cmd, &cmd_len) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - - /* execute serverside command */ - if (!ftp_exec(ftp, cmd)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); - RETURN_FALSE; - } - - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto array ftp_raw(resource stream, string command) - Sends a literal command to the FTP server */ -PHP_FUNCTION(ftp_raw) -{ - zval *z_ftp; - ftpbuf_t *ftp; - char *cmd; - int cmd_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_ftp, &cmd, &cmd_len) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - - /* execute arbitrary ftp command */ - ftp_raw(ftp, cmd, return_value); -} -/* }}} */ - -/* {{{ proto string ftp_mkdir(resource stream, string directory) - Creates a directory and returns the absolute path for the new directory or false on error */ -PHP_FUNCTION(ftp_mkdir) -{ - zval *z_ftp; - ftpbuf_t *ftp; - char *dir, *tmp; - int dir_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_ftp, &dir, &dir_len) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - - /* create directorie */ - if (NULL == (tmp = ftp_mkdir(ftp, dir))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); - RETURN_FALSE; - } - - RETURN_STRING(tmp, 0); -} -/* }}} */ - -/* {{{ proto bool ftp_rmdir(resource stream, string directory) - Removes a directory */ -PHP_FUNCTION(ftp_rmdir) -{ - zval *z_ftp; - ftpbuf_t *ftp; - char *dir; - int dir_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_ftp, &dir, &dir_len) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - - /* remove directorie */ - if (!ftp_rmdir(ftp, dir)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); - RETURN_FALSE; - } - - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto int ftp_chmod(resource stream, int mode, string filename) - Sets permissions on a file */ -PHP_FUNCTION(ftp_chmod) -{ - zval *z_ftp; - ftpbuf_t *ftp; - char *filename; - int filename_len; - long mode; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rls", &z_ftp, &mode, &filename, &filename_len) == FAILURE) { - RETURN_FALSE; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - - if (!ftp_chmod(ftp, mode, filename, filename_len)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); - RETURN_FALSE; - } - - RETURN_LONG(mode); -} -/* }}} */ - -/* {{{ proto array ftp_nlist(resource stream, string directory) - Returns an array of filenames in the given directory */ -PHP_FUNCTION(ftp_nlist) -{ - zval *z_ftp; - ftpbuf_t *ftp; - char **nlist, **ptr, *dir; - int dir_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_ftp, &dir, &dir_len) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - - /* get list of files */ - if (NULL == (nlist = ftp_nlist(ftp, dir TSRMLS_CC))) { - RETURN_FALSE; - } - - array_init(return_value); - for (ptr = nlist; *ptr; ptr++) { - add_next_index_string(return_value, *ptr, 1); - } - efree(nlist); -} -/* }}} */ - -/* {{{ proto array ftp_rawlist(resource stream, string directory [, bool recursive]) - Returns a detailed listing of a directory as an array of output lines */ -PHP_FUNCTION(ftp_rawlist) -{ - zval *z_ftp; - ftpbuf_t *ftp; - char **llist, **ptr, *dir; - int dir_len; - zend_bool recursive = 0; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|b", &z_ftp, &dir, &dir_len, &recursive) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - - /* get raw directory listing */ - if (NULL == (llist = ftp_list(ftp, dir, recursive TSRMLS_CC))) { - RETURN_FALSE; - } - - array_init(return_value); - for (ptr = llist; *ptr; ptr++) { - add_next_index_string(return_value, *ptr, 1); - } - efree(llist); -} -/* }}} */ - -/* {{{ proto string ftp_systype(resource stream) - Returns the system type identifier */ -PHP_FUNCTION(ftp_systype) -{ - zval *z_ftp; - ftpbuf_t *ftp; - const char *syst; - - 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 (NULL == (syst = ftp_syst(ftp))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); - RETURN_FALSE; - } - - RETURN_STRING((char*) syst, 1); -} -/* }}} */ - -/* {{{ proto bool ftp_fget(resource stream, resource fp, string remote_file, int mode[, int resumepos]) - Retrieves a file from the FTP server and writes it to an open file */ -PHP_FUNCTION(ftp_fget) -{ - zval *z_ftp, *z_file; - ftpbuf_t *ftp; - ftptype_t xtype; - php_stream *stream; - char *file; - int file_len; - long mode, resumepos=0; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rrsl|l", &z_ftp, &z_file, &file, &file_len, &mode, &resumepos) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - php_stream_from_zval(stream, &z_file); - XTYPE(xtype, mode); - - /* ignore autoresume if autoseek is switched off */ - if (!ftp->autoseek && resumepos == PHP_FTP_AUTORESUME) { - resumepos = 0; - } - - if (ftp->autoseek && resumepos) { - /* if autoresume is wanted seek to end */ - if (resumepos == PHP_FTP_AUTORESUME) { - php_stream_seek(stream, 0, SEEK_END); - resumepos = php_stream_tell(stream); - } else { - php_stream_seek(stream, resumepos, SEEK_SET); - } - } - - if (!ftp_get(ftp, stream, file, xtype, resumepos TSRMLS_CC)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); - RETURN_FALSE; - } - - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool ftp_nb_fget(resource stream, resource fp, string remote_file, int mode[, int resumepos]) - Retrieves a file from the FTP server asynchronly and writes it to an open file */ -PHP_FUNCTION(ftp_nb_fget) -{ - zval *z_ftp, *z_file; - ftpbuf_t *ftp; - ftptype_t xtype; - php_stream *stream; - char *file; - int file_len, ret; - long mode, resumepos=0; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rrsl|l", &z_ftp, &z_file, &file, &file_len, &mode, &resumepos) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - php_stream_from_zval(stream, &z_file); - XTYPE(xtype, mode); - - /* ignore autoresume if autoseek is switched off */ - if (!ftp->autoseek && resumepos == PHP_FTP_AUTORESUME) { - resumepos = 0; - } - - if (ftp->autoseek && resumepos) { - /* if autoresume is wanted seek to end */ - if (resumepos == PHP_FTP_AUTORESUME) { - php_stream_seek(stream, 0, SEEK_END); - resumepos = php_stream_tell(stream); - } else { - php_stream_seek(stream, resumepos, SEEK_SET); - } - } - - /* configuration */ - ftp->direction = 0; /* recv */ - ftp->closestream = 0; /* do not close */ - - if ((ret = ftp_nb_get(ftp, stream, file, xtype, resumepos TSRMLS_CC)) == PHP_FTP_FAILED) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); - RETURN_LONG(ret); - } - - RETURN_LONG(ret); -} -/* }}} */ - -/* {{{ proto bool ftp_pasv(resource stream, bool pasv) - Turns passive mode on or off */ -PHP_FUNCTION(ftp_pasv) -{ - zval *z_ftp; - ftpbuf_t *ftp; - zend_bool pasv; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rb", &z_ftp, &pasv) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - - if (!ftp_pasv(ftp, pasv ? 1 : 0)) { - RETURN_FALSE; - } - - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool ftp_get(resource stream, string local_file, string remote_file, int mode[, int resume_pos]) - Retrieves a file from the FTP server and writes it to a local file */ -PHP_FUNCTION(ftp_get) -{ - zval *z_ftp; - ftpbuf_t *ftp; - ftptype_t xtype; - php_stream *outstream; - char *local, *remote; - int local_len, remote_len; - long mode, resumepos=0; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rssl|l", &z_ftp, &local, &local_len, &remote, &remote_len, &mode, &resumepos) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - XTYPE(xtype, mode); - - /* ignore autoresume if autoseek is switched off */ - if (!ftp->autoseek && resumepos == PHP_FTP_AUTORESUME) { - resumepos = 0; - } - - if (ftp->autoseek && resumepos) { - outstream = php_stream_fopen(local, "rb+", NULL); - if (outstream == NULL) { - outstream = php_stream_fopen(local, "wb", NULL); - } - if (outstream != NULL) { - /* if autoresume is wanted seek to end */ - if (resumepos == PHP_FTP_AUTORESUME) { - php_stream_seek(outstream, 0, SEEK_END); - resumepos = php_stream_tell(outstream); - } else { - php_stream_seek(outstream, resumepos, SEEK_SET); - } - } - } else { - outstream = php_stream_fopen(local, "wb", NULL); - } - - if (outstream == NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error opening %s", local); - RETURN_FALSE; - } - - if (!ftp_get(ftp, outstream, remote, xtype, resumepos TSRMLS_CC)) { - php_stream_close(outstream); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); - RETURN_FALSE; - } - - php_stream_close(outstream); - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto int ftp_nb_get(resource stream, string local_file, string remote_file, int mode[, int resume_pos]) - Retrieves a file from the FTP server nbhronly and writes it to a local file */ -PHP_FUNCTION(ftp_nb_get) -{ - zval *z_ftp; - ftpbuf_t *ftp; - ftptype_t xtype; - php_stream *outstream; - char *local, *remote; - int local_len, remote_len, ret; - long mode, resumepos=0; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rssl|l", &z_ftp, &local, &local_len, &remote, &remote_len, &mode, &resumepos) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - XTYPE(xtype, mode); - - /* ignore autoresume if autoseek is switched off */ - if (!ftp->autoseek && resumepos == PHP_FTP_AUTORESUME) { - resumepos = 0; - } - - if (ftp->autoseek && resumepos) { - outstream = php_stream_fopen(local, "rb+", NULL); - if (outstream == NULL) { - outstream = php_stream_fopen(local, "wb", NULL); - } - if (outstream != NULL) { - /* if autoresume is wanted seek to end */ - if (resumepos == PHP_FTP_AUTORESUME) { - php_stream_seek(outstream, 0, SEEK_END); - resumepos = php_stream_tell(outstream); - } else { - php_stream_seek(outstream, resumepos, SEEK_SET); - } - } - } else { - outstream = php_stream_fopen(local, "wb", NULL); - } - - if (outstream == NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error opening %s", local); - RETURN_FALSE; - } - - /* configuration */ - ftp->direction = 0; /* recv */ - ftp->closestream = 1; /* do close */ - - if ((ret = ftp_nb_get(ftp, outstream, remote, xtype, resumepos TSRMLS_CC)) == PHP_FTP_FAILED) { - php_stream_close(outstream); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); - RETURN_LONG(PHP_FTP_FAILED); - } - - if (ret == PHP_FTP_FINISHED) { - php_stream_close(outstream); - } - - RETURN_LONG(ret); -} -/* }}} */ - -/* {{{ proto int ftp_nb_continue(resource stream) - Continues retrieving/sending a file nbronously */ -PHP_FUNCTION(ftp_nb_continue) -{ - zval *z_ftp; - ftpbuf_t *ftp; - int ret; - - 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 (!ftp->nb) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "no nbronous transfer to continue."); - RETURN_LONG(PHP_FTP_FAILED); - } - - if (ftp->direction) { - ret=ftp_nb_continue_write(ftp TSRMLS_CC); - } else { - ret=ftp_nb_continue_read(ftp TSRMLS_CC); - } - - if (ret != PHP_FTP_MOREDATA && ftp->closestream) { - php_stream_close(ftp->stream); - } - - if (ret == PHP_FTP_FAILED) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); - } - - RETURN_LONG(ret); -} -/* }}} */ - -/* {{{ proto bool ftp_fput(resource stream, string remote_file, resource fp, int mode[, int startpos]) - Stores a file from an open file to the FTP server */ -PHP_FUNCTION(ftp_fput) -{ - zval *z_ftp, *z_file; - ftpbuf_t *ftp; - ftptype_t xtype; - int remote_len; - long mode, startpos=0; - php_stream *stream; - char *remote; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsrl|l", &z_ftp, &remote, &remote_len, &z_file, &mode, &startpos) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - php_stream_from_zval(stream, &z_file); - XTYPE(xtype, mode); - - /* ignore autoresume if autoseek is switched off */ - if (!ftp->autoseek && startpos == PHP_FTP_AUTORESUME) { - startpos = 0; - } - - if (ftp->autoseek && startpos) { - /* if autoresume is wanted ask for remote size */ - if (startpos == PHP_FTP_AUTORESUME) { - startpos = ftp_size(ftp, remote); - if (startpos < 0) { - startpos = 0; - } - } - if (startpos) { - php_stream_seek(stream, startpos, SEEK_SET); - } - } - - if (!ftp_put(ftp, remote, stream, xtype, startpos TSRMLS_CC)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); - RETURN_FALSE; - } - - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool ftp_nb_fput(resource stream, string remote_file, resource fp, int mode[, int startpos]) - Stores a file from an open file to the FTP server nbronly */ -PHP_FUNCTION(ftp_nb_fput) -{ - zval *z_ftp, *z_file; - ftpbuf_t *ftp; - ftptype_t xtype; - int remote_len, ret; - long mode, startpos=0; - php_stream *stream; - char *remote; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsrl|l", &z_ftp, &remote, &remote_len, &z_file, &mode, &startpos) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - php_stream_from_zval(stream, &z_file); - XTYPE(xtype, mode); - - /* ignore autoresume if autoseek is switched off */ - if (!ftp->autoseek && startpos == PHP_FTP_AUTORESUME) { - startpos = 0; - } - - if (ftp->autoseek && startpos) { - /* if autoresume is wanted ask for remote size */ - if (startpos == PHP_FTP_AUTORESUME) { - startpos = ftp_size(ftp, remote); - if (startpos < 0) { - startpos = 0; - } - } - if (startpos) { - php_stream_seek(stream, startpos, SEEK_SET); - } - } - - /* configuration */ - ftp->direction = 1; /* send */ - ftp->closestream = 0; /* do not close */ - - if (((ret = ftp_nb_put(ftp, remote, stream, xtype, startpos TSRMLS_CC)) == PHP_FTP_FAILED)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); - RETURN_LONG(ret); - } - - RETURN_LONG(ret); -} -/* }}} */ - - -/* {{{ proto bool ftp_put(resource stream, string remote_file, string local_file, int mode[, int startpos]) - Stores a file on the FTP server */ -PHP_FUNCTION(ftp_put) -{ - zval *z_ftp; - ftpbuf_t *ftp; - ftptype_t xtype; - char *remote, *local; - int remote_len, local_len; - long mode, startpos=0; - php_stream *instream; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rssl|l", &z_ftp, &remote, &remote_len, &local, &local_len, &mode, &startpos) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - XTYPE(xtype, mode); - - if (!(instream = php_stream_fopen(local, "rb", NULL))) { - RETURN_FALSE; - } - - /* ignore autoresume if autoseek is switched off */ - if (!ftp->autoseek && startpos == PHP_FTP_AUTORESUME) { - startpos = 0; - } - - if (ftp->autoseek && startpos) { - /* if autoresume is wanted ask for remote size */ - if (startpos == PHP_FTP_AUTORESUME) { - startpos = ftp_size(ftp, remote); - if (startpos < 0) { - startpos = 0; - } - } - if (startpos) { - php_stream_seek(instream, startpos, SEEK_SET); - } - } - - if (!ftp_put(ftp, remote, instream, xtype, startpos TSRMLS_CC)) { - php_stream_close(instream); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); - RETURN_FALSE; - } - php_stream_close(instream); - - RETURN_TRUE; -} -/* }}} */ - - -/* {{{ proto bool ftp_nb_put(resource stream, string remote_file, string local_file, int mode[, int startpos]) - Stores a file on the FTP server */ -PHP_FUNCTION(ftp_nb_put) -{ - zval *z_ftp; - ftpbuf_t *ftp; - ftptype_t xtype; - char *remote, *local; - int remote_len, local_len, ret; - long mode, startpos=0; - php_stream *instream; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rssl|l", &z_ftp, &remote, &remote_len, &local, &local_len, &mode, &startpos) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - XTYPE(xtype, mode); - - if (!(instream = php_stream_fopen(local, "rb", NULL))) { - RETURN_FALSE; - } - - /* ignore autoresume if autoseek is switched off */ - if (!ftp->autoseek && startpos == PHP_FTP_AUTORESUME) { - startpos = 0; - } - - if (ftp->autoseek && startpos) { - /* if autoresume is wanted ask for remote size */ - if (startpos == PHP_FTP_AUTORESUME) { - startpos = ftp_size(ftp, remote); - if (startpos < 0) { - startpos = 0; - } - } - if (startpos) { - php_stream_seek(instream, startpos, SEEK_SET); - } - } - - /* configuration */ - ftp->direction = 1; /* send */ - ftp->closestream = 1; /* do close */ - - ret = ftp_nb_put(ftp, remote, instream, xtype, startpos TSRMLS_CC); - - if (ret != PHP_FTP_MOREDATA) { - php_stream_close(instream); - } - - if (ret == PHP_FTP_FAILED) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); - } - - RETURN_LONG(ret); -} -/* }}} */ - -/* {{{ proto int ftp_size(resource stream, string filename) - Returns the size of the file, or -1 on error */ -PHP_FUNCTION(ftp_size) -{ - zval *z_ftp; - ftpbuf_t *ftp; - char *file; - int file_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_ftp, &file, &file_len) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - - /* get file size */ - RETURN_LONG(ftp_size(ftp, file)); -} -/* }}} */ - -/* {{{ proto int ftp_mdtm(resource stream, string filename) - Returns the last modification time of the file, or -1 on error */ -PHP_FUNCTION(ftp_mdtm) -{ - zval *z_ftp; - ftpbuf_t *ftp; - char *file; - int file_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_ftp, &file, &file_len) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - - /* get file mod time */ - RETURN_LONG(ftp_mdtm(ftp, file)); -} -/* }}} */ - -/* {{{ proto bool ftp_rename(resource stream, string src, string dest) - Renames the given file to a new path */ -PHP_FUNCTION(ftp_rename) -{ - zval *z_ftp; - ftpbuf_t *ftp; - char *src, *dest; - int src_len, dest_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &z_ftp, &src, &src_len, &dest, &dest_len) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - - /* rename the file */ - if (!ftp_rename(ftp, src, dest)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); - RETURN_FALSE; - } - - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool ftp_delete(resource stream, string file) - Deletes a file */ -PHP_FUNCTION(ftp_delete) -{ - zval *z_ftp; - ftpbuf_t *ftp; - char *file; - int file_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_ftp, &file, &file_len) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - - /* delete the file */ - if (!ftp_delete(ftp, file)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); - RETURN_FALSE; - } - - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool ftp_site(resource stream, string cmd) - Sends a SITE command to the server */ -PHP_FUNCTION(ftp_site) -{ - zval *z_ftp; - ftpbuf_t *ftp; - char *cmd; - int cmd_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_ftp, &cmd, &cmd_len) == FAILURE) { - return; - } - - ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - - /* send the site command */ - if (!ftp_site(ftp, cmd)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); - RETURN_FALSE; - } - - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto void ftp_close(resource stream) - Closes the FTP stream */ -PHP_FUNCTION(ftp_close) -{ - zval *z_ftp; - ftpbuf_t *ftp; - - 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); - - ftp_quit(ftp); - - RETURN_BOOL(zend_list_delete(Z_LVAL_P(z_ftp)) == SUCCESS); -} -/* }}} */ - -/* {{{ 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_docref(NULL TSRMLS_CC, E_WARNING, "Option TIMEOUT_SEC expects value of type long, %s given", - zend_zval_type_name(z_value)); - RETURN_FALSE; - } - if (Z_LVAL_P(z_value) <= 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Timeout has to be greater than 0"); - RETURN_FALSE; - } - ftp->timeout_sec = Z_LVAL_P(z_value); - RETURN_TRUE; - break; - case PHP_FTP_OPT_AUTOSEEK: - if (Z_TYPE_P(z_value) != IS_BOOL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Option AUTOSEEK expects value of type boolean, %s given", - zend_zval_type_name(z_value)); - RETURN_FALSE; - } - ftp->autoseek = Z_LVAL_P(z_value); - RETURN_TRUE; - break; - default: - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown option '%d'", 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; - case PHP_FTP_OPT_AUTOSEEK: - RETURN_BOOL(ftp->autoseek); - break; - default: - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown option '%d'", option); - RETURN_FALSE; - break; - } -} -/* }}} */ - -#endif /* HAVE_FTP */ - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * indent-tabs-mode: t - * End: - */ diff --git a/ext/ftp/php_ftp.h b/ext/ftp/php_ftp.h deleted file mode 100644 index 47e5ba1b34..0000000000 --- a/ext/ftp/php_ftp.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP Version 4 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2003 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 2.02 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.php.net/license/2_02.txt. | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andrew Skalski <askalski@chek.com> | - | Stefan Esser <sesser@php.net> (resume functions) | - +----------------------------------------------------------------------+ - */ - -/* $Id$ */ - -#ifndef _INCLUDED_FTP_H -#define _INCLUDED_FTP_H - -#if HAVE_FTP - -extern zend_module_entry php_ftp_module_entry; -#define php_ftp_module_ptr &php_ftp_module_entry - -#define PHP_FTP_OPT_TIMEOUT_SEC 0 -#define PHP_FTP_OPT_AUTOSEEK 1 -#define PHP_FTP_AUTORESUME -1 - -PHP_MINIT_FUNCTION(ftp); -PHP_MINFO_FUNCTION(ftp); - -PHP_FUNCTION(ftp_connect); -#if HAVE_OPENSSL_EXT -PHP_FUNCTION(ftp_ssl_connect); -#endif -PHP_FUNCTION(ftp_login); -PHP_FUNCTION(ftp_pwd); -PHP_FUNCTION(ftp_cdup); -PHP_FUNCTION(ftp_chdir); -PHP_FUNCTION(ftp_exec); -PHP_FUNCTION(ftp_raw); -PHP_FUNCTION(ftp_mkdir); -PHP_FUNCTION(ftp_rmdir); -PHP_FUNCTION(ftp_chmod); -PHP_FUNCTION(ftp_nlist); -PHP_FUNCTION(ftp_rawlist); -PHP_FUNCTION(ftp_systype); -PHP_FUNCTION(ftp_pasv); -PHP_FUNCTION(ftp_get); -PHP_FUNCTION(ftp_fget); -PHP_FUNCTION(ftp_put); -PHP_FUNCTION(ftp_fput); -PHP_FUNCTION(ftp_size); -PHP_FUNCTION(ftp_mdtm); -PHP_FUNCTION(ftp_rename); -PHP_FUNCTION(ftp_delete); -PHP_FUNCTION(ftp_site); -PHP_FUNCTION(ftp_close); -PHP_FUNCTION(ftp_set_option); -PHP_FUNCTION(ftp_get_option); -PHP_FUNCTION(ftp_nb_get); -PHP_FUNCTION(ftp_nb_fget); -PHP_FUNCTION(ftp_nb_put); -PHP_FUNCTION(ftp_nb_fput); -PHP_FUNCTION(ftp_nb_continue); - -#define phpext_ftp_ptr php_ftp_module_ptr - -#else -#define php_ftp_module_ptr NULL -#endif /* HAVE_FTP */ - -#endif |