xref: /PHP-5.6/ext/ftp/ftp.h (revision 49493a2d)
1 /*
2    +----------------------------------------------------------------------+
3    | PHP Version 5                                                        |
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 #if HAVE_OPENSSL_EXT
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 	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 #if HAVE_OPENSSL_EXT
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, long timeout_sec TSRMLS_DC);
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 TSRMLS_DC);
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 char*		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 long size, char **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 TSRMLS_DC);
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 TSRMLS_DC);
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, long resumepos TSRMLS_DC);
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, long startpos TSRMLS_DC);
180 
181 /* returns the size of the given file, or -1 on error */
182 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, long resumepos TSRMLS_DC);
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, long startpos TSRMLS_DC);
205 
206 /* continues a previous nb_(f)get command
207  */
208 int		ftp_nb_continue_read(ftpbuf_t *ftp TSRMLS_DC);
209 
210 /* continues a previous nb_(f)put command
211  */
212 int		ftp_nb_continue_write(ftpbuf_t *ftp TSRMLS_DC);
213 
214 
215 #endif
216