📄 php_ftp.c
字号:
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)) { 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 (php_check_open_basedir(local TSRMLS_CC)) { RETURN_FALSE; }#ifdef PHP_WIN32 mode = FTPTYPE_IMAGE;#endif if (ftp->autoseek && resumepos) { if (PG(safe_mode) && (!php_checkuid(local, mode == FTPTYPE_ASCII ? "rt+" : "rb+", CHECKUID_CHECK_MODE_PARAM))) { RETURN_FALSE; } outstream = php_stream_fopen(local, mode == FTPTYPE_ASCII ? "rt+" : "rb+", NULL); if (outstream == NULL) { if (PG(safe_mode) && (!php_checkuid(local, mode == FTPTYPE_ASCII ? "wt" : "wb", CHECKUID_CHECK_MODE_PARAM))) { RETURN_FALSE; } outstream = php_stream_fopen(local, mode == FTPTYPE_ASCII ? "wt" : "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 { if (PG(safe_mode) && (!php_checkuid(local, mode == FTPTYPE_ASCII ? "wt" : "wb", CHECKUID_CHECK_MODE_PARAM))) { RETURN_FALSE; } outstream = php_stream_fopen(local, mode == FTPTYPE_ASCII ? "wt" : "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)) { php_stream_close(outstream); VCWD_UNLINK(local); 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 (php_check_open_basedir(local TSRMLS_CC)) { RETURN_FALSE; } if (ftp->autoseek && resumepos) { if (PG(safe_mode) && (!php_checkuid(local, mode == FTPTYPE_ASCII ? "rt+" : "rb+", CHECKUID_CHECK_MODE_PARAM))) { RETURN_FALSE; } outstream = php_stream_fopen(local, mode == FTPTYPE_ASCII ? "rt+" : "rb+", NULL); if (outstream == NULL) { if (PG(safe_mode) && (!php_checkuid(local, mode == FTPTYPE_ASCII ? "wt" : "wb", CHECKUID_CHECK_MODE_PARAM))) { RETURN_FALSE; } outstream = php_stream_fopen(local, mode == FTPTYPE_ASCII ? "wt" : "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 { if (PG(safe_mode) && (!php_checkuid(local, mode == FTPTYPE_ASCII ? "wt" : "wb", CHECKUID_CHECK_MODE_PARAM))) { RETURN_FALSE; } outstream = php_stream_fopen(local, mode == FTPTYPE_ASCII ? "wt" : "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); VCWD_UNLINK(local); 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); } else { ret=ftp_nb_continue_read(ftp); } 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)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); RETURN_FALSE; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -