25 #ifndef CURL_DISABLE_FTP 27 #ifdef HAVE_NETINET_IN_H 28 #include <netinet/in.h> 30 #ifdef HAVE_ARPA_INET_H 31 #include <arpa/inet.h> 34 #include <sys/utsname.h> 44 #if (defined(NETWARE) && defined(__NOVELL_LIBC__)) 46 #define in_addr_t unsigned long 86 #define NI_MAXHOST 1025 88 #ifndef INET_ADDRSTRLEN 89 #define INET_ADDRSTRLEN 16 92 #ifdef CURL_DISABLE_VERBOSE_STRINGS 93 #define ftp_pasv_verbose(a,b,c,d) Curl_nop_stmt 100 #define state(x,y) _state(x,y) 105 #define state(x,y) _state(x,y,__LINE__) 113 #ifndef CURL_DISABLE_VERBOSE_STRINGS 157 #define PPSENDF(x,y,z) result = Curl_pp_sendf(x,y,z); \ 236 #define CURL_FTP_HTTPSTYLE_HEAD 1 242 for(i = 0; i < ftpc->
dirdepth; i++) {
244 ftpc->
dirs[
i] = NULL;
264 return ((NULL != strchr(
string,
'\r')) ||
265 (NULL != strchr(
string,
'\n'))) ?
TRUE :
FALSE;
284 struct sockaddr_in add;
288 if(0 == getsockname(sock, (
struct sockaddr *) &add, &size)) {
291 s = accept(sock, (
struct sockaddr *) &add, &size);
296 failf(data,
"Error accept()ing server connect");
299 infof(data,
"Connection accepted from server\n");
348 if(other && (other < timeout_ms))
388 infof(data,
"Checking for server connect\n");
391 failf(data,
"Accept timeout occurred while waiting server connect");
398 infof(data,
"There is negative response in cache while serv connect\n");
409 failf(data,
"Error while waiting for server connect");
416 infof(data,
"Ready to accept data connection from server\n");
420 infof(data,
"Ctrl conn has data while waiting for data conn\n");
453 infof(data,
"Doing the SSL/TLS handshake on the data stream\n");
502 infof(data,
"Preparing for accepting server on data port\n");
510 failf(data,
"Accept timeout occurred while waiting server connect");
530 if(!result && *connected ==
FALSE) {
541 #define STATUSCODE(line) (ISDIGIT(line[0]) && ISDIGIT(line[1]) && \ 545 #define LASTLINE(line) (STATUSCODE(line) && (' ' == line[3])) 575 #if defined(HAVE_GSSAPI) 580 code = Curl_sec_read_msg(conn, buf, PROT_SAFE);
583 code = Curl_sec_read_msg(conn, buf, PROT_PRIVATE);
586 code = Curl_sec_read_msg(conn, buf, PROT_CONFIDENTIAL);
608 infof(data,
"We got a 421 - timeout!\n");
644 int value_to_be_ignored = 0;
650 ftpcode = &value_to_be_ignored;
654 while(!*ftpcode && !result) {
659 failf(data,
"FTP response timeout");
664 if(timeout < interval_ms)
681 if(pp->
cache && (cache_skip < 2)) {
692 failf(data,
"FTP response aborted due to select/poll error: %d",
709 if(!nread && pp->
cache)
727 #if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS) 729 static const char *
const ftp_state_names[]={
778 #if defined(DEBUGBUILD) 780 #if defined(CURL_DISABLE_VERBOSE_STRINGS) 783 if(ftpc->
state != newstate)
784 infof(conn->
data,
"FTP %p (line %d) state change from %s to %s\n",
785 (
void *)ftpc, lineno, ftp_state_names[ftpc->
state],
786 ftp_state_names[newstate]);
790 ftpc->
state = newstate;
851 for(s = 1, i = 0; i<2; i++) {
933 char myhost[256] =
"";
939 struct sockaddr *sa = (
struct sockaddr *)&ss;
940 struct sockaddr_in *
const sa4 = (
void *)sa;
942 struct sockaddr_in6 *
const sa6 = (
void *)sa;
945 static const char mode[][5] = {
"EPRT",
"PORT" };
951 unsigned short port_min = 0;
952 unsigned short port_max = 0;
954 bool possibly_non_local =
TRUE;
967 size_t addrlen = INET6_ADDRSTRLEN > strlen(string_ftpport) ?
968 INET6_ADDRSTRLEN : strlen(string_ftpport);
973 char *ip_start = string_ftpport;
975 char *port_start = NULL;
976 char *port_sep = NULL;
978 addr =
calloc(addrlen + 1, 1);
983 if(*string_ftpport ==
'[') {
985 ip_start = string_ftpport + 1;
986 ip_end = strchr(string_ftpport,
']');
988 strncpy(addr, ip_start, ip_end - ip_start);
992 if(*string_ftpport ==
':') {
994 ip_end = string_ftpport;
997 ip_end = strchr(string_ftpport,
':');
1003 port_min = port_max = 0;
1004 strcpy(addr, string_ftpport);
1010 strncpy(addr, string_ftpport, ip_end - ip_start);
1014 strcpy(addr, string_ftpport);
1018 if(ip_end != NULL) {
1019 port_start = strchr(ip_end,
':');
1021 port_min =
curlx_ultous(strtoul(port_start + 1, NULL, 10));
1022 port_sep = strchr(port_start,
'-');
1024 port_max =
curlx_ultous(strtoul(port_sep + 1, NULL, 10));
1027 port_max = port_min;
1037 if(port_min > port_max)
1038 port_min = port_max = 0;
1045 conn->
scope_id, addr, hbuf,
sizeof(hbuf))) {
1067 failf(data,
"getsockname() failed: %s",
1072 switch(sa->sa_family) {
1075 Curl_inet_ntop(sa->sa_family, &sa6->sin6_addr, hbuf,
sizeof(hbuf));
1079 Curl_inet_ntop(sa->sa_family, &sa4->sin_addr, hbuf,
sizeof(hbuf));
1083 possibly_non_local =
FALSE;
1100 failf(data,
"failed to resolve the address provided to PORT: %s", host);
1112 for(ai = res; ai; ai = ai->ai_next) {
1127 memcpy(sa, ai->ai_addr, ai->ai_addrlen);
1128 sslen = ai->ai_addrlen;
1130 for(port = port_min; port <= port_max;) {
1131 if(sa->sa_family == AF_INET)
1132 sa4->sin_port = htons(port);
1135 sa6->sin6_port = htons(port);
1138 if(
bind(portsock, sa, sslen) ) {
1141 if(possibly_non_local && (error == EADDRNOTAVAIL)) {
1146 infof(data,
"bind(port=%hu) on non-local address failed: %s\n", port,
1151 failf(data,
"getsockname() failed: %s",
1157 possibly_non_local =
FALSE;
1160 if(error != EADDRINUSE && error != EACCES) {
1161 failf(data,
"bind(port=%hu) failed: %s", port,
1174 if(port > port_max) {
1175 failf(data,
"bind() failed, we ran out of ports!");
1183 if(getsockname(portsock, (
struct sockaddr *)sa, &sslen)) {
1184 failf(data,
"getsockname() failed: %s",
1192 if(listen(portsock, 1)) {
1211 for(; fcmd !=
DONE; fcmd++) {
1217 if((
PORT == fcmd) && sa->sa_family != AF_INET)
1221 switch(sa->sa_family) {
1223 port = ntohs(sa4->sin_port);
1227 port = ntohs(sa6->sin6_port);
1244 sa->sa_family == AF_INET?1:2,
1247 failf(data,
"Failure sending EPRT command: %s",
1259 char *source = myhost;
1263 while(source && *source) {
1272 snprintf(dest, 20,
",%d,%d", (
int)(port>>8), (
int)(port&0xff));
1276 failf(data,
"Failure sending PORT command: %s",
1328 static const char mode[][5] = {
"EPSV",
"PASV" };
1340 PPSENDF(&ftpc->
pp,
"%s", mode[modeoff]);
1344 infof(conn->
data,
"Connect data stream passively\n");
1459 char *cmd, *lstArg, *slashPos;
1472 if(lstArg[strlen(lstArg) - 1] !=
'/') {
1475 slashPos = strrchr(lstArg,
'/');
1477 *(slashPos + 1) =
'\0';
1486 lstArg? lstArg:
"");
1627 failf(data,
"Could not seek stream");
1632 size_t readthisamountnow =
1637 size_t actuallyread =
1641 passed += actuallyread;
1642 if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
1645 failf(data,
"Failed to read data");
1648 }
while(passed < data->
state.resume_from);
1655 infof(data,
"File already completely uploaded\n");
1719 while((i< ftpc->count1) && item) {
1724 char *cmd = item->
data;
1733 state(conn, instate);
1790 failf(conn->
data,
"Failed EPSV attempt, exiting\n");
1794 infof(conn->
data,
"Failed EPSV attempt. Disabling EPSV\n");
1833 if((ftpc->
count1 == 0) &&
1836 char *
ptr = strchr(str,
'(');
1841 if(5 == sscanf(ptr,
"%c%c%c%u%c",
1847 const char sep1 = separator[0];
1852 for(i = 1; i<4; i++) {
1853 if(separator[i] != sep1) {
1859 failf(data,
"Illegal port number in EPSV reply");
1863 ftpc->
newport = (
unsigned short)(num & 0xffff);
1873 failf(data,
"Weirdly formatted EPSV reply");
1877 else if((ftpc->
count1 == 1) &&
1893 if(6 == sscanf(str,
"%d,%d,%d,%d,%d,%d",
1894 &ip[0], &ip[1], &ip[2], &ip[3],
1895 &port[0], &port[1]))
1901 failf(data,
"Couldn't interpret the 227-response");
1909 infof(data,
"Skip %d.%d.%d.%d for data connection, re-use %s instead\n",
1910 ip[0], ip[1], ip[2], ip[3],
1915 ftpc->
newhost =
aprintf(
"%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
1920 ftpc->
newport = (
unsigned short)(((port[0]<<8) + port[1]) & 0xffff);
1922 else if(ftpc->
count1 == 0) {
1927 failf(data,
"Bad PASV/EPSV response: %03d", ftpcode);
1946 (
unsigned short)conn->
port;
1949 failf(data,
"Can't resolve proxy host %s:%hu", host_name, connectport);
1963 failf(data,
"Can't resolve new host %s:%hu", ftpc->
newhost, connectport);
1973 if(ftpc->
count1 == 0 && ftpcode == 229)
2014 if(ftpcode / 100 != 2) {
2018 infof(data,
"disabling EPRT usage\n");
2024 failf(data,
"Failed to do PORT");
2032 infof(data,
"Connect data stream actively\n");
2053 int year, month, day, hour, minute, second;
2054 if(6 == sscanf(&data->
state.
buffer[4],
"%04d%02d%02d%02d%02d%02d",
2055 &year, &month, &day, &hour, &minute, &second)) {
2058 time_t secs = time(NULL);
2061 "%04d%02d%02d %02d:%02d:%02d GMT",
2062 year, month, day, hour, minute, second);
2067 #ifdef CURL_FTP_HTTPSTYLE_HEAD 2075 char headerbuf[128];
2078 const struct tm *tm = &
buffer;
2085 snprintf(headerbuf,
sizeof(headerbuf),
2086 "Last-Modified: %s, %02d %s %4d %02d:%02d:%02d GMT\r\n",
2102 infof(data,
"unsupported MDTM reply format\n");
2105 failf(data,
"Given file does not exist");
2116 infof(data,
"The requested document is not new enough\n");
2125 infof(data,
"The requested document is not old enough\n");
2135 infof(data,
"Skipping time comparison\n");
2152 if(ftpcode/100 != 2) {
2156 failf(data,
"Couldn't set desired mode");
2160 infof(data,
"Got a %03d response code instead of the assumed 200\n",
2184 failf(data,
"Maximum file size exceeded");
2192 if(filesize == -1) {
2193 infof(data,
"ftp server doesn't support SIZE\n");
2204 if(filesize < -data->
state.resume_from) {
2216 if(filesize < data->
state.resume_from) {
2230 infof(data,
"File already completely downloaded\n");
2240 infof(data,
"Instructs server to resume from offset %" 2272 #ifdef CURL_FTP_HTTPSTYLE_HEAD 2273 if(-1 != filesize) {
2307 #ifdef CURL_FTP_HTTPSTYLE_HEAD 2308 if(ftpcode == 350) {
2309 char buffer[24]= {
"Accept-ranges: bytes\r\n" };
2319 if(ftpcode != 350) {
2339 if(ftpcode >= 400) {
2340 failf(data,
"Failed FTP upload: %0d", ftpcode);
2360 infof(data,
"Data conn was not available immediately\n");
2378 if((ftpcode == 150) || (ftpcode == 125)) {
2421 bytes = strstr(buf,
" bytes");
2423 long in = (long)(bytes-buf);
2472 infof(data,
"Data conn was not available immediately\n");
2481 if((instate ==
FTP_LIST) && (ftpcode == 450)) {
2487 failf(data,
"RETR response: %03d", ftpcode);
2488 return instate ==
FTP_RETR && ftpcode == 550?
2544 else if(ftpcode/100 == 2) {
2549 else if(ftpcode == 332) {
2555 failf(data,
"ACCT requested but none available");
2575 failf(data,
"Access denied: %03d", ftpcode);
2588 if(ftpcode != 230) {
2589 failf(data,
"ACCT rejected by server: %03d", ftpcode);
2607 static const char ftpauth[][4] = {
"SSL",
"TLS" };
2619 switch(ftpc->
state) {
2624 else if(ftpcode != 220) {
2625 failf(data,
"Got a %03d ftp-server response when 220 was expected",
2636 Curl_sec_request_prot(conn,
"private");
2641 if(Curl_sec_login(conn))
2642 infof(data,
"Logging in with password in cleartext!\n");
2644 infof(data,
"Authentication successful\n");
2667 failf(data,
"unsupported parameter to CURLOPT_FTPSSLAUTH: %d",
2692 if((ftpcode == 234) || (ftpcode == 334)) {
2700 else if(ftpc->
count3 < 1) {
2736 if(ftpcode/100 == 2)
2765 failf(conn->
data,
"Failed to clear the command channel (CCC)");
2777 if(ftpcode == 257) {
2782 bool entry_extracted =
FALSE;
2798 while(ptr < &data->
state.buffer[buf_size]
2799 && *ptr !=
'\n' && *ptr !=
'\0' && *ptr !=
'"')
2805 for(store = dir; *
ptr;) {
2807 if(
'\"' == ptr[1]) {
2814 entry_extracted =
TRUE;
2825 if(entry_extracted) {
2863 infof(data,
"Failed to figure out path\n");
2867 DEBUGF(
infof(data,
"protocol connect phase DONE\n"));
2871 if(ftpcode == 215) {
2885 for(store = os; *ptr && *ptr !=
' ';)
2914 DEBUGF(
infof(data,
"protocol connect phase DONE\n"));
2918 if(ftpcode == 250) {
2925 DEBUGF(
infof(data,
"protocol connect phase DONE\n"));
2932 if((ftpcode >= 400) && !ftpc->
count2) {
2934 failf(conn->
data,
"QUOT command failed with %03d", ftpcode);
2944 if(ftpcode/100 != 2) {
2955 failf(data,
"Server denied you to change to the given directory");
2977 if((ftpcode/100 != 2) && !ftpc->
count3--) {
2979 failf(data,
"Failed to MKD dir: %03d", ftpcode);
3010 if(ftpcode != 200) {
3012 failf(data,
"PRET command not accepted: %03d", ftpcode);
3141 const char *path_to_use = data->
state.
path;
3174 connclose(conn,
"FTP ended with bad error code");
3200 size_t flen = ftpc->
file?strlen(ftpc->
file):0;
3201 size_t dlen = strlen(path)-flen;
3216 infof(data,
"Remembering we are in dir \"%s\"\n", ftpc->
prevpath);
3237 failf(data,
"Failure sending ABOR command: %s",
3273 failf(data,
"control connection looks dead");
3275 connclose(conn,
"Timeout or similar in FTP DONE operation");
3284 infof(data,
"partial download completed, closing connection\n");
3285 connclose(conn,
"Partial download with no ability to check");
3291 if((ftpcode != 226) && (ftpcode != 250)) {
3292 failf(data,
"server did not report OK, got %d", ftpcode);
3298 if(result || premature)
3332 failf(data,
"No data was received!");
3342 if(!status && !result && !premature && data->
set.
postquote)
3371 char *cmd = item->
data;
3372 bool acceptfail =
FALSE;
3392 if(!acceptfail && (ftpcode >= 400)) {
3393 failf(conn->
data,
"QUOT string not accepted: %s", cmd);
3429 char want = (char)(ascii?
'A':
'I');
3432 state(conn, newstate);
3437 state(conn, newstate);
3453 #ifndef CURL_DISABLE_VERBOSE_STRINGS 3462 infof(conn->
data,
"Connecting to %s (%s) port %d\n", newhost, buf, port);
3484 while(*ptr && (
ISSPACE(*ptr) || (*ptr ==
'-')))
3493 " to end of file\n", from));
3538 bool connected =
FALSE;
3539 bool complete =
FALSE;
3558 DEBUGF(
infof(data,
"DO-MORE connected phase starts\n"));
3561 if(result && (ftpc->
count1 == 0)) {
3587 *completep = (int)complete;
3638 *completep = (int)complete;
3667 *completep = (int)complete;
3680 DEBUGF(
infof(data,
"DO-MORE phase ends with %d\n", (
int)result));
3712 *dophase_done =
FALSE;
3724 infof(conn->
data,
"ftp_perform ends with SECONDARY: %d\n", *connected);
3751 if(last_slash[0] ==
'\0') {
3759 last_slash[0] =
'\0';
3793 wildcard->
tmp = ftp_tmp;
3806 wildcard->
tmp = NULL;
3811 if(!wildcard->
path) {
3815 wildcard->
tmp = NULL;
3828 infof(conn->
data,
"Wildcard - Parsing started\n");
3838 switch(wildcard->
state) {
3889 switch(userresponse) {
3891 infof(conn->
data,
"Wildcard - \"%s\" skipped by user\n",
3992 #define SBUF_SIZE 1024 3998 enum protection_level data_sec = conn->data_prot;
4001 write_len = strlen(cmd);
4002 if(write_len > (
sizeof(s) -3))
4005 strcpy(&s[write_len],
"\r\n");
4016 conn->data_prot = PROT_CMD;
4021 DEBUGASSERT(data_sec > PROT_NONE && data_sec < PROT_LAST);
4022 conn->data_prot = data_sec;
4030 sptr, (
size_t)bytes_written, conn);
4032 if(bytes_written != (
ssize_t)write_len) {
4033 write_len -= bytes_written;
4034 sptr += bytes_written;
4060 failf(conn->
data,
"Failure sending QUIT command: %s",
4139 const char *slash_pos;
4140 const char *path_to_use = data->
state.
path;
4141 const char *cur_pos;
4144 cur_pos = path_to_use;
4161 if(path_to_use[0] &&
4162 (path_to_use[strlen(path_to_use) - 1] !=
'/') )
4163 filename = path_to_use;
4176 if(!path_to_use[0]) {
4181 slash_pos = strrchr(cur_pos,
'/');
4182 if(slash_pos || !*cur_pos) {
4183 size_t dirlen = slash_pos-cur_pos;
4194 slash_pos ? dirlen : 1,
4195 &ftpc->
dirs[0], NULL,
4202 filename = slash_pos ? slash_pos + 1 : cur_pos;
4217 if(!strcmp(path_to_use,
"/")) {
4224 while((slash_pos = strchr(cur_pos,
'/')) != NULL) {
4230 if(slash_pos-cur_pos) {
4234 size_t len = slash_pos - cur_pos + absolute_dir;
4245 cur_pos = slash_pos + 1;
4250 failf(data,
"no memory");
4258 cur_pos = slash_pos + 1;
4268 ftpc->
dirs = bigger;
4276 if(filename && *filename) {
4291 failf(data,
"Uploading to a URL without a file name!");
4309 dlen -= ftpc->
file?strlen(ftpc->
file):0;
4310 if((dlen == strlen(ftpc->
prevpath)) &&
4311 !strncmp(path, ftpc->
prevpath, dlen) &&
4313 infof(data,
"Request has same path as previous transfer\n");
4359 else if(*dophase_done) {
4384 bool connected =
FALSE;
4433 type = strstr(data->
state.
path,
";type=");
int Curl_debug(struct Curl_easy *data, curl_infotype type, char *ptr, size_t size, struct connectdata *conn)
static CURLcode ftp_parse_url_path(struct connectdata *conn)
static CURLcode ftp_state_rest(struct connectdata *conn)
struct ssl_connect_data ssl[2]
static CURLcode ftp_readresp(curl_socket_t sockfd, struct pingpong *pp, int *ftpcode, size_t *size)
static CURLcode ftp_state_pasv_resp(struct connectdata *conn, int ftpcode)
static CURLcode ftp_state_user_resp(struct connectdata *conn, int ftpcode, ftpstate instate)
struct ftp_parselist_data * parser
CURLcode Curl_ftpsend(struct connectdata *conn, const char *cmd)
CURLcode Curl_urldecode(struct Curl_easy *data, const char *string, size_t length, char **ostring, size_t *olen, bool reject_ctrl)
const char *const Curl_wkday[]
static CURLcode ftp_state_list(struct connectdata *conn)
bool Curl_conn_data_pending(struct connectdata *conn, int sockindex)
#define CONNECT_SECONDARYSOCKET_PROXY_SSL()
curl_wildcard_states state
static CURLcode ftp_state_prepare_transfer(struct connectdata *conn)
static CURLcode ftp_state_use_port(struct connectdata *conn, ftpport fcmd)
static CURLcode ftp_perform(struct connectdata *conn, bool *connected, bool *dophase_done)
static CURLcode ftp_setup_connection(struct connectdata *conn)
static CURLcode ftp_range(struct connectdata *conn)
#define filesize(name, stat_data)
void Curl_pgrsSetUploadCounter(struct Curl_easy *data, curl_off_t size)
#define Curl_sndbufset(y)
#define CURL_DO_LINEEND_CONV
struct curl_slist * prequote
curl_pp_transfer transfer
#define CURL_CHUNK_BGN_FUNC_FAIL
int curlx_sltosi(long slnum)
static int ftp_need_type(struct connectdata *conn, bool ascii)
void Curl_pgrsTime(struct Curl_easy *data, timerid timer)
#define PROTOPT_NOURLQUERY
CURLcode Curl_pp_disconnect(struct pingpong *pp)
static CURLcode ftp_state_get_resp(struct connectdata *conn, int ftpcode, ftpstate instate)
static CURLcode ftp_state_cwd(struct connectdata *conn)
void Curl_ftp_parselist_data_free(struct ftp_parselist_data **pl_data)
static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks, int numsocks)
static CURLcode ftp_state_acct_resp(struct connectdata *conn, int ftpcode)
char * most_recent_ftp_entrypath
#define CURL_SEEKFUNC_CANTSEEK
unsigned int Curl_ipv6_scope(const struct sockaddr *sa)
struct curl_slist * postquote
static unsigned short connectport
const char *const Curl_month[]
static CURLcode ftp_state_retr(struct connectdata *conn, curl_off_t filesize)
static CURLcode ReceivedServerConnect(struct connectdata *conn, bool *received)
static CURLcode ftp_state_rest_resp(struct connectdata *conn, int ftpcode, ftpstate instate)
const struct Curl_handler * handler
#define CURLRESOLV_PENDING
UNITTEST_START char * ptr
#define GETSOCK_READSOCK(x)
#define Curl_ssl_close(x, y)
static CURLcode ftp_state_stor_prequote(struct connectdata *conn)
static CURLcode ftp_multi_statemach(struct connectdata *conn, bool *done)
CURLcode Curl_GetFTPResponse(ssize_t *nreadp, struct connectdata *conn, int *ftpcode)
static void close_secondarysocket(struct connectdata *conn)
int Curl_closesocket(struct connectdata *conn, curl_socket_t sock)
CURLcode Curl_pp_flushsend(struct pingpong *pp)
static CURLcode ftp_sendquote(struct connectdata *conn, struct curl_slist *quote)
static void init(CURLM *cm, int i)
static CURLcode ftp_regular_transfer(struct connectdata *conn, bool *done)
#define CURLFINFOFLAG_KNOWN_SIZE
static CURLcode ftp_connect(struct connectdata *conn, bool *done)
curl_socket_t tempsock[2]
CURLcode Curl_socket(struct connectdata *conn, const Curl_addrinfo *ai, struct Curl_sockaddr_ex *addr, curl_socket_t *sockfd)
static void freedirs(struct ftp_conn *ftpc)
#define realloc(ptr, size)
#define Curl_ssl_connect(x, y)
#define strcasecompare(a, b)
static void wc_data_dtor(void *ptr)
static bool ftp_endofresp(struct connectdata *conn, char *line, size_t len, int *code)
struct curl_slist * quote
UNITTEST_START int result
curl_off_t retr_size_saved
static CURLcode ftp_state_retr_prequote(struct connectdata *conn)
curl_off_t known_filesize
char ip_addr_str[MAX_IPADR_LEN]
CURLcode Curl_connecthost(struct connectdata *conn, const struct Curl_dns_entry *remotehost)
static srvr_sockaddr_union_t from
char * Curl_inet_ntop(int af, const void *src, char *buf, size_t size)
static CURLcode init_wc_data(struct connectdata *conn)
int curlx_nonblock(curl_socket_t sockfd, int nonblock)
struct sockaddr * ai_addr
struct proxy_info http_proxy
curl_seek_callback seek_func
static void _state(struct connectdata *conn, ftpstate newstate)
curl_chunk_end_callback chunk_end
unsigned short curlx_ultous(unsigned long ulnum)
static CURLcode ftp_state_ul_setup(struct connectdata *conn, bool sizechecked)
CURLcode(* statemach_act)(struct connectdata *conn)
curl_sockopt_callback fsockopt
int Curl_pgrsUpdate(struct connectdata *conn)
static CURLcode ftp_state_mdtm_resp(struct connectdata *conn, int ftpcode)
memcpy(filename, filename1, strlen(filename1))
#define Curl_ssl_shutdown(x, y)
CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t
curl_ftpfile ftp_filemethod
void Curl_setup_transfer(struct connectdata *conn, int sockindex, curl_off_t size, bool getheader, curl_off_t *bytecountp, int writesockindex, curl_off_t *writecountp)
time_t Curl_timeleft(struct Curl_easy *data, struct curltime *nowp, bool duringconnect)
static CURLcode AcceptServerConnect(struct connectdata *conn)
static CURLcode ftp_state_size(struct connectdata *conn)
bool(* endofresp)(struct connectdata *conn, char *ptr, size_t len, int *code)
ROSLIB_DECL std::string command(const std::string &cmd)
CURLcode Curl_pp_statemach(struct pingpong *pp, bool block)
const char * Curl_strerror(struct connectdata *conn, int err)
#define SOCKET_READABLE(x, z)
CURLofft curlx_strtoofft(const char *str, char **endp, int base, curl_off_t *num)
const char * Curl_printable_address(const Curl_addrinfo *ai, char *buf, size_t bufsize)
CURLcode Curl_is_connected(struct connectdata *conn, int sockindex, bool *connected)
static CURLcode AllowServerConnect(struct connectdata *conn, bool *connected)
static CURLcode wc_statemach(struct connectdata *conn)
struct curl_llist filelist
static CURLcode ftp_quit(struct connectdata *conn)
curl_write_callback write_function
void Curl_pgrsSetUploadSize(struct Curl_easy *data, curl_off_t size)
if2ip_result_t Curl_if2ip(int af, unsigned int remote_scope, unsigned int remote_scope_id, const char *interf, char *buf, int buf_size)
int Curl_resolv(struct connectdata *conn, const char *hostname, int port, struct Curl_dns_entry **entry)
static int ftp_getsock(struct connectdata *conn, curl_socket_t *socks, int numsocks)
static char * control_address(struct connectdata *conn)
void Curl_pgrsSetDownloadSize(struct Curl_easy *data, curl_off_t size)
#define Curl_convert_to_network(a, b, c)
#define PROTOPT_PROXY_AS_HTTP
curl_wildcard_tmp_dtor tmp_dtor
CURL_TYPEOF_CURL_OFF_T curl_off_t
void Curl_resolv_unlock(struct Curl_easy *data, struct Curl_dns_entry *dns)
static CURLcode ftp_state_mdtm(struct connectdata *conn)
size_t Curl_ftp_parselist(char *buffer, size_t size, size_t nmemb, void *connptr)
static CURLcode ftp_state_type(struct connectdata *conn)
CURLcode Curl_write(struct connectdata *conn, curl_socket_t sockfd, const void *mem, size_t len, ssize_t *written)
#define GETSOCK_WRITESOCK(x)
struct proxy_info socks_proxy
int Curl_inet_pton(int af, const char *src, void *dst)
struct curl_llist_element * head
static unsigned short port
static CURLcode ftp_epsv_disable(struct connectdata *conn)
CURLcode Curl_client_write(struct connectdata *conn, int type, char *ptr, size_t len)
bool Curl_connect_ongoing(struct connectdata *conn)
#define Curl_safefree(ptr)
int Curl_pp_getsock(struct pingpong *pp, curl_socket_t *socks, int numsocks)
unsigned short secondary_port
CURLcode Curl_proxyCONNECT(struct connectdata *conn, int sockindex, const char *hostname, int remote_port)
void Curl_llist_remove(struct curl_llist *list, struct curl_llist_element *e, void *user)
int Curl_socket_check(curl_socket_t readfd0, curl_socket_t readfd1, curl_socket_t writefd, time_t timeout_ms)
static CURLcode ftp_block_statemach(struct connectdata *conn)
const struct Curl_handler Curl_handler_ftp
static time_t ftp_timeleft_accept(struct Curl_easy *data)
curl_write_callback fwrite_func
#define DEFAULT_ACCEPT_TIMEOUT
static CURLcode ftp_state_user(struct connectdata *conn)
static void ftp_pasv_verbose(struct connectdata *conn, Curl_addrinfo *ai, char *newhost, int port)
CURL_EXTERN time_t curl_getdate(const char *p, const time_t *unused)
void Curl_pgrsSetDownloadCounter(struct Curl_easy *data, curl_off_t size)
static CURLcode ftp_disconnect(struct connectdata *conn, bool dead_connection)
CURLcode Curl_gmtime(time_t intime, struct tm *store)
static CURLcode ftp_nb_type(struct connectdata *conn, bool ascii, ftpstate newstate)
static CURLcode ftp_state_size_resp(struct connectdata *conn, int ftpcode, ftpstate instate)
static CURLcode ftp_state_quote(struct connectdata *conn, bool init, ftpstate instate)
curl_chunk_bgn_callback chunk_bgn
static CURLcode ftp_state_loggedin(struct connectdata *conn)
curl_TimeCond timecondition
void Curl_pp_init(struct pingpong *pp)
struct connectdata * conn
struct ftp_wc_tmpdata::@10 backup
CURLcode Curl_ftp_parselist_geterror(struct ftp_parselist_data *pl_data)
CURLcode Curl_pp_sendf(struct pingpong *pp, const char *fmt,...)
#define Curl_tvdiff(x, y)
curl_off_t crlf_conversions
curl_read_callback fread_func
struct ssl_connect_data proxy_ssl[2]
struct curltime t_acceptdata
union connectdata::@34 proto
CURLcode Curl_pp_readresp(curl_socket_t sockfd, struct pingpong *pp, int *code, size_t *size)
CURLcode Curl_resolver_wait_resolv(struct connectdata *conn, struct Curl_dns_entry **dnsentry)
void Curl_expire(struct Curl_easy *data, time_t milli, expire_id id)
static CURLcode ftp_dophase_done(struct connectdata *conn, bool connected)
struct WildcardData wildcard
static CURLcode InitiateTransfer(struct connectdata *conn)
static CURLcode ftp_do_more(struct connectdata *conn, int *completed)
#define PROTOPT_CLOSEACTION
size_t curlx_sotouz(curl_off_t sonum)
CURL_EXTERN const char * curl_easy_strerror(CURLcode)
static CURLcode ftp_state_use_pasv(struct connectdata *conn)
char Curl_raw_toupper(char in)
bool proxy_ssl_connected[2]
static CURLcode ftp_state_pwd(struct connectdata *conn)
static CURLcode ftp_done(struct connectdata *conn, CURLcode, bool premature)
bool ftp_trying_alternative
static bool isBadFtpString(const char *string)
static CURLcode ftp_state_type_resp(struct connectdata *conn, int ftpcode, ftpstate instate)
static CURLcode ftp_doing(struct connectdata *conn, bool *dophase_done)
time_t Curl_pp_state_timeout(struct pingpong *pp)
#define calloc(nbelem, size)
static CURLcode ftp_do(struct connectdata *conn, bool *done)
static CURLcode ftp_state_stor_resp(struct connectdata *conn, int ftpcode, ftpstate instate)
static CURLcode ftp_state_port_resp(struct connectdata *conn, int ftpcode)
struct ftp_parselist_data * Curl_ftp_parselist_data_alloc(void)
int ftp_create_missing_dirs
static CURLcode ftp_statemach_act(struct connectdata *conn)
#define CURL_FORMAT_CURL_OFF_T
#define CURL_CHUNK_BGN_FUNC_SKIP
CURLcode Curl_proxy_connect(struct connectdata *conn, int sockindex)