FTP client library for mbed-os

Committer:
dkato
Date:
Fri Feb 28 00:17:00 2020 +0000
Revision:
2:88b7399c8260
Parent:
1:e069c405c934
Added switch to binary mode

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 0:c2da359279a6 1 /* FTP client library
dkato 0:c2da359279a6 2 * Copyright (c) 2018 Renesas Electronics Corporation
dkato 0:c2da359279a6 3 *
dkato 0:c2da359279a6 4 * Licensed under the Apache License, Version 2.0 (the "License");
dkato 0:c2da359279a6 5 * you may not use this file except in compliance with the License.
dkato 0:c2da359279a6 6 * You may obtain a copy of the License at
dkato 0:c2da359279a6 7 *
dkato 0:c2da359279a6 8 * http://www.apache.org/licenses/LICENSE-2.0
dkato 0:c2da359279a6 9 *
dkato 0:c2da359279a6 10 * Unless required by applicable law or agreed to in writing, software
dkato 0:c2da359279a6 11 * distributed under the License is distributed on an "AS IS" BASIS,
dkato 0:c2da359279a6 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dkato 0:c2da359279a6 13 * See the License for the specific language governing permissions and
dkato 0:c2da359279a6 14 * limitations under the License.
dkato 0:c2da359279a6 15 */
dkato 0:c2da359279a6 16
dkato 0:c2da359279a6 17 #include "mbed.h"
dkato 0:c2da359279a6 18 #include "FTPClient.h"
dkato 0:c2da359279a6 19
dkato 0:c2da359279a6 20 #define FTP_BUF_SIZE (1460)
dkato 0:c2da359279a6 21
dkato 1:e069c405c934 22 //#define ftp_debug_print printf
dkato 1:e069c405c934 23
dkato 1:e069c405c934 24 #ifndef ftp_debug_print
dkato 1:e069c405c934 25 static int ftp_debug_print(const char *format, ...) {
dkato 1:e069c405c934 26 return 0;
dkato 1:e069c405c934 27 }
dkato 1:e069c405c934 28 #endif
dkato 1:e069c405c934 29
dkato 0:c2da359279a6 30 FTPClient::FTPClient(NetworkInterface *net, const char* root) {
dkato 0:c2da359279a6 31 _ctr_open = false;
dkato 0:c2da359279a6 32 _login = false;
dkato 0:c2da359279a6 33 strcpy(_root, root);
dkato 0:c2da359279a6 34 p_network = net;
dkato 0:c2da359279a6 35 p_ftp_buf = new char[FTP_BUF_SIZE];
dkato 0:c2da359279a6 36 }
dkato 0:c2da359279a6 37
dkato 0:c2da359279a6 38 FTPClient::~FTPClient() {
dkato 0:c2da359279a6 39 delete [] p_ftp_buf;
dkato 0:c2da359279a6 40 }
dkato 0:c2da359279a6 41
dkato 0:c2da359279a6 42 bool FTPClient::open(const char* ip_addr, int port, const char* user, const char* pass) {
dkato 0:c2da359279a6 43 if (_ctr_open) {
dkato 0:c2da359279a6 44 FTPClientControlSock.close();
dkato 0:c2da359279a6 45 }
dkato 0:c2da359279a6 46
dkato 0:c2da359279a6 47 FTPClientControlSock.open(p_network);
dkato 0:c2da359279a6 48 if (FTPClientControlSock.connect(ip_addr, port) < 0) {
dkato 1:e069c405c934 49 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 50 return false;
dkato 0:c2da359279a6 51 }
dkato 0:c2da359279a6 52 _ctr_open = true;
dkato 0:c2da359279a6 53
dkato 0:c2da359279a6 54 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 55 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 56 return false;
dkato 0:c2da359279a6 57 }
dkato 0:c2da359279a6 58 if (strncmp(p_ftp_buf, "220", 3) != 0) {
dkato 1:e069c405c934 59 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 60 return false;
dkato 0:c2da359279a6 61 }
dkato 0:c2da359279a6 62
dkato 0:c2da359279a6 63 _login = false;
dkato 0:c2da359279a6 64 sprintf(p_ftp_buf, "user %s\r\n", user);
dkato 0:c2da359279a6 65 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 66 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 67 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 68 return false;
dkato 0:c2da359279a6 69 }
dkato 0:c2da359279a6 70 if (strncmp(p_ftp_buf, "331", 3) != 0) {
dkato 1:e069c405c934 71 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 72 return false;
dkato 0:c2da359279a6 73 }
dkato 0:c2da359279a6 74
dkato 0:c2da359279a6 75 sprintf(p_ftp_buf, "pass %s\r\n", pass);
dkato 0:c2da359279a6 76 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 77 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 78 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 79 return false;
dkato 0:c2da359279a6 80 }
dkato 0:c2da359279a6 81 if (strncmp(p_ftp_buf, "230", 3) != 0) {
dkato 1:e069c405c934 82 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 83 return false;
dkato 0:c2da359279a6 84 }
dkato 2:88b7399c8260 85
dkato 2:88b7399c8260 86 sprintf(p_ftp_buf, "type I\r\n");
dkato 2:88b7399c8260 87 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 2:88b7399c8260 88 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 2:88b7399c8260 89 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 2:88b7399c8260 90 return false;
dkato 2:88b7399c8260 91 }
dkato 2:88b7399c8260 92
dkato 0:c2da359279a6 93 _login = true;
dkato 0:c2da359279a6 94 return true;
dkato 0:c2da359279a6 95 }
dkato 0:c2da359279a6 96
dkato 0:c2da359279a6 97 bool FTPClient::quit() {
dkato 0:c2da359279a6 98 if (!_login) {
dkato 1:e069c405c934 99 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 100 return false;
dkato 0:c2da359279a6 101 }
dkato 0:c2da359279a6 102
dkato 0:c2da359279a6 103 sprintf(p_ftp_buf, "quit\r\n");
dkato 0:c2da359279a6 104 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 105 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 106 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 107 return false;
dkato 0:c2da359279a6 108 }
dkato 0:c2da359279a6 109 if (strncmp(p_ftp_buf, "250", 3) != 0) {
dkato 1:e069c405c934 110 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 111 return false;
dkato 0:c2da359279a6 112 }
dkato 0:c2da359279a6 113 _login = false;
dkato 0:c2da359279a6 114
dkato 0:c2da359279a6 115 FTPClientControlSock.close();
dkato 0:c2da359279a6 116 _ctr_open = false;
dkato 0:c2da359279a6 117 return true;
dkato 0:c2da359279a6 118 }
dkato 0:c2da359279a6 119
dkato 0:c2da359279a6 120 bool FTPClient::get(const char* file_name) {
dkato 0:c2da359279a6 121 FILE* fp;
dkato 0:c2da359279a6 122 int size;
dkato 0:c2da359279a6 123
dkato 0:c2da359279a6 124 if (!_login) {
dkato 1:e069c405c934 125 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 126 return false;
dkato 0:c2da359279a6 127 }
dkato 0:c2da359279a6 128
dkato 0:c2da359279a6 129 if (!open_data_sock()) {
dkato 1:e069c405c934 130 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 131 return false;
dkato 0:c2da359279a6 132 }
dkato 0:c2da359279a6 133
dkato 0:c2da359279a6 134 FTPClientDataSock.set_timeout(500);
dkato 0:c2da359279a6 135 sprintf(p_ftp_buf, "retr %s\r\n", file_name);
dkato 0:c2da359279a6 136 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 137 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 138 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 139 return false;
dkato 0:c2da359279a6 140 }
dkato 0:c2da359279a6 141 if ((strncmp(p_ftp_buf, "150", 3) != 0) && (strncmp(p_ftp_buf, "125", 3) != 0)) {
dkato 1:e069c405c934 142 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 143 return false;
dkato 0:c2da359279a6 144 }
dkato 0:c2da359279a6 145
dkato 0:c2da359279a6 146 sprintf(p_ftp_buf, "%s/%s", _root, file_name);
dkato 0:c2da359279a6 147 fp = fopen(p_ftp_buf, "w");
dkato 0:c2da359279a6 148 while (1) {
dkato 0:c2da359279a6 149 size = FTPClientDataSock.recv(p_ftp_buf, FTP_BUF_SIZE);
dkato 0:c2da359279a6 150 if (size > 0) {
dkato 0:c2da359279a6 151 fwrite(p_ftp_buf, size, sizeof(char), fp);
dkato 0:c2da359279a6 152 } else {
dkato 0:c2da359279a6 153 break;
dkato 0:c2da359279a6 154 }
dkato 0:c2da359279a6 155 }
dkato 0:c2da359279a6 156 fclose(fp);
dkato 0:c2da359279a6 157 FTPClientDataSock.close();
dkato 0:c2da359279a6 158
dkato 0:c2da359279a6 159 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 160 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 161 return false;
dkato 0:c2da359279a6 162 }
dkato 0:c2da359279a6 163 if (strncmp(p_ftp_buf, "226", 3) != 0) {
dkato 1:e069c405c934 164 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 165 return false;
dkato 0:c2da359279a6 166 }
dkato 0:c2da359279a6 167 return true;
dkato 0:c2da359279a6 168 }
dkato 0:c2da359279a6 169
dkato 0:c2da359279a6 170 bool FTPClient::put(const char* file_name) {
dkato 0:c2da359279a6 171 FILE* fp;
dkato 0:c2da359279a6 172 int32_t remain_size;
dkato 0:c2da359279a6 173 int32_t send_size;
dkato 0:c2da359279a6 174
dkato 0:c2da359279a6 175 if (!_login) {
dkato 1:e069c405c934 176 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 177 return false;
dkato 0:c2da359279a6 178 }
dkato 0:c2da359279a6 179
dkato 0:c2da359279a6 180 if (!open_data_sock()) {
dkato 1:e069c405c934 181 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 182 return false;
dkato 0:c2da359279a6 183 }
dkato 0:c2da359279a6 184
dkato 0:c2da359279a6 185 FTPClientDataSock.set_timeout(osWaitForever);
dkato 0:c2da359279a6 186 sprintf(p_ftp_buf, "stor %s\r\n", file_name);
dkato 0:c2da359279a6 187 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 188 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 189 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 190 return false;
dkato 0:c2da359279a6 191 }
dkato 0:c2da359279a6 192 if ((strncmp(p_ftp_buf, "150", 3) != 0) && (strncmp(p_ftp_buf, "125", 3) != 0)) {
dkato 1:e069c405c934 193 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 194 return false;
dkato 0:c2da359279a6 195 }
dkato 0:c2da359279a6 196
dkato 0:c2da359279a6 197 sprintf(p_ftp_buf, "%s/%s", _root, file_name);
dkato 0:c2da359279a6 198 fp = fopen(p_ftp_buf, "r");
dkato 0:c2da359279a6 199 fseek(fp, 0, SEEK_END);
dkato 0:c2da359279a6 200 remain_size = ftell(fp);
dkato 0:c2da359279a6 201 fseek(fp, 0, SEEK_SET);
dkato 0:c2da359279a6 202
dkato 0:c2da359279a6 203 while (remain_size > 0) {
dkato 0:c2da359279a6 204 if (remain_size > FTP_BUF_SIZE) {
dkato 0:c2da359279a6 205 send_size = FTP_BUF_SIZE;
dkato 0:c2da359279a6 206 } else {
dkato 0:c2da359279a6 207 send_size = remain_size;
dkato 0:c2da359279a6 208 }
dkato 0:c2da359279a6 209 fread(p_ftp_buf, 1, send_size, fp);
dkato 0:c2da359279a6 210 FTPClientDataSock.send(p_ftp_buf, send_size);
dkato 0:c2da359279a6 211 remain_size -= send_size;
dkato 0:c2da359279a6 212 }
dkato 0:c2da359279a6 213 fclose(fp);
dkato 0:c2da359279a6 214 FTPClientDataSock.close();
dkato 0:c2da359279a6 215
dkato 0:c2da359279a6 216 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 217 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 218 return false;
dkato 0:c2da359279a6 219 }
dkato 0:c2da359279a6 220 if (strncmp(p_ftp_buf, "226", 3) != 0) {
dkato 1:e069c405c934 221 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 222 return false;
dkato 0:c2da359279a6 223 }
dkato 0:c2da359279a6 224 return true;
dkato 0:c2da359279a6 225 }
dkato 0:c2da359279a6 226
dkato 0:c2da359279a6 227 bool FTPClient::del(const char* file_name) {
dkato 0:c2da359279a6 228 if (!_login) {
dkato 1:e069c405c934 229 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 230 return false;
dkato 0:c2da359279a6 231 }
dkato 0:c2da359279a6 232
dkato 0:c2da359279a6 233 sprintf(p_ftp_buf, "dele %s\r\n", file_name);
dkato 0:c2da359279a6 234 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 235 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 236 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 237 return false;
dkato 0:c2da359279a6 238 }
dkato 0:c2da359279a6 239 if (strncmp(p_ftp_buf, "250", 3) != 0) {
dkato 1:e069c405c934 240 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 241 return false;
dkato 0:c2da359279a6 242 }
dkato 0:c2da359279a6 243
dkato 0:c2da359279a6 244 return true;
dkato 0:c2da359279a6 245 }
dkato 0:c2da359279a6 246
dkato 0:c2da359279a6 247 bool FTPClient::mkdir(const char* dir_name) {
dkato 0:c2da359279a6 248 if (!_login) {
dkato 1:e069c405c934 249 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 250 return false;
dkato 0:c2da359279a6 251 }
dkato 0:c2da359279a6 252
dkato 0:c2da359279a6 253 sprintf(p_ftp_buf, "xmkd %s\r\n", dir_name);
dkato 0:c2da359279a6 254 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 255 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 256 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 257 return false;
dkato 0:c2da359279a6 258 }
dkato 0:c2da359279a6 259 if (strncmp(p_ftp_buf, "257", 3) != 0) {
dkato 1:e069c405c934 260 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 261 return false;
dkato 0:c2da359279a6 262 }
dkato 0:c2da359279a6 263
dkato 0:c2da359279a6 264 return true;
dkato 0:c2da359279a6 265 }
dkato 0:c2da359279a6 266
dkato 0:c2da359279a6 267 bool FTPClient::cd(const char* dir_name) {
dkato 0:c2da359279a6 268 if (!_login) {
dkato 1:e069c405c934 269 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 270 return false;
dkato 0:c2da359279a6 271 }
dkato 0:c2da359279a6 272
dkato 0:c2da359279a6 273 sprintf(p_ftp_buf, "cwd %s\r\n", dir_name);
dkato 0:c2da359279a6 274 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 275 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 276 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 277 return false;
dkato 0:c2da359279a6 278 }
dkato 0:c2da359279a6 279 if (strncmp(p_ftp_buf, "250", 3) != 0) {
dkato 1:e069c405c934 280 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 281 return false;
dkato 0:c2da359279a6 282 }
dkato 0:c2da359279a6 283
dkato 0:c2da359279a6 284 return true;
dkato 0:c2da359279a6 285 }
dkato 0:c2da359279a6 286
dkato 0:c2da359279a6 287 bool FTPClient::dir(char* list_buf, int buf_size) {
dkato 0:c2da359279a6 288 int size;
dkato 0:c2da359279a6 289 int idx = 0;
dkato 0:c2da359279a6 290 int remain_size = buf_size - 1;
dkato 0:c2da359279a6 291
dkato 0:c2da359279a6 292 if (list_buf == NULL) {
dkato 1:e069c405c934 293 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 294 return false;
dkato 0:c2da359279a6 295 }
dkato 0:c2da359279a6 296 list_buf[0] = '\0';
dkato 0:c2da359279a6 297
dkato 0:c2da359279a6 298 if (!_login) {
dkato 1:e069c405c934 299 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 300 return false;
dkato 0:c2da359279a6 301 }
dkato 0:c2da359279a6 302
dkato 0:c2da359279a6 303 if (!open_data_sock()) {
dkato 1:e069c405c934 304 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 305 return false;
dkato 0:c2da359279a6 306 }
dkato 0:c2da359279a6 307
dkato 0:c2da359279a6 308 FTPClientDataSock.set_timeout(500);
dkato 0:c2da359279a6 309 sprintf(p_ftp_buf, "list\r\n");
dkato 0:c2da359279a6 310 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 311 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 312 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 313 return false;
dkato 0:c2da359279a6 314 }
dkato 0:c2da359279a6 315 if ((strncmp(p_ftp_buf, "150", 3) != 0) && (strncmp(p_ftp_buf, "125", 3) != 0)) {
dkato 1:e069c405c934 316 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 317 return false;
dkato 0:c2da359279a6 318 }
dkato 0:c2da359279a6 319
dkato 0:c2da359279a6 320 while (remain_size > 0) {
dkato 0:c2da359279a6 321 size = FTPClientDataSock.recv(p_ftp_buf, FTP_BUF_SIZE);
dkato 0:c2da359279a6 322 if (size > 0) {
dkato 0:c2da359279a6 323 if (size > remain_size) {
dkato 0:c2da359279a6 324 size = remain_size;
dkato 0:c2da359279a6 325 }
dkato 0:c2da359279a6 326 memcpy(&list_buf[idx], p_ftp_buf, size);
dkato 0:c2da359279a6 327 idx += size;
dkato 0:c2da359279a6 328 remain_size -= size;
dkato 0:c2da359279a6 329 } else {
dkato 0:c2da359279a6 330 break;
dkato 0:c2da359279a6 331 }
dkato 0:c2da359279a6 332 }
dkato 0:c2da359279a6 333 list_buf[idx] = '\0';
dkato 0:c2da359279a6 334 FTPClientDataSock.close();
dkato 0:c2da359279a6 335
dkato 0:c2da359279a6 336 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 337 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 338 return false;
dkato 0:c2da359279a6 339 }
dkato 0:c2da359279a6 340 if (strncmp(p_ftp_buf, "226", 3) != 0) {
dkato 1:e069c405c934 341 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 342 return false;
dkato 0:c2da359279a6 343 }
dkato 0:c2da359279a6 344 return true;
dkato 0:c2da359279a6 345 }
dkato 0:c2da359279a6 346
dkato 0:c2da359279a6 347 bool FTPClient::ls(char* list_buf, int buf_size) {
dkato 0:c2da359279a6 348 int size;
dkato 0:c2da359279a6 349 int idx = 0;
dkato 0:c2da359279a6 350 int remain_size = buf_size - 1;
dkato 0:c2da359279a6 351
dkato 0:c2da359279a6 352 if (list_buf == NULL) {
dkato 1:e069c405c934 353 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 354 return false;
dkato 0:c2da359279a6 355 }
dkato 0:c2da359279a6 356 list_buf[0] = '\0';
dkato 0:c2da359279a6 357
dkato 0:c2da359279a6 358 if (!_login) {
dkato 1:e069c405c934 359 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 360 return false;
dkato 0:c2da359279a6 361 }
dkato 0:c2da359279a6 362
dkato 0:c2da359279a6 363 if (!open_data_sock()) {
dkato 1:e069c405c934 364 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 365 return false;
dkato 0:c2da359279a6 366 }
dkato 0:c2da359279a6 367
dkato 0:c2da359279a6 368 FTPClientDataSock.set_timeout(500);
dkato 0:c2da359279a6 369 sprintf(p_ftp_buf, "nlst\r\n");
dkato 0:c2da359279a6 370 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 371 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 372 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 373 return false;
dkato 0:c2da359279a6 374 }
dkato 0:c2da359279a6 375 if ((strncmp(p_ftp_buf, "150", 3) != 0) && (strncmp(p_ftp_buf, "125", 3) != 0)) {
dkato 1:e069c405c934 376 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 377 return false;
dkato 0:c2da359279a6 378 }
dkato 0:c2da359279a6 379
dkato 0:c2da359279a6 380 while (remain_size > 0) {
dkato 0:c2da359279a6 381 size = FTPClientDataSock.recv(p_ftp_buf, FTP_BUF_SIZE);
dkato 0:c2da359279a6 382 if (size > 0) {
dkato 0:c2da359279a6 383 if (size > remain_size) {
dkato 0:c2da359279a6 384 size = remain_size;
dkato 0:c2da359279a6 385 }
dkato 0:c2da359279a6 386 memcpy(&list_buf[idx], p_ftp_buf, size);
dkato 0:c2da359279a6 387 idx += size;
dkato 0:c2da359279a6 388 remain_size -= size;
dkato 0:c2da359279a6 389 } else {
dkato 0:c2da359279a6 390 break;
dkato 0:c2da359279a6 391 }
dkato 0:c2da359279a6 392 }
dkato 0:c2da359279a6 393 list_buf[idx] = '\0';
dkato 0:c2da359279a6 394 FTPClientDataSock.close();
dkato 0:c2da359279a6 395
dkato 0:c2da359279a6 396 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 397 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 398 return false;
dkato 0:c2da359279a6 399 }
dkato 0:c2da359279a6 400 if (strncmp(p_ftp_buf, "226", 3) != 0) {
dkato 1:e069c405c934 401 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 402 return false;
dkato 0:c2da359279a6 403 }
dkato 0:c2da359279a6 404 return true;
dkato 0:c2da359279a6 405 }
dkato 0:c2da359279a6 406
dkato 0:c2da359279a6 407 bool FTPClient::open_data_sock() {
dkato 0:c2da359279a6 408 uint8_t ip_addr[4];
dkato 0:c2da359279a6 409 int i;
dkato 0:c2da359279a6 410 int remote_port = 0;
dkato 0:c2da359279a6 411 char* token = NULL;
dkato 0:c2da359279a6 412 char* savept = NULL;
dkato 0:c2da359279a6 413
dkato 0:c2da359279a6 414 sprintf(p_ftp_buf, "pasv\r\n");
dkato 0:c2da359279a6 415 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 416 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 417 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 418 return false;
dkato 0:c2da359279a6 419 }
dkato 0:c2da359279a6 420 if (strncmp(p_ftp_buf, "227", 3) != 0) {
dkato 1:e069c405c934 421 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 422 return false;
dkato 0:c2da359279a6 423 }
dkato 0:c2da359279a6 424
dkato 0:c2da359279a6 425 token = strchr(p_ftp_buf, '(') + 1;
dkato 0:c2da359279a6 426 for (i = 0; i < 4; i++) {
dkato 0:c2da359279a6 427 token = strtok_r(token, ",", &savept);
dkato 0:c2da359279a6 428 ip_addr[i] = (uint8_t)atoi(token);
dkato 0:c2da359279a6 429 token = savept;
dkato 0:c2da359279a6 430 if (token == NULL) {
dkato 1:e069c405c934 431 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 432 return false;
dkato 0:c2da359279a6 433 }
dkato 0:c2da359279a6 434 }
dkato 0:c2da359279a6 435
dkato 0:c2da359279a6 436 for (i = 0; i < 2; i++) {
dkato 0:c2da359279a6 437 token = strtok_r(token, ",)", &savept);
dkato 0:c2da359279a6 438 remote_port <<= 8;
dkato 0:c2da359279a6 439 remote_port += atoi(token);
dkato 0:c2da359279a6 440 token = savept;
dkato 0:c2da359279a6 441 if (token == NULL) {
dkato 1:e069c405c934 442 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 443 return false;
dkato 0:c2da359279a6 444 }
dkato 0:c2da359279a6 445 }
dkato 0:c2da359279a6 446 sprintf(ftp_data_ip_addr, "%d.%d.%d.%d", ip_addr[0], ip_addr[1], ip_addr[2], ip_addr[3]);
dkato 0:c2da359279a6 447
dkato 0:c2da359279a6 448 FTPClientDataSock.open(p_network);
dkato 0:c2da359279a6 449 for (i = 0; i < 20; i++) {
dkato 0:c2da359279a6 450 if (FTPClientDataSock.connect(ftp_data_ip_addr, remote_port) >= 0) {
dkato 0:c2da359279a6 451 return true;
dkato 0:c2da359279a6 452 }
dkato 0:c2da359279a6 453 wait(1);
dkato 0:c2da359279a6 454 }
dkato 1:e069c405c934 455 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 456 return false;
dkato 0:c2da359279a6 457 }
dkato 0:c2da359279a6 458