1 /*
2 +----------------------------------------------------------------------+
3 | PHP Version 7 |
4 +----------------------------------------------------------------------+
5 | Copyright (c) 1997-2016 The PHP Group |
6 +----------------------------------------------------------------------+
7 | This source file is subject to version 3.01 of the PHP license, |
8 | that is bundled with this package in the file LICENSE, and is |
9 | available through the world-wide-web at the following url: |
10 | http://www.php.net/license/3_01.txt |
11 | If you did not receive a copy of the PHP license and are unable to |
12 | obtain it through the world-wide-web, please send a note to |
13 | license@php.net so we can mail you a copy immediately. |
14 +----------------------------------------------------------------------+
15 | Authors: Andrew Skalski <askalski@chek.com> |
16 | Stefan Esser <sesser@php.net> (resume functions) |
17 +----------------------------------------------------------------------+
18 */
19
20 /* $Id$ */
21
22 #ifndef FTP_H
23 #define FTP_H
24
25 #include "php_network.h"
26
27 #include <stdio.h>
28 #ifdef HAVE_NETINET_IN_H
29 #include <netinet/in.h>
30 #endif
31
32 #define FTP_DEFAULT_TIMEOUT 90
33 #define FTP_DEFAULT_AUTOSEEK 1
34 #define FTP_DEFAULT_USEPASVADDRESS 1
35 #define PHP_FTP_FAILED 0
36 #define PHP_FTP_FINISHED 1
37 #define PHP_FTP_MOREDATA 2
38
39 /* XXX this should be configurable at runtime XXX */
40 #define FTP_BUFSIZE 4096
41
42 typedef enum ftptype {
43 FTPTYPE_ASCII=1,
44 FTPTYPE_IMAGE
45 } ftptype_t;
46
47 typedef struct databuf
48 {
49 int listener; /* listener socket */
50 php_socket_t fd; /* data connection */
51 ftptype_t type; /* transfer type */
52 char buf[FTP_BUFSIZE]; /* data buffer */
53 #ifdef HAVE_FTP_SSL
54 SSL *ssl_handle; /* ssl handle */
55 int ssl_active; /* flag if ssl is active or not */
56 #endif
57 } databuf_t;
58
59 typedef struct ftpbuf
60 {
61 php_socket_t fd; /* control connection */
62 php_sockaddr_storage localaddr; /* local address */
63 int resp; /* last response code */
64 char inbuf[FTP_BUFSIZE]; /* last response text */
65 char *extra; /* extra characters */
66 int extralen; /* number of extra chars */
67 char outbuf[FTP_BUFSIZE]; /* command output buffer */
68 char *pwd; /* cached pwd */
69 char *syst; /* cached system type */
70 ftptype_t type; /* current transfer type */
71 int pasv; /* 0=off; 1=pasv; 2=ready */
72 php_sockaddr_storage pasvaddr; /* passive mode address */
73 zend_long timeout_sec; /* User configurable timeout (seconds) */
74 int autoseek; /* User configurable autoseek flag */
75 int usepasvaddress; /* Use the address returned by the pasv command */
76
77 int nb; /* "nonblocking" transfer in progress */
78 databuf_t *data; /* Data connection for "nonblocking" transfers */
79 php_stream *stream; /* output stream for "nonblocking" transfers */
80 int lastch; /* last char of previous call */
81 int direction; /* recv = 0 / send = 1 */
82 int closestream;/* close or not close stream */
83 #ifdef HAVE_FTP_SSL
84 int use_ssl; /* enable(1) or disable(0) ssl */
85 int use_ssl_for_data; /* en/disable ssl for the dataconnection */
86 int old_ssl; /* old mode = forced data encryption */
87 SSL *ssl_handle; /* handle for control connection */
88 int ssl_active; /* ssl active on control conn */
89 #endif
90
91 } ftpbuf_t;
92
93
94
95 /* open a FTP connection, returns ftpbuf (NULL on error)
96 * port is the ftp port in network byte order, or 0 for the default
97 */
98 ftpbuf_t* ftp_open(const char *host, short port, zend_long timeout_sec);
99
100 /* quits from the ftp session (it still needs to be closed)
101 * return true on success, false on error
102 */
103 int ftp_quit(ftpbuf_t *ftp);
104
105 /* frees up any cached data held in the ftp buffer */
106 void ftp_gc(ftpbuf_t *ftp);
107
108 /* close the FTP connection and return NULL */
109 ftpbuf_t* ftp_close(ftpbuf_t *ftp);
110
111 /* logs into the FTP server, returns true on success, false on error */
112 int ftp_login(ftpbuf_t *ftp, const char *user, const char *pass);
113
114 /* reinitializes the connection, returns true on success, false on error */
115 int ftp_reinit(ftpbuf_t *ftp);
116
117 /* returns the remote system type (NULL on error) */
118 const char* ftp_syst(ftpbuf_t *ftp);
119
120 /* returns the present working directory (NULL on error) */
121 const char* ftp_pwd(ftpbuf_t *ftp);
122
123 /* exec a command [special features], return true on success, false on error */
124 int ftp_exec(ftpbuf_t *ftp, const char *cmd);
125
126 /* send a raw ftp command, return response as a hashtable, NULL on error */
127 void ftp_raw(ftpbuf_t *ftp, const char *cmd, zval *return_value);
128
129 /* changes directories, return true on success, false on error */
130 int ftp_chdir(ftpbuf_t *ftp, const char *dir);
131
132 /* changes to parent directory, return true on success, false on error */
133 int ftp_cdup(ftpbuf_t *ftp);
134
135 /* creates a directory, return the directory name on success, NULL on error.
136 * the return value must be freed
137 */
138 zend_string* ftp_mkdir(ftpbuf_t *ftp, const char *dir);
139
140 /* removes a directory, return true on success, false on error */
141 int ftp_rmdir(ftpbuf_t *ftp, const char *dir);
142
143 /* Set permissions on a file */
144 int ftp_chmod(ftpbuf_t *ftp, const int mode, const char *filename, const int filename_len);
145
146 /* Allocate space on remote server with ALLO command
147 * Many servers will respond with 202 Allocation not necessary,
148 * however some servers will not accept STOR or APPE until ALLO is confirmed.
149 * If response is passed, it is estrdup()ed from ftp->inbuf and must be freed
150 * or assigned to a zval returned to the user */
151 int ftp_alloc(ftpbuf_t *ftp, const zend_long size, zend_string **response);
152
153 /* returns a NULL-terminated array of filenames in the given path
154 * or NULL on error. the return array must be freed (but don't
155 * free the array elements)
156 */
157 char** ftp_nlist(ftpbuf_t *ftp, const char *path);
158
159 /* returns a NULL-terminated array of lines returned by the ftp
160 * LIST command for the given path or NULL on error. the return
161 * array must be freed (but don't
162 * free the array elements)
163 */
164 char** ftp_list(ftpbuf_t *ftp, const char *path, int recursive);
165
166 /* switches passive mode on or off
167 * returns true on success, false on error
168 */
169 int ftp_pasv(ftpbuf_t *ftp, int pasv);
170
171 /* retrieves a file and saves its contents to outfp
172 * returns true on success, false on error
173 */
174 int ftp_get(ftpbuf_t *ftp, php_stream *outstream, const char *path, ftptype_t type, zend_long resumepos);
175
176 /* stores the data from a file, socket, or process as a file on the remote server
177 * returns true on success, false on error
178 */
179 int ftp_put(ftpbuf_t *ftp, const char *path, php_stream *instream, ftptype_t type, zend_long startpos);
180
181 /* returns the size of the given file, or -1 on error */
182 zend_long ftp_size(ftpbuf_t *ftp, const char *path);
183
184 /* returns the last modified time of the given file, or -1 on error */
185 time_t ftp_mdtm(ftpbuf_t *ftp, const char *path);
186
187 /* renames a file on the server */
188 int ftp_rename(ftpbuf_t *ftp, const char *src, const char *dest);
189
190 /* deletes the file from the server */
191 int ftp_delete(ftpbuf_t *ftp, const char *path);
192
193 /* sends a SITE command to the server */
194 int ftp_site(ftpbuf_t *ftp, const char *cmd);
195
196 /* retrieves part of a file and saves its contents to outfp
197 * returns true on success, false on error
198 */
199 int ftp_nb_get(ftpbuf_t *ftp, php_stream *outstream, const char *path, ftptype_t type, zend_long resumepos);
200
201 /* stores the data from a file, socket, or process as a file on the remote server
202 * returns true on success, false on error
203 */
204 int ftp_nb_put(ftpbuf_t *ftp, const char *path, php_stream *instream, ftptype_t type, zend_long startpos);
205
206 /* continues a previous nb_(f)get command
207 */
208 int ftp_nb_continue_read(ftpbuf_t *ftp);
209
210 /* continues a previous nb_(f)put command
211 */
212 int ftp_nb_continue_write(ftpbuf_t *ftp);
213
214
215 #endif