root/ext/ftp/ftp.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   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

/* [<][>][^][v][top][bottom][index][help] */