FTP client library for mbed-os

Committer:
dkato
Date:
Tue Sep 18 08:01:30 2018 +0000
Revision:
1:e069c405c934
Parent:
0:c2da359279a6
Child:
2:88b7399c8260
Add debug information

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 0:c2da359279a6 85 _login = true;
dkato 0:c2da359279a6 86 return true;
dkato 0:c2da359279a6 87 }
dkato 0:c2da359279a6 88
dkato 0:c2da359279a6 89 bool FTPClient::quit() {
dkato 0:c2da359279a6 90 if (!_login) {
dkato 1:e069c405c934 91 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 92 return false;
dkato 0:c2da359279a6 93 }
dkato 0:c2da359279a6 94
dkato 0:c2da359279a6 95 sprintf(p_ftp_buf, "quit\r\n");
dkato 0:c2da359279a6 96 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 97 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 98 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 99 return false;
dkato 0:c2da359279a6 100 }
dkato 0:c2da359279a6 101 if (strncmp(p_ftp_buf, "250", 3) != 0) {
dkato 1:e069c405c934 102 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 103 return false;
dkato 0:c2da359279a6 104 }
dkato 0:c2da359279a6 105 _login = false;
dkato 0:c2da359279a6 106
dkato 0:c2da359279a6 107 FTPClientControlSock.close();
dkato 0:c2da359279a6 108 _ctr_open = false;
dkato 0:c2da359279a6 109 return true;
dkato 0:c2da359279a6 110 }
dkato 0:c2da359279a6 111
dkato 0:c2da359279a6 112 bool FTPClient::get(const char* file_name) {
dkato 0:c2da359279a6 113 FILE* fp;
dkato 0:c2da359279a6 114 int size;
dkato 0:c2da359279a6 115
dkato 0:c2da359279a6 116 if (!_login) {
dkato 1:e069c405c934 117 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 118 return false;
dkato 0:c2da359279a6 119 }
dkato 0:c2da359279a6 120
dkato 0:c2da359279a6 121 if (!open_data_sock()) {
dkato 1:e069c405c934 122 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 123 return false;
dkato 0:c2da359279a6 124 }
dkato 0:c2da359279a6 125
dkato 0:c2da359279a6 126 FTPClientDataSock.set_timeout(500);
dkato 0:c2da359279a6 127 sprintf(p_ftp_buf, "retr %s\r\n", file_name);
dkato 0:c2da359279a6 128 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 129 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
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 if ((strncmp(p_ftp_buf, "150", 3) != 0) && (strncmp(p_ftp_buf, "125", 3) != 0)) {
dkato 1:e069c405c934 134 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 135 return false;
dkato 0:c2da359279a6 136 }
dkato 0:c2da359279a6 137
dkato 0:c2da359279a6 138 sprintf(p_ftp_buf, "%s/%s", _root, file_name);
dkato 0:c2da359279a6 139 fp = fopen(p_ftp_buf, "w");
dkato 0:c2da359279a6 140 while (1) {
dkato 0:c2da359279a6 141 size = FTPClientDataSock.recv(p_ftp_buf, FTP_BUF_SIZE);
dkato 0:c2da359279a6 142 if (size > 0) {
dkato 0:c2da359279a6 143 fwrite(p_ftp_buf, size, sizeof(char), fp);
dkato 0:c2da359279a6 144 } else {
dkato 0:c2da359279a6 145 break;
dkato 0:c2da359279a6 146 }
dkato 0:c2da359279a6 147 }
dkato 0:c2da359279a6 148 fclose(fp);
dkato 0:c2da359279a6 149 FTPClientDataSock.close();
dkato 0:c2da359279a6 150
dkato 0:c2da359279a6 151 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 152 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 153 return false;
dkato 0:c2da359279a6 154 }
dkato 0:c2da359279a6 155 if (strncmp(p_ftp_buf, "226", 3) != 0) {
dkato 1:e069c405c934 156 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 157 return false;
dkato 0:c2da359279a6 158 }
dkato 0:c2da359279a6 159 return true;
dkato 0:c2da359279a6 160 }
dkato 0:c2da359279a6 161
dkato 0:c2da359279a6 162 bool FTPClient::put(const char* file_name) {
dkato 0:c2da359279a6 163 FILE* fp;
dkato 0:c2da359279a6 164 int32_t remain_size;
dkato 0:c2da359279a6 165 int32_t send_size;
dkato 0:c2da359279a6 166
dkato 0:c2da359279a6 167 if (!_login) {
dkato 1:e069c405c934 168 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 169 return false;
dkato 0:c2da359279a6 170 }
dkato 0:c2da359279a6 171
dkato 0:c2da359279a6 172 if (!open_data_sock()) {
dkato 1:e069c405c934 173 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 174 return false;
dkato 0:c2da359279a6 175 }
dkato 0:c2da359279a6 176
dkato 0:c2da359279a6 177 FTPClientDataSock.set_timeout(osWaitForever);
dkato 0:c2da359279a6 178 sprintf(p_ftp_buf, "stor %s\r\n", file_name);
dkato 0:c2da359279a6 179 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 180 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
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 if ((strncmp(p_ftp_buf, "150", 3) != 0) && (strncmp(p_ftp_buf, "125", 3) != 0)) {
dkato 1:e069c405c934 185 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 186 return false;
dkato 0:c2da359279a6 187 }
dkato 0:c2da359279a6 188
dkato 0:c2da359279a6 189 sprintf(p_ftp_buf, "%s/%s", _root, file_name);
dkato 0:c2da359279a6 190 fp = fopen(p_ftp_buf, "r");
dkato 0:c2da359279a6 191 fseek(fp, 0, SEEK_END);
dkato 0:c2da359279a6 192 remain_size = ftell(fp);
dkato 0:c2da359279a6 193 fseek(fp, 0, SEEK_SET);
dkato 0:c2da359279a6 194
dkato 0:c2da359279a6 195 while (remain_size > 0) {
dkato 0:c2da359279a6 196 if (remain_size > FTP_BUF_SIZE) {
dkato 0:c2da359279a6 197 send_size = FTP_BUF_SIZE;
dkato 0:c2da359279a6 198 } else {
dkato 0:c2da359279a6 199 send_size = remain_size;
dkato 0:c2da359279a6 200 }
dkato 0:c2da359279a6 201 fread(p_ftp_buf, 1, send_size, fp);
dkato 0:c2da359279a6 202 FTPClientDataSock.send(p_ftp_buf, send_size);
dkato 0:c2da359279a6 203 remain_size -= send_size;
dkato 0:c2da359279a6 204 }
dkato 0:c2da359279a6 205 fclose(fp);
dkato 0:c2da359279a6 206 FTPClientDataSock.close();
dkato 0:c2da359279a6 207
dkato 0:c2da359279a6 208 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 209 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 210 return false;
dkato 0:c2da359279a6 211 }
dkato 0:c2da359279a6 212 if (strncmp(p_ftp_buf, "226", 3) != 0) {
dkato 1:e069c405c934 213 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 214 return false;
dkato 0:c2da359279a6 215 }
dkato 0:c2da359279a6 216 return true;
dkato 0:c2da359279a6 217 }
dkato 0:c2da359279a6 218
dkato 0:c2da359279a6 219 bool FTPClient::del(const char* file_name) {
dkato 0:c2da359279a6 220 if (!_login) {
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
dkato 0:c2da359279a6 225 sprintf(p_ftp_buf, "dele %s\r\n", file_name);
dkato 0:c2da359279a6 226 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 227 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 228 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 229 return false;
dkato 0:c2da359279a6 230 }
dkato 0:c2da359279a6 231 if (strncmp(p_ftp_buf, "250", 3) != 0) {
dkato 1:e069c405c934 232 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 233 return false;
dkato 0:c2da359279a6 234 }
dkato 0:c2da359279a6 235
dkato 0:c2da359279a6 236 return true;
dkato 0:c2da359279a6 237 }
dkato 0:c2da359279a6 238
dkato 0:c2da359279a6 239 bool FTPClient::mkdir(const char* dir_name) {
dkato 0:c2da359279a6 240 if (!_login) {
dkato 1:e069c405c934 241 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 242 return false;
dkato 0:c2da359279a6 243 }
dkato 0:c2da359279a6 244
dkato 0:c2da359279a6 245 sprintf(p_ftp_buf, "xmkd %s\r\n", dir_name);
dkato 0:c2da359279a6 246 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 247 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 248 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 249 return false;
dkato 0:c2da359279a6 250 }
dkato 0:c2da359279a6 251 if (strncmp(p_ftp_buf, "257", 3) != 0) {
dkato 1:e069c405c934 252 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 253 return false;
dkato 0:c2da359279a6 254 }
dkato 0:c2da359279a6 255
dkato 0:c2da359279a6 256 return true;
dkato 0:c2da359279a6 257 }
dkato 0:c2da359279a6 258
dkato 0:c2da359279a6 259 bool FTPClient::cd(const char* dir_name) {
dkato 0:c2da359279a6 260 if (!_login) {
dkato 1:e069c405c934 261 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 262 return false;
dkato 0:c2da359279a6 263 }
dkato 0:c2da359279a6 264
dkato 0:c2da359279a6 265 sprintf(p_ftp_buf, "cwd %s\r\n", dir_name);
dkato 0:c2da359279a6 266 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 267 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 268 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 269 return false;
dkato 0:c2da359279a6 270 }
dkato 0:c2da359279a6 271 if (strncmp(p_ftp_buf, "250", 3) != 0) {
dkato 1:e069c405c934 272 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 273 return false;
dkato 0:c2da359279a6 274 }
dkato 0:c2da359279a6 275
dkato 0:c2da359279a6 276 return true;
dkato 0:c2da359279a6 277 }
dkato 0:c2da359279a6 278
dkato 0:c2da359279a6 279 bool FTPClient::dir(char* list_buf, int buf_size) {
dkato 0:c2da359279a6 280 int size;
dkato 0:c2da359279a6 281 int idx = 0;
dkato 0:c2da359279a6 282 int remain_size = buf_size - 1;
dkato 0:c2da359279a6 283
dkato 0:c2da359279a6 284 if (list_buf == NULL) {
dkato 1:e069c405c934 285 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 286 return false;
dkato 0:c2da359279a6 287 }
dkato 0:c2da359279a6 288 list_buf[0] = '\0';
dkato 0:c2da359279a6 289
dkato 0:c2da359279a6 290 if (!_login) {
dkato 1:e069c405c934 291 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 292 return false;
dkato 0:c2da359279a6 293 }
dkato 0:c2da359279a6 294
dkato 0:c2da359279a6 295 if (!open_data_sock()) {
dkato 1:e069c405c934 296 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 297 return false;
dkato 0:c2da359279a6 298 }
dkato 0:c2da359279a6 299
dkato 0:c2da359279a6 300 FTPClientDataSock.set_timeout(500);
dkato 0:c2da359279a6 301 sprintf(p_ftp_buf, "list\r\n");
dkato 0:c2da359279a6 302 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 303 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
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 if ((strncmp(p_ftp_buf, "150", 3) != 0) && (strncmp(p_ftp_buf, "125", 3) != 0)) {
dkato 1:e069c405c934 308 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 309 return false;
dkato 0:c2da359279a6 310 }
dkato 0:c2da359279a6 311
dkato 0:c2da359279a6 312 while (remain_size > 0) {
dkato 0:c2da359279a6 313 size = FTPClientDataSock.recv(p_ftp_buf, FTP_BUF_SIZE);
dkato 0:c2da359279a6 314 if (size > 0) {
dkato 0:c2da359279a6 315 if (size > remain_size) {
dkato 0:c2da359279a6 316 size = remain_size;
dkato 0:c2da359279a6 317 }
dkato 0:c2da359279a6 318 memcpy(&list_buf[idx], p_ftp_buf, size);
dkato 0:c2da359279a6 319 idx += size;
dkato 0:c2da359279a6 320 remain_size -= size;
dkato 0:c2da359279a6 321 } else {
dkato 0:c2da359279a6 322 break;
dkato 0:c2da359279a6 323 }
dkato 0:c2da359279a6 324 }
dkato 0:c2da359279a6 325 list_buf[idx] = '\0';
dkato 0:c2da359279a6 326 FTPClientDataSock.close();
dkato 0:c2da359279a6 327
dkato 0:c2da359279a6 328 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 329 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 330 return false;
dkato 0:c2da359279a6 331 }
dkato 0:c2da359279a6 332 if (strncmp(p_ftp_buf, "226", 3) != 0) {
dkato 1:e069c405c934 333 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 334 return false;
dkato 0:c2da359279a6 335 }
dkato 0:c2da359279a6 336 return true;
dkato 0:c2da359279a6 337 }
dkato 0:c2da359279a6 338
dkato 0:c2da359279a6 339 bool FTPClient::ls(char* list_buf, int buf_size) {
dkato 0:c2da359279a6 340 int size;
dkato 0:c2da359279a6 341 int idx = 0;
dkato 0:c2da359279a6 342 int remain_size = buf_size - 1;
dkato 0:c2da359279a6 343
dkato 0:c2da359279a6 344 if (list_buf == NULL) {
dkato 1:e069c405c934 345 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 346 return false;
dkato 0:c2da359279a6 347 }
dkato 0:c2da359279a6 348 list_buf[0] = '\0';
dkato 0:c2da359279a6 349
dkato 0:c2da359279a6 350 if (!_login) {
dkato 1:e069c405c934 351 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 352 return false;
dkato 0:c2da359279a6 353 }
dkato 0:c2da359279a6 354
dkato 0:c2da359279a6 355 if (!open_data_sock()) {
dkato 1:e069c405c934 356 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 357 return false;
dkato 0:c2da359279a6 358 }
dkato 0:c2da359279a6 359
dkato 0:c2da359279a6 360 FTPClientDataSock.set_timeout(500);
dkato 0:c2da359279a6 361 sprintf(p_ftp_buf, "nlst\r\n");
dkato 0:c2da359279a6 362 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 363 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
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 if ((strncmp(p_ftp_buf, "150", 3) != 0) && (strncmp(p_ftp_buf, "125", 3) != 0)) {
dkato 1:e069c405c934 368 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 369 return false;
dkato 0:c2da359279a6 370 }
dkato 0:c2da359279a6 371
dkato 0:c2da359279a6 372 while (remain_size > 0) {
dkato 0:c2da359279a6 373 size = FTPClientDataSock.recv(p_ftp_buf, FTP_BUF_SIZE);
dkato 0:c2da359279a6 374 if (size > 0) {
dkato 0:c2da359279a6 375 if (size > remain_size) {
dkato 0:c2da359279a6 376 size = remain_size;
dkato 0:c2da359279a6 377 }
dkato 0:c2da359279a6 378 memcpy(&list_buf[idx], p_ftp_buf, size);
dkato 0:c2da359279a6 379 idx += size;
dkato 0:c2da359279a6 380 remain_size -= size;
dkato 0:c2da359279a6 381 } else {
dkato 0:c2da359279a6 382 break;
dkato 0:c2da359279a6 383 }
dkato 0:c2da359279a6 384 }
dkato 0:c2da359279a6 385 list_buf[idx] = '\0';
dkato 0:c2da359279a6 386 FTPClientDataSock.close();
dkato 0:c2da359279a6 387
dkato 0:c2da359279a6 388 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 389 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 390 return false;
dkato 0:c2da359279a6 391 }
dkato 0:c2da359279a6 392 if (strncmp(p_ftp_buf, "226", 3) != 0) {
dkato 1:e069c405c934 393 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 394 return false;
dkato 0:c2da359279a6 395 }
dkato 0:c2da359279a6 396 return true;
dkato 0:c2da359279a6 397 }
dkato 0:c2da359279a6 398
dkato 0:c2da359279a6 399 bool FTPClient::open_data_sock() {
dkato 0:c2da359279a6 400 uint8_t ip_addr[4];
dkato 0:c2da359279a6 401 int i;
dkato 0:c2da359279a6 402 int remote_port = 0;
dkato 0:c2da359279a6 403 char* token = NULL;
dkato 0:c2da359279a6 404 char* savept = NULL;
dkato 0:c2da359279a6 405
dkato 0:c2da359279a6 406 sprintf(p_ftp_buf, "pasv\r\n");
dkato 0:c2da359279a6 407 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 408 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 1:e069c405c934 409 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 410 return false;
dkato 0:c2da359279a6 411 }
dkato 0:c2da359279a6 412 if (strncmp(p_ftp_buf, "227", 3) != 0) {
dkato 1:e069c405c934 413 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 414 return false;
dkato 0:c2da359279a6 415 }
dkato 0:c2da359279a6 416
dkato 0:c2da359279a6 417 token = strchr(p_ftp_buf, '(') + 1;
dkato 0:c2da359279a6 418 for (i = 0; i < 4; i++) {
dkato 0:c2da359279a6 419 token = strtok_r(token, ",", &savept);
dkato 0:c2da359279a6 420 ip_addr[i] = (uint8_t)atoi(token);
dkato 0:c2da359279a6 421 token = savept;
dkato 0:c2da359279a6 422 if (token == NULL) {
dkato 1:e069c405c934 423 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 424 return false;
dkato 0:c2da359279a6 425 }
dkato 0:c2da359279a6 426 }
dkato 0:c2da359279a6 427
dkato 0:c2da359279a6 428 for (i = 0; i < 2; i++) {
dkato 0:c2da359279a6 429 token = strtok_r(token, ",)", &savept);
dkato 0:c2da359279a6 430 remote_port <<= 8;
dkato 0:c2da359279a6 431 remote_port += atoi(token);
dkato 0:c2da359279a6 432 token = savept;
dkato 0:c2da359279a6 433 if (token == NULL) {
dkato 1:e069c405c934 434 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 435 return false;
dkato 0:c2da359279a6 436 }
dkato 0:c2da359279a6 437 }
dkato 0:c2da359279a6 438 sprintf(ftp_data_ip_addr, "%d.%d.%d.%d", ip_addr[0], ip_addr[1], ip_addr[2], ip_addr[3]);
dkato 0:c2da359279a6 439
dkato 0:c2da359279a6 440 FTPClientDataSock.open(p_network);
dkato 0:c2da359279a6 441 for (i = 0; i < 20; i++) {
dkato 0:c2da359279a6 442 if (FTPClientDataSock.connect(ftp_data_ip_addr, remote_port) >= 0) {
dkato 0:c2da359279a6 443 return true;
dkato 0:c2da359279a6 444 }
dkato 0:c2da359279a6 445 wait(1);
dkato 0:c2da359279a6 446 }
dkato 1:e069c405c934 447 ftp_debug_print("ERROR: %s(%d)\r\n", __FILE__, __LINE__);
dkato 0:c2da359279a6 448 return false;
dkato 0:c2da359279a6 449 }
dkato 0:c2da359279a6 450