1*6236dae4SAndroid Build Coastguard Worker #ifndef HEADER_CURL_FTP_H 2*6236dae4SAndroid Build Coastguard Worker #define HEADER_CURL_FTP_H 3*6236dae4SAndroid Build Coastguard Worker /*************************************************************************** 4*6236dae4SAndroid Build Coastguard Worker * _ _ ____ _ 5*6236dae4SAndroid Build Coastguard Worker * Project ___| | | | _ \| | 6*6236dae4SAndroid Build Coastguard Worker * / __| | | | |_) | | 7*6236dae4SAndroid Build Coastguard Worker * | (__| |_| | _ <| |___ 8*6236dae4SAndroid Build Coastguard Worker * \___|\___/|_| \_\_____| 9*6236dae4SAndroid Build Coastguard Worker * 10*6236dae4SAndroid Build Coastguard Worker * Copyright (C) Daniel Stenberg, <[email protected]>, et al. 11*6236dae4SAndroid Build Coastguard Worker * 12*6236dae4SAndroid Build Coastguard Worker * This software is licensed as described in the file COPYING, which 13*6236dae4SAndroid Build Coastguard Worker * you should have received as part of this distribution. The terms 14*6236dae4SAndroid Build Coastguard Worker * are also available at https://curl.se/docs/copyright.html. 15*6236dae4SAndroid Build Coastguard Worker * 16*6236dae4SAndroid Build Coastguard Worker * You may opt to use, copy, modify, merge, publish, distribute and/or sell 17*6236dae4SAndroid Build Coastguard Worker * copies of the Software, and permit persons to whom the Software is 18*6236dae4SAndroid Build Coastguard Worker * furnished to do so, under the terms of the COPYING file. 19*6236dae4SAndroid Build Coastguard Worker * 20*6236dae4SAndroid Build Coastguard Worker * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 21*6236dae4SAndroid Build Coastguard Worker * KIND, either express or implied. 22*6236dae4SAndroid Build Coastguard Worker * 23*6236dae4SAndroid Build Coastguard Worker * SPDX-License-Identifier: curl 24*6236dae4SAndroid Build Coastguard Worker * 25*6236dae4SAndroid Build Coastguard Worker ***************************************************************************/ 26*6236dae4SAndroid Build Coastguard Worker 27*6236dae4SAndroid Build Coastguard Worker #include "curl_setup.h" 28*6236dae4SAndroid Build Coastguard Worker 29*6236dae4SAndroid Build Coastguard Worker #include "pingpong.h" 30*6236dae4SAndroid Build Coastguard Worker 31*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_FTP 32*6236dae4SAndroid Build Coastguard Worker extern const struct Curl_handler Curl_handler_ftp; 33*6236dae4SAndroid Build Coastguard Worker 34*6236dae4SAndroid Build Coastguard Worker #ifdef USE_SSL 35*6236dae4SAndroid Build Coastguard Worker extern const struct Curl_handler Curl_handler_ftps; 36*6236dae4SAndroid Build Coastguard Worker #endif 37*6236dae4SAndroid Build Coastguard Worker 38*6236dae4SAndroid Build Coastguard Worker CURLcode Curl_GetFTPResponse(struct Curl_easy *data, ssize_t *nread, 39*6236dae4SAndroid Build Coastguard Worker int *ftpcode); 40*6236dae4SAndroid Build Coastguard Worker #endif /* CURL_DISABLE_FTP */ 41*6236dae4SAndroid Build Coastguard Worker 42*6236dae4SAndroid Build Coastguard Worker /**************************************************************************** 43*6236dae4SAndroid Build Coastguard Worker * FTP unique setup 44*6236dae4SAndroid Build Coastguard Worker ***************************************************************************/ 45*6236dae4SAndroid Build Coastguard Worker enum { 46*6236dae4SAndroid Build Coastguard Worker FTP_STOP, /* do nothing state, stops the state machine */ 47*6236dae4SAndroid Build Coastguard Worker FTP_WAIT220, /* waiting for the initial 220 response immediately after 48*6236dae4SAndroid Build Coastguard Worker a connect */ 49*6236dae4SAndroid Build Coastguard Worker FTP_AUTH, 50*6236dae4SAndroid Build Coastguard Worker FTP_USER, 51*6236dae4SAndroid Build Coastguard Worker FTP_PASS, 52*6236dae4SAndroid Build Coastguard Worker FTP_ACCT, 53*6236dae4SAndroid Build Coastguard Worker FTP_PBSZ, 54*6236dae4SAndroid Build Coastguard Worker FTP_PROT, 55*6236dae4SAndroid Build Coastguard Worker FTP_CCC, 56*6236dae4SAndroid Build Coastguard Worker FTP_PWD, 57*6236dae4SAndroid Build Coastguard Worker FTP_SYST, 58*6236dae4SAndroid Build Coastguard Worker FTP_NAMEFMT, 59*6236dae4SAndroid Build Coastguard Worker FTP_QUOTE, /* waiting for a response to a command sent in a quote list */ 60*6236dae4SAndroid Build Coastguard Worker FTP_RETR_PREQUOTE, 61*6236dae4SAndroid Build Coastguard Worker FTP_STOR_PREQUOTE, 62*6236dae4SAndroid Build Coastguard Worker FTP_POSTQUOTE, 63*6236dae4SAndroid Build Coastguard Worker FTP_CWD, /* change dir */ 64*6236dae4SAndroid Build Coastguard Worker FTP_MKD, /* if the dir did not exist */ 65*6236dae4SAndroid Build Coastguard Worker FTP_MDTM, /* to figure out the datestamp */ 66*6236dae4SAndroid Build Coastguard Worker FTP_TYPE, /* to set type when doing a head-like request */ 67*6236dae4SAndroid Build Coastguard Worker FTP_LIST_TYPE, /* set type when about to do a dir list */ 68*6236dae4SAndroid Build Coastguard Worker FTP_RETR_TYPE, /* set type when about to RETR a file */ 69*6236dae4SAndroid Build Coastguard Worker FTP_STOR_TYPE, /* set type when about to STOR a file */ 70*6236dae4SAndroid Build Coastguard Worker FTP_SIZE, /* get the remote file's size for head-like request */ 71*6236dae4SAndroid Build Coastguard Worker FTP_RETR_SIZE, /* get the remote file's size for RETR */ 72*6236dae4SAndroid Build Coastguard Worker FTP_STOR_SIZE, /* get the size for STOR */ 73*6236dae4SAndroid Build Coastguard Worker FTP_REST, /* when used to check if the server supports it in head-like */ 74*6236dae4SAndroid Build Coastguard Worker FTP_RETR_REST, /* when asking for "resume" in for RETR */ 75*6236dae4SAndroid Build Coastguard Worker FTP_PORT, /* generic state for PORT, LPRT and EPRT, check count1 */ 76*6236dae4SAndroid Build Coastguard Worker FTP_PRET, /* generic state for PRET RETR, PRET STOR and PRET LIST/NLST */ 77*6236dae4SAndroid Build Coastguard Worker FTP_PASV, /* generic state for PASV and EPSV, check count1 */ 78*6236dae4SAndroid Build Coastguard Worker FTP_LIST, /* generic state for LIST, NLST or a custom list command */ 79*6236dae4SAndroid Build Coastguard Worker FTP_RETR, 80*6236dae4SAndroid Build Coastguard Worker FTP_STOR, /* generic state for STOR and APPE */ 81*6236dae4SAndroid Build Coastguard Worker FTP_QUIT, 82*6236dae4SAndroid Build Coastguard Worker FTP_LAST /* never used */ 83*6236dae4SAndroid Build Coastguard Worker }; 84*6236dae4SAndroid Build Coastguard Worker typedef unsigned char ftpstate; /* use the enum values */ 85*6236dae4SAndroid Build Coastguard Worker 86*6236dae4SAndroid Build Coastguard Worker struct ftp_parselist_data; /* defined later in ftplistparser.c */ 87*6236dae4SAndroid Build Coastguard Worker 88*6236dae4SAndroid Build Coastguard Worker struct ftp_wc { 89*6236dae4SAndroid Build Coastguard Worker struct ftp_parselist_data *parser; 90*6236dae4SAndroid Build Coastguard Worker 91*6236dae4SAndroid Build Coastguard Worker struct { 92*6236dae4SAndroid Build Coastguard Worker curl_write_callback write_function; 93*6236dae4SAndroid Build Coastguard Worker FILE *file_descriptor; 94*6236dae4SAndroid Build Coastguard Worker } backup; 95*6236dae4SAndroid Build Coastguard Worker }; 96*6236dae4SAndroid Build Coastguard Worker 97*6236dae4SAndroid Build Coastguard Worker typedef enum { 98*6236dae4SAndroid Build Coastguard Worker FTPFILE_MULTICWD = 1, /* as defined by RFC1738 */ 99*6236dae4SAndroid Build Coastguard Worker FTPFILE_NOCWD = 2, /* use SIZE / RETR / STOR on the full path */ 100*6236dae4SAndroid Build Coastguard Worker FTPFILE_SINGLECWD = 3 /* make one CWD, then SIZE / RETR / STOR on the 101*6236dae4SAndroid Build Coastguard Worker file */ 102*6236dae4SAndroid Build Coastguard Worker } curl_ftpfile; 103*6236dae4SAndroid Build Coastguard Worker 104*6236dae4SAndroid Build Coastguard Worker /* This FTP struct is used in the Curl_easy. All FTP data that is 105*6236dae4SAndroid Build Coastguard Worker connection-oriented must be in FTP_conn to properly deal with the fact that 106*6236dae4SAndroid Build Coastguard Worker perhaps the Curl_easy is changed between the times the connection is 107*6236dae4SAndroid Build Coastguard Worker used. */ 108*6236dae4SAndroid Build Coastguard Worker struct FTP { 109*6236dae4SAndroid Build Coastguard Worker char *path; /* points to the urlpieces struct field */ 110*6236dae4SAndroid Build Coastguard Worker char *pathalloc; /* if non-NULL a pointer to an allocated path */ 111*6236dae4SAndroid Build Coastguard Worker 112*6236dae4SAndroid Build Coastguard Worker /* transfer a file/body or not, done as a typedefed enum just to make 113*6236dae4SAndroid Build Coastguard Worker debuggers display the full symbol and not just the numerical value */ 114*6236dae4SAndroid Build Coastguard Worker curl_pp_transfer transfer; 115*6236dae4SAndroid Build Coastguard Worker curl_off_t downloadsize; 116*6236dae4SAndroid Build Coastguard Worker }; 117*6236dae4SAndroid Build Coastguard Worker 118*6236dae4SAndroid Build Coastguard Worker 119*6236dae4SAndroid Build Coastguard Worker /* ftp_conn is used for struct connection-oriented data in the connectdata 120*6236dae4SAndroid Build Coastguard Worker struct */ 121*6236dae4SAndroid Build Coastguard Worker struct ftp_conn { 122*6236dae4SAndroid Build Coastguard Worker struct pingpong pp; 123*6236dae4SAndroid Build Coastguard Worker char *account; 124*6236dae4SAndroid Build Coastguard Worker char *alternative_to_user; 125*6236dae4SAndroid Build Coastguard Worker char *entrypath; /* the PWD reply when we logged on */ 126*6236dae4SAndroid Build Coastguard Worker char *file; /* url-decoded filename (or path) */ 127*6236dae4SAndroid Build Coastguard Worker char **dirs; /* realloc()ed array for path components */ 128*6236dae4SAndroid Build Coastguard Worker char *newhost; 129*6236dae4SAndroid Build Coastguard Worker char *prevpath; /* url-decoded conn->path from the previous transfer */ 130*6236dae4SAndroid Build Coastguard Worker char transfertype; /* set by ftp_transfertype for use by Curl_client_write()a 131*6236dae4SAndroid Build Coastguard Worker and others (A/I or zero) */ 132*6236dae4SAndroid Build Coastguard Worker curl_off_t retr_size_saved; /* Size of retrieved file saved */ 133*6236dae4SAndroid Build Coastguard Worker char *server_os; /* The target server operating system. */ 134*6236dae4SAndroid Build Coastguard Worker curl_off_t known_filesize; /* file size is different from -1, if wildcard 135*6236dae4SAndroid Build Coastguard Worker LIST parsing was done and wc_statemach set 136*6236dae4SAndroid Build Coastguard Worker it */ 137*6236dae4SAndroid Build Coastguard Worker int dirdepth; /* number of entries used in the 'dirs' array */ 138*6236dae4SAndroid Build Coastguard Worker int cwdcount; /* number of CWD commands issued */ 139*6236dae4SAndroid Build Coastguard Worker int count1; /* general purpose counter for the state machine */ 140*6236dae4SAndroid Build Coastguard Worker int count2; /* general purpose counter for the state machine */ 141*6236dae4SAndroid Build Coastguard Worker int count3; /* general purpose counter for the state machine */ 142*6236dae4SAndroid Build Coastguard Worker /* newhost is the (allocated) IP addr or hostname to connect the data 143*6236dae4SAndroid Build Coastguard Worker connection to */ 144*6236dae4SAndroid Build Coastguard Worker unsigned short newport; 145*6236dae4SAndroid Build Coastguard Worker ftpstate state; /* always use ftp.c:state() to change state! */ 146*6236dae4SAndroid Build Coastguard Worker ftpstate state_saved; /* transfer type saved to be reloaded after data 147*6236dae4SAndroid Build Coastguard Worker connection is established */ 148*6236dae4SAndroid Build Coastguard Worker unsigned char use_ssl; /* if AUTH TLS is to be attempted etc, for FTP or 149*6236dae4SAndroid Build Coastguard Worker IMAP or POP3 or others! (type: curl_usessl)*/ 150*6236dae4SAndroid Build Coastguard Worker unsigned char ccc; /* ccc level for this connection */ 151*6236dae4SAndroid Build Coastguard Worker BIT(ftp_trying_alternative); 152*6236dae4SAndroid Build Coastguard Worker BIT(dont_check); /* Set to TRUE to prevent the final (post-transfer) 153*6236dae4SAndroid Build Coastguard Worker file size and 226/250 status check. It should still 154*6236dae4SAndroid Build Coastguard Worker read the line, just ignore the result. */ 155*6236dae4SAndroid Build Coastguard Worker BIT(ctl_valid); /* Tells Curl_ftp_quit() whether or not to do anything. If 156*6236dae4SAndroid Build Coastguard Worker the connection has timed out or been closed, this 157*6236dae4SAndroid Build Coastguard Worker should be FALSE when it gets to Curl_ftp_quit() */ 158*6236dae4SAndroid Build Coastguard Worker BIT(cwddone); /* if it has been determined that the proper CWD combo 159*6236dae4SAndroid Build Coastguard Worker already has been done */ 160*6236dae4SAndroid Build Coastguard Worker BIT(cwdfail); /* set TRUE if a CWD command fails, as then we must prevent 161*6236dae4SAndroid Build Coastguard Worker caching the current directory */ 162*6236dae4SAndroid Build Coastguard Worker BIT(wait_data_conn); /* this is set TRUE if data connection is waited */ 163*6236dae4SAndroid Build Coastguard Worker }; 164*6236dae4SAndroid Build Coastguard Worker 165*6236dae4SAndroid Build Coastguard Worker #define DEFAULT_ACCEPT_TIMEOUT 60000 /* milliseconds == one minute */ 166*6236dae4SAndroid Build Coastguard Worker 167*6236dae4SAndroid Build Coastguard Worker #endif /* HEADER_CURL_FTP_H */ 168