summaryrefslogtreecommitdiff
path: root/ext/ftp/ftp.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/ftp/ftp.c')
-rw-r--r--ext/ftp/ftp.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/ext/ftp/ftp.c b/ext/ftp/ftp.c
index 499a8b40b2..d1fffc2b2f 100644
--- a/ext/ftp/ftp.c
+++ b/ext/ftp/ftp.c
@@ -1056,6 +1056,74 @@ bail:
}
/* }}} */
+
+/* {{{ ftp_append
+ */
+int
+ftp_append(ftpbuf_t *ftp, const char *path, const size_t path_len, php_stream *instream, ftptype_t type)
+{
+ databuf_t *data = NULL;
+ zend_long size;
+ char *ptr;
+ int ch;
+
+ if (ftp == NULL) {
+ return 0;
+ }
+ if (!ftp_type(ftp, type)) {
+ goto bail;
+ }
+ if ((data = ftp_getdata(ftp)) == NULL) {
+ goto bail;
+ }
+ ftp->data = data;
+
+ if (!ftp_putcmd(ftp, "APPE", sizeof("APPE")-1, path, path_len)) {
+ goto bail;
+ }
+ if (!ftp_getresp(ftp) || (ftp->resp != 150 && ftp->resp != 125)) {
+ goto bail;
+ }
+ if ((data = data_accept(data, ftp)) == 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;
+ }
+ ftp->data = data = data_close(ftp, data);
+
+ if (!ftp_getresp(ftp) || (ftp->resp != 226 && ftp->resp != 250 && ftp->resp != 200)) {
+ goto bail;
+ }
+ return 1;
+bail:
+ ftp->data = data_close(ftp, data);
+ return 0;
+}
+/* }}} */
+
/* {{{ ftp_size
*/
zend_long