123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623 |
- /*
- +----------------------------------------------------------------------+
- | PHP Version 7 |
- +----------------------------------------------------------------------+
- | Copyright (c) 1997-2018 The PHP Group |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.01 of the PHP license, |
- | that is bundled with this package in the file LICENSE, and is |
- | available through the world-wide-web at the following url: |
- | http://www.php.net/license/3_01.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) |
- +----------------------------------------------------------------------+
- */
- #ifdef HAVE_CONFIG_H
- #include "config.h"
- #endif
- #include "php.h"
- #ifdef HAVE_FTP_SSL
- # 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"
- /* {{{ arginfo */
- ZEND_BEGIN_ARG_INFO_EX(arginfo_ftp_connect, 0, 0, 1)
- ZEND_ARG_INFO(0, host)
- ZEND_ARG_INFO(0, port)
- ZEND_ARG_INFO(0, timeout)
- ZEND_END_ARG_INFO()
- #ifdef HAVE_FTP_SSL
- ZEND_BEGIN_ARG_INFO_EX(arginfo_ftp_ssl_connect, 0, 0, 1)
- ZEND_ARG_INFO(0, host)
- ZEND_ARG_INFO(0, port)
- ZEND_ARG_INFO(0, timeout)
- ZEND_END_ARG_INFO()
- #endif
- ZEND_BEGIN_ARG_INFO(arginfo_ftp_login, 0)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, username)
- ZEND_ARG_INFO(0, password)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_ftp_pwd, 0)
- ZEND_ARG_INFO(0, ftp)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_ftp_cdup, 0)
- ZEND_ARG_INFO(0, ftp)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_ftp_chdir, 0)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, directory)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_ftp_exec, 0)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, command)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_ftp_raw, 0)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, command)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_ftp_mkdir, 0)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, directory)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_ftp_rmdir, 0)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, directory)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_ftp_chmod, 0)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, mode)
- ZEND_ARG_INFO(0, filename)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_ftp_alloc, 0, 0, 2)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, size)
- ZEND_ARG_INFO(1, response)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_ftp_nlist, 0)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, directory)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_ftp_rawlist, 0, 0, 2)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, directory)
- ZEND_ARG_INFO(0, recursive)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_ftp_mlsd, 0)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, directory)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_ftp_systype, 0)
- ZEND_ARG_INFO(0, ftp)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_ftp_fget, 0, 0, 3)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, fp)
- ZEND_ARG_INFO(0, remote_file)
- ZEND_ARG_INFO(0, mode)
- ZEND_ARG_INFO(0, resumepos)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_ftp_nb_fget, 0, 0, 3)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, fp)
- ZEND_ARG_INFO(0, remote_file)
- ZEND_ARG_INFO(0, mode)
- ZEND_ARG_INFO(0, resumepos)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_ftp_pasv, 0, 0, 2)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, pasv)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_ftp_get, 0, 0, 3)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, local_file)
- ZEND_ARG_INFO(0, remote_file)
- ZEND_ARG_INFO(0, mode)
- ZEND_ARG_INFO(0, resume_pos)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_ftp_nb_get, 0, 0, 3)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, local_file)
- ZEND_ARG_INFO(0, remote_file)
- ZEND_ARG_INFO(0, mode)
- ZEND_ARG_INFO(0, resume_pos)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_ftp_nb_continue, 0)
- ZEND_ARG_INFO(0, ftp)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_ftp_fput, 0, 0, 3)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, remote_file)
- ZEND_ARG_INFO(0, fp)
- ZEND_ARG_INFO(0, mode)
- ZEND_ARG_INFO(0, startpos)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_ftp_nb_fput, 0, 0, 3)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, remote_file)
- ZEND_ARG_INFO(0, fp)
- ZEND_ARG_INFO(0, mode)
- ZEND_ARG_INFO(0, startpos)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_ftp_put, 0, 0, 3)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, remote_file)
- ZEND_ARG_INFO(0, local_file)
- ZEND_ARG_INFO(0, mode)
- ZEND_ARG_INFO(0, startpos)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_ftp_append, 0, 0, 3)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, remote_file)
- ZEND_ARG_INFO(0, local_file)
- ZEND_ARG_INFO(0, mode)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_ftp_nb_put, 0, 0, 3)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, remote_file)
- ZEND_ARG_INFO(0, local_file)
- ZEND_ARG_INFO(0, mode)
- ZEND_ARG_INFO(0, startpos)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_ftp_size, 0)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, filename)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_ftp_mdtm, 0)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, filename)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_ftp_rename, 0)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, src)
- ZEND_ARG_INFO(0, dest)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_ftp_delete, 0)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, file)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_ftp_site, 0)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, cmd)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_ftp_close, 0)
- ZEND_ARG_INFO(0, ftp)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_ftp_set_option, 0)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, option)
- ZEND_ARG_INFO(0, value)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_ftp_get_option, 0)
- ZEND_ARG_INFO(0, ftp)
- ZEND_ARG_INFO(0, option)
- ZEND_END_ARG_INFO()
- /* }}} */
- static const zend_function_entry php_ftp_functions[] = {
- PHP_FE(ftp_connect, arginfo_ftp_connect)
- #ifdef HAVE_FTP_SSL
- PHP_FE(ftp_ssl_connect, arginfo_ftp_ssl_connect)
- #endif
- PHP_FE(ftp_login, arginfo_ftp_login)
- PHP_FE(ftp_pwd, arginfo_ftp_pwd)
- PHP_FE(ftp_cdup, arginfo_ftp_cdup)
- PHP_FE(ftp_chdir, arginfo_ftp_chdir)
- PHP_FE(ftp_exec, arginfo_ftp_exec)
- PHP_FE(ftp_raw, arginfo_ftp_raw)
- PHP_FE(ftp_mkdir, arginfo_ftp_mkdir)
- PHP_FE(ftp_rmdir, arginfo_ftp_rmdir)
- PHP_FE(ftp_chmod, arginfo_ftp_chmod)
- PHP_FE(ftp_alloc, arginfo_ftp_alloc)
- PHP_FE(ftp_nlist, arginfo_ftp_nlist)
- PHP_FE(ftp_rawlist, arginfo_ftp_rawlist)
- PHP_FE(ftp_mlsd, arginfo_ftp_mlsd)
- PHP_FE(ftp_systype, arginfo_ftp_systype)
- PHP_FE(ftp_pasv, arginfo_ftp_pasv)
- PHP_FE(ftp_get, arginfo_ftp_get)
- PHP_FE(ftp_fget, arginfo_ftp_fget)
- PHP_FE(ftp_put, arginfo_ftp_put)
- PHP_FE(ftp_append, arginfo_ftp_append)
- PHP_FE(ftp_fput, arginfo_ftp_fput)
- PHP_FE(ftp_size, arginfo_ftp_size)
- PHP_FE(ftp_mdtm, arginfo_ftp_mdtm)
- PHP_FE(ftp_rename, arginfo_ftp_rename)
- PHP_FE(ftp_delete, arginfo_ftp_delete)
- PHP_FE(ftp_site, arginfo_ftp_site)
- PHP_FE(ftp_close, arginfo_ftp_close)
- PHP_FE(ftp_set_option, arginfo_ftp_set_option)
- PHP_FE(ftp_get_option, arginfo_ftp_get_option)
- PHP_FE(ftp_nb_fget, arginfo_ftp_nb_fget)
- PHP_FE(ftp_nb_get, arginfo_ftp_nb_get)
- PHP_FE(ftp_nb_continue, arginfo_ftp_nb_continue)
- PHP_FE(ftp_nb_put, arginfo_ftp_nb_put)
- PHP_FE(ftp_nb_fput, arginfo_ftp_nb_fput)
- PHP_FALIAS(ftp_quit, ftp_close, arginfo_ftp_close)
- PHP_FE_END
- };
- zend_module_entry php_ftp_module_entry = {
- STANDARD_MODULE_HEADER_EX,
- NULL,
- NULL,
- "ftp",
- php_ftp_functions,
- PHP_MINIT(ftp),
- NULL,
- NULL,
- NULL,
- PHP_MINFO(ftp),
- PHP_FTP_VERSION,
- STANDARD_MODULE_PROPERTIES
- };
- #if COMPILE_DL_FTP
- ZEND_GET_MODULE(php_ftp)
- #endif
- static void ftp_destructor_ftpbuf(zend_resource *rsrc)
- {
- ftpbuf_t *ftp = (ftpbuf_t *)rsrc->ptr;
- ftp_close(ftp);
- }
- PHP_MINIT_FUNCTION(ftp)
- {
- #ifdef HAVE_FTP_SSL
- SSL_library_init();
- OpenSSL_add_all_ciphers();
- OpenSSL_add_all_digests();
- OpenSSL_add_all_algorithms();
- SSL_load_error_strings();
- #endif
- 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_USEPASVADDRESS", PHP_FTP_OPT_USEPASVADDRESS, 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");
- #ifdef HAVE_FTP_SSL
- php_info_print_table_row(2, "FTPS support", "enabled");
- #else
- php_info_print_table_row(2, "FTPS support", "disabled");
- #endif
- php_info_print_table_end();
- }
- #define XTYPE(xtype, mode) { \
- if (mode != FTPTYPE_ASCII && mode != FTPTYPE_IMAGE) { \
- php_error_docref(NULL, 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;
- size_t host_len;
- zend_long port = 0;
- zend_long timeout_sec = FTP_DEFAULT_TIMEOUT;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|ll", &host, &host_len, &port, &timeout_sec) == FAILURE) {
- return;
- }
- if (timeout_sec <= 0) {
- php_error_docref(NULL, E_WARNING, "Timeout has to be greater than 0");
- RETURN_FALSE;
- }
- /* connect */
- if (!(ftp = ftp_open(host, (short)port, timeout_sec))) {
- RETURN_FALSE;
- }
- /* autoseek for resuming */
- ftp->autoseek = FTP_DEFAULT_AUTOSEEK;
- ftp->usepasvaddress = FTP_DEFAULT_USEPASVADDRESS;
- #ifdef HAVE_FTP_SSL
- /* disable ssl */
- ftp->use_ssl = 0;
- #endif
- RETURN_RES(zend_register_resource(ftp, le_ftpbuf));
- }
- /* }}} */
- #ifdef HAVE_FTP_SSL
- /* {{{ 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;
- size_t host_len;
- zend_long port = 0;
- zend_long timeout_sec = FTP_DEFAULT_TIMEOUT;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|ll", &host, &host_len, &port, &timeout_sec) == FAILURE) {
- return;
- }
- if (timeout_sec <= 0) {
- php_error_docref(NULL, E_WARNING, "Timeout has to be greater than 0");
- RETURN_FALSE;
- }
- /* connect */
- if (!(ftp = ftp_open(host, (short)port, timeout_sec))) {
- RETURN_FALSE;
- }
- /* autoseek for resuming */
- ftp->autoseek = FTP_DEFAULT_AUTOSEEK;
- ftp->usepasvaddress = FTP_DEFAULT_USEPASVADDRESS;
- /* enable ssl */
- ftp->use_ssl = 1;
- RETURN_RES(zend_register_resource(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;
- size_t user_len, pass_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rss", &z_ftp, &user, &user_len, &pass, &pass_len) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- /* log in */
- if (!ftp_login(ftp, user, user_len, pass, pass_len)) {
- php_error_docref(NULL, 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(), "r", &z_ftp) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- if (!(pwd = ftp_pwd(ftp))) {
- php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
- RETURN_FALSE;
- }
- RETURN_STRING((char*) pwd);
- }
- /* }}} */
- /* {{{ 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(), "r", &z_ftp) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- if (!ftp_cdup(ftp)) {
- php_error_docref(NULL, 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;
- size_t dir_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &dir, &dir_len) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- /* change directories */
- if (!ftp_chdir(ftp, dir, dir_len)) {
- php_error_docref(NULL, 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)
- {
- zval *z_ftp;
- ftpbuf_t *ftp;
- char *cmd;
- size_t cmd_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &cmd, &cmd_len) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- /* execute serverside command */
- if (!ftp_exec(ftp, cmd, cmd_len)) {
- php_error_docref(NULL, 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;
- size_t cmd_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &cmd, &cmd_len) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- /* execute arbitrary ftp command */
- ftp_raw(ftp, cmd, cmd_len, 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;
- zend_string *tmp;
- size_t dir_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &dir, &dir_len) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- /* create directory */
- if (NULL == (tmp = ftp_mkdir(ftp, dir, dir_len))) {
- php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
- RETURN_FALSE;
- }
- RETURN_STR(tmp);
- }
- /* }}} */
- /* {{{ proto bool ftp_rmdir(resource stream, string directory)
- Removes a directory */
- PHP_FUNCTION(ftp_rmdir)
- {
- zval *z_ftp;
- ftpbuf_t *ftp;
- char *dir;
- size_t dir_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &dir, &dir_len) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- /* remove directorie */
- if (!ftp_rmdir(ftp, dir, dir_len)) {
- php_error_docref(NULL, 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;
- size_t filename_len;
- zend_long mode;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlp", &z_ftp, &mode, &filename, &filename_len) == FAILURE) {
- RETURN_FALSE;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- if (!ftp_chmod(ftp, mode, filename, filename_len)) {
- php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
- RETURN_FALSE;
- }
- RETURN_LONG(mode);
- }
- /* }}} */
- /* {{{ proto bool ftp_alloc(resource stream, int size[, &response])
- Attempt to allocate space on the remote FTP server */
- PHP_FUNCTION(ftp_alloc)
- {
- zval *z_ftp, *zresponse = NULL;
- ftpbuf_t *ftp;
- zend_long size, ret;
- zend_string *response = NULL;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|z/", &z_ftp, &size, &zresponse) == FAILURE) {
- RETURN_FALSE;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- ret = ftp_alloc(ftp, size, zresponse ? &response : NULL);
- if (response) {
- zval_ptr_dtor(zresponse);
- ZVAL_STR(zresponse, response);
- }
- if (!ret) {
- RETURN_FALSE;
- }
- RETURN_TRUE;
- }
- /* }}} */
- /* {{{ 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;
- size_t dir_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rp", &z_ftp, &dir, &dir_len) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- /* get list of files */
- if (NULL == (nlist = ftp_nlist(ftp, dir, dir_len))) {
- RETURN_FALSE;
- }
- array_init(return_value);
- for (ptr = nlist; *ptr; ptr++) {
- add_next_index_string(return_value, *ptr);
- }
- 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;
- size_t dir_len;
- zend_bool recursive = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|b", &z_ftp, &dir, &dir_len, &recursive) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- /* get raw directory listing */
- if (NULL == (llist = ftp_list(ftp, dir, dir_len, recursive))) {
- RETURN_FALSE;
- }
- array_init(return_value);
- for (ptr = llist; *ptr; ptr++) {
- add_next_index_string(return_value, *ptr);
- }
- efree(llist);
- }
- /* }}} */
- /* {{{ proto array ftp_mlsd(resource stream, string directory)
- Returns a detailed listing of a directory as an array of parsed output lines */
- PHP_FUNCTION(ftp_mlsd)
- {
- zval *z_ftp;
- ftpbuf_t *ftp;
- char **llist, **ptr, *dir;
- size_t dir_len;
- zval entry;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &dir, &dir_len) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- /* get raw directory listing */
- if (NULL == (llist = ftp_mlsd(ftp, dir, dir_len))) {
- RETURN_FALSE;
- }
- array_init(return_value);
- for (ptr = llist; *ptr; ptr++) {
- array_init(&entry);
- if (ftp_mlsd_parse_line(Z_ARRVAL_P(&entry), *ptr) == SUCCESS) {
- zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &entry);
- } else {
- zval_ptr_dtor(&entry);
- }
- }
- 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(), "r", &z_ftp) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- if (NULL == (syst = ftp_syst(ftp))) {
- php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
- RETURN_FALSE;
- }
- RETURN_STRING((char*) syst);
- }
- /* }}} */
- /* {{{ 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;
- size_t file_len;
- zend_long mode=FTPTYPE_IMAGE, resumepos=0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrs|ll", &z_ftp, &z_file, &file, &file_len, &mode, &resumepos) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- php_stream_from_res(stream, Z_RES_P(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, file_len, xtype, resumepos)) {
- php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
- RETURN_FALSE;
- }
- RETURN_TRUE;
- }
- /* }}} */
- /* {{{ proto int 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;
- size_t file_len;
- zend_long mode=FTPTYPE_IMAGE, resumepos=0, ret;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrs|ll", &z_ftp, &z_file, &file, &file_len, &mode, &resumepos) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- php_stream_from_res(stream, Z_RES_P(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, file_len, xtype, resumepos)) == PHP_FTP_FAILED) {
- php_error_docref(NULL, 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(), "rb", &z_ftp, &pasv) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- 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;
- size_t local_len, remote_len;
- zend_long mode=FTPTYPE_IMAGE, resumepos=0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rpp|ll", &z_ftp, &local, &local_len, &remote, &remote_len, &mode, &resumepos) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- XTYPE(xtype, mode);
- /* ignore autoresume if autoseek is switched off */
- if (!ftp->autoseek && resumepos == PHP_FTP_AUTORESUME) {
- resumepos = 0;
- }
- #ifdef PHP_WIN32
- mode = FTPTYPE_IMAGE;
- #endif
- if (ftp->autoseek && resumepos) {
- outstream = php_stream_open_wrapper(local, mode == FTPTYPE_ASCII ? "rt+" : "rb+", REPORT_ERRORS, NULL);
- if (outstream == NULL) {
- outstream = php_stream_open_wrapper(local, mode == FTPTYPE_ASCII ? "wt" : "wb", REPORT_ERRORS, 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_open_wrapper(local, mode == FTPTYPE_ASCII ? "wt" : "wb", REPORT_ERRORS, NULL);
- }
- if (outstream == NULL) {
- php_error_docref(NULL, E_WARNING, "Error opening %s", local);
- RETURN_FALSE;
- }
- if (!ftp_get(ftp, outstream, remote, remote_len, xtype, resumepos)) {
- php_stream_close(outstream);
- VCWD_UNLINK(local);
- php_error_docref(NULL, 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;
- size_t local_len, remote_len;
- int ret;
- zend_long mode=FTPTYPE_IMAGE, resumepos=0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rss|ll", &z_ftp, &local, &local_len, &remote, &remote_len, &mode, &resumepos) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- XTYPE(xtype, mode);
- /* ignore autoresume if autoseek is switched off */
- if (!ftp->autoseek && resumepos == PHP_FTP_AUTORESUME) {
- resumepos = 0;
- }
- #ifdef PHP_WIN32
- mode = FTPTYPE_IMAGE;
- #endif
- if (ftp->autoseek && resumepos) {
- outstream = php_stream_open_wrapper(local, mode == FTPTYPE_ASCII ? "rt+" : "rb+", REPORT_ERRORS, NULL);
- if (outstream == NULL) {
- outstream = php_stream_open_wrapper(local, mode == FTPTYPE_ASCII ? "wt" : "wb", REPORT_ERRORS, 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_open_wrapper(local, mode == FTPTYPE_ASCII ? "wt" : "wb", REPORT_ERRORS, NULL);
- }
- if (outstream == NULL) {
- php_error_docref(NULL, 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, remote_len, xtype, resumepos)) == PHP_FTP_FAILED) {
- php_stream_close(outstream);
- ftp->stream = NULL;
- VCWD_UNLINK(local);
- php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
- RETURN_LONG(PHP_FTP_FAILED);
- }
- if (ret == PHP_FTP_FINISHED){
- php_stream_close(outstream);
- ftp->stream = NULL;
- }
- 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;
- zend_long ret;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &z_ftp) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- if (!ftp->nb) {
- php_error_docref(NULL, E_WARNING, "no nbronous transfer to continue.");
- RETURN_LONG(PHP_FTP_FAILED);
- }
- if (ftp->direction) {
- ret=ftp_nb_continue_write(ftp);
- } else {
- ret=ftp_nb_continue_read(ftp);
- }
- if (ret != PHP_FTP_MOREDATA && ftp->closestream) {
- php_stream_close(ftp->stream);
- ftp->stream = NULL;
- }
- if (ret == PHP_FTP_FAILED) {
- php_error_docref(NULL, 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;
- size_t remote_len;
- zend_long mode=FTPTYPE_IMAGE, startpos=0;
- php_stream *stream;
- char *remote;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rsr|ll", &z_ftp, &remote, &remote_len, &z_file, &mode, &startpos) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- 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, remote_len);
- if (startpos < 0) {
- startpos = 0;
- }
- }
- if (startpos) {
- php_stream_seek(stream, startpos, SEEK_SET);
- }
- }
- if (!ftp_put(ftp, remote, remote_len, stream, xtype, startpos)) {
- php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
- RETURN_FALSE;
- }
- RETURN_TRUE;
- }
- /* }}} */
- /* {{{ proto int 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;
- size_t remote_len;
- int ret;
- zend_long mode=FTPTYPE_IMAGE, startpos=0;
- php_stream *stream;
- char *remote;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rsr|ll", &z_ftp, &remote, &remote_len, &z_file, &mode, &startpos) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- php_stream_from_res(stream, Z_RES_P(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, remote_len);
- 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, remote_len, stream, xtype, startpos)) == PHP_FTP_FAILED)) {
- php_error_docref(NULL, 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;
- size_t remote_len, local_len;
- zend_long mode=FTPTYPE_IMAGE, startpos=0;
- php_stream *instream;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rpp|ll", &z_ftp, &remote, &remote_len, &local, &local_len, &mode, &startpos) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- XTYPE(xtype, mode);
- if (!(instream = php_stream_open_wrapper(local, mode == FTPTYPE_ASCII ? "rt" : "rb", REPORT_ERRORS, 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, remote_len);
- if (startpos < 0) {
- startpos = 0;
- }
- }
- if (startpos) {
- php_stream_seek(instream, startpos, SEEK_SET);
- }
- }
- if (!ftp_put(ftp, remote, remote_len, instream, xtype, startpos)) {
- php_stream_close(instream);
- php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
- RETURN_FALSE;
- }
- php_stream_close(instream);
- RETURN_TRUE;
- }
- /* }}} */
- /* {{{ proto bool ftp_append(resource stream, string remote_file, string local_file [, int mode])
- Append content of a file a another file on the FTP server */
- PHP_FUNCTION(ftp_append)
- {
- zval *z_ftp;
- ftpbuf_t *ftp;
- ftptype_t xtype;
- char *remote, *local;
- size_t remote_len, local_len;
- zend_long mode=FTPTYPE_IMAGE;
- php_stream *instream;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rpp|l", &z_ftp, &remote, &remote_len, &local, &local_len, &mode) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- XTYPE(xtype, mode);
- if (!(instream = php_stream_open_wrapper(local, mode == FTPTYPE_ASCII ? "rt" : "rb", REPORT_ERRORS, NULL))) {
- RETURN_FALSE;
- }
- if (!ftp_append(ftp, remote, remote_len, instream, xtype)) {
- php_stream_close(instream);
- php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
- RETURN_FALSE;
- }
- php_stream_close(instream);
- RETURN_TRUE;
- }
- /* }}} */
- /* {{{ proto int 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;
- size_t remote_len, local_len;
- zend_long mode=FTPTYPE_IMAGE, startpos=0, ret;
- php_stream *instream;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rpp|ll", &z_ftp, &remote, &remote_len, &local, &local_len, &mode, &startpos) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- XTYPE(xtype, mode);
- if (!(instream = php_stream_open_wrapper(local, mode == FTPTYPE_ASCII ? "rt" : "rb", REPORT_ERRORS, 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, remote_len);
- 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, remote_len, instream, xtype, startpos);
- if (ret != PHP_FTP_MOREDATA) {
- php_stream_close(instream);
- ftp->stream = NULL;
- }
- if (ret == PHP_FTP_FAILED) {
- php_error_docref(NULL, 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;
- size_t file_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rp", &z_ftp, &file, &file_len) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- /* get file size */
- RETURN_LONG(ftp_size(ftp, file, file_len));
- }
- /* }}} */
- /* {{{ 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;
- size_t file_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rp", &z_ftp, &file, &file_len) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- /* get file mod time */
- RETURN_LONG(ftp_mdtm(ftp, file, file_len));
- }
- /* }}} */
- /* {{{ 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;
- size_t src_len, dest_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rss", &z_ftp, &src, &src_len, &dest, &dest_len) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- /* rename the file */
- if (!ftp_rename(ftp, src, src_len, dest, dest_len)) {
- php_error_docref(NULL, 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;
- size_t file_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &file, &file_len) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- /* delete the file */
- if (!ftp_delete(ftp, file, file_len)) {
- php_error_docref(NULL, 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;
- size_t cmd_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &z_ftp, &cmd, &cmd_len) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- /* send the site command */
- if (!ftp_site(ftp, cmd, cmd_len)) {
- php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
- RETURN_FALSE;
- }
- RETURN_TRUE;
- }
- /* }}} */
- /* {{{ proto bool 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(), "r", &z_ftp) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- ftp_quit(ftp);
- RETURN_BOOL(zend_list_close(Z_RES_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;
- zend_long option;
- ftpbuf_t *ftp;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlz", &z_ftp, &option, &z_value) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- switch (option) {
- case PHP_FTP_OPT_TIMEOUT_SEC:
- if (Z_TYPE_P(z_value) != IS_LONG) {
- php_error_docref(NULL, E_WARNING, "Option TIMEOUT_SEC expects value of type int, %s given",
- zend_zval_type_name(z_value));
- RETURN_FALSE;
- }
- if (Z_LVAL_P(z_value) <= 0) {
- php_error_docref(NULL, 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_TRUE && Z_TYPE_P(z_value) != IS_FALSE) {
- php_error_docref(NULL, E_WARNING, "Option AUTOSEEK expects value of type bool, %s given",
- zend_zval_type_name(z_value));
- RETURN_FALSE;
- }
- ftp->autoseek = Z_TYPE_P(z_value) == IS_TRUE ? 1 : 0;
- RETURN_TRUE;
- break;
- case PHP_FTP_OPT_USEPASVADDRESS:
- if (Z_TYPE_P(z_value) != IS_TRUE && Z_TYPE_P(z_value) != IS_FALSE) {
- php_error_docref(NULL, E_WARNING, "Option USEPASVADDRESS expects value of type bool, %s given",
- zend_zval_type_name(z_value));
- RETURN_FALSE;
- }
- ftp->usepasvaddress = Z_TYPE_P(z_value) == IS_TRUE ? 1 : 0;
- RETURN_TRUE;
- break;
- default:
- php_error_docref(NULL, E_WARNING, "Unknown option '" ZEND_LONG_FMT "'", 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;
- zend_long option;
- ftpbuf_t *ftp;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &z_ftp, &option) == FAILURE) {
- return;
- }
- if ((ftp = (ftpbuf_t *)zend_fetch_resource(Z_RES_P(z_ftp), le_ftpbuf_name, le_ftpbuf)) == NULL) {
- RETURN_FALSE;
- }
- switch (option) {
- case PHP_FTP_OPT_TIMEOUT_SEC:
- RETURN_LONG(ftp->timeout_sec);
- break;
- case PHP_FTP_OPT_AUTOSEEK:
- RETURN_BOOL(ftp->autoseek);
- break;
- case PHP_FTP_OPT_USEPASVADDRESS:
- RETURN_BOOL(ftp->usepasvaddress);
- break;
- default:
- php_error_docref(NULL, E_WARNING, "Unknown option '" ZEND_LONG_FMT "'", option);
- RETURN_FALSE;
- break;
- }
- }
- /* }}} */
- #endif /* HAVE_FTP */
- /*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * indent-tabs-mode: t
- * End:
- */
|