FTP client library for mbed-os

Committer:
dkato
Date:
Wed Feb 07 07:01:38 2018 +0000
Revision:
0:c2da359279a6
Child:
1:e069c405c934
first commit

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 0:c2da359279a6 22 FTPClient::FTPClient(NetworkInterface *net, const char* root) {
dkato 0:c2da359279a6 23 _ctr_open = false;
dkato 0:c2da359279a6 24 _login = false;
dkato 0:c2da359279a6 25 strcpy(_root, root);
dkato 0:c2da359279a6 26 p_network = net;
dkato 0:c2da359279a6 27 p_ftp_buf = new char[FTP_BUF_SIZE];
dkato 0:c2da359279a6 28 }
dkato 0:c2da359279a6 29
dkato 0:c2da359279a6 30 FTPClient::~FTPClient() {
dkato 0:c2da359279a6 31 delete [] p_ftp_buf;
dkato 0:c2da359279a6 32 }
dkato 0:c2da359279a6 33
dkato 0:c2da359279a6 34 bool FTPClient::open(const char* ip_addr, int port, const char* user, const char* pass) {
dkato 0:c2da359279a6 35 if (_ctr_open) {
dkato 0:c2da359279a6 36 FTPClientControlSock.close();
dkato 0:c2da359279a6 37 }
dkato 0:c2da359279a6 38
dkato 0:c2da359279a6 39 FTPClientControlSock.open(p_network);
dkato 0:c2da359279a6 40 if (FTPClientControlSock.connect(ip_addr, port) < 0) {
dkato 0:c2da359279a6 41 return false;
dkato 0:c2da359279a6 42 }
dkato 0:c2da359279a6 43 _ctr_open = true;
dkato 0:c2da359279a6 44
dkato 0:c2da359279a6 45 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 0:c2da359279a6 46 return false;
dkato 0:c2da359279a6 47 }
dkato 0:c2da359279a6 48 if (strncmp(p_ftp_buf, "220", 3) != 0) {
dkato 0:c2da359279a6 49 return false;
dkato 0:c2da359279a6 50 }
dkato 0:c2da359279a6 51
dkato 0:c2da359279a6 52 _login = false;
dkato 0:c2da359279a6 53 sprintf(p_ftp_buf, "user %s\r\n", user);
dkato 0:c2da359279a6 54 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 55 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 0:c2da359279a6 56 return false;
dkato 0:c2da359279a6 57 }
dkato 0:c2da359279a6 58 if (strncmp(p_ftp_buf, "331", 3) != 0) {
dkato 0:c2da359279a6 59 return false;
dkato 0:c2da359279a6 60 }
dkato 0:c2da359279a6 61
dkato 0:c2da359279a6 62 sprintf(p_ftp_buf, "pass %s\r\n", pass);
dkato 0:c2da359279a6 63 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 64 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 0:c2da359279a6 65 return false;
dkato 0:c2da359279a6 66 }
dkato 0:c2da359279a6 67 if (strncmp(p_ftp_buf, "230", 3) != 0) {
dkato 0:c2da359279a6 68 return false;
dkato 0:c2da359279a6 69 }
dkato 0:c2da359279a6 70 _login = true;
dkato 0:c2da359279a6 71 return true;
dkato 0:c2da359279a6 72 }
dkato 0:c2da359279a6 73
dkato 0:c2da359279a6 74 bool FTPClient::quit() {
dkato 0:c2da359279a6 75 if (!_login) {
dkato 0:c2da359279a6 76 return false;
dkato 0:c2da359279a6 77 }
dkato 0:c2da359279a6 78
dkato 0:c2da359279a6 79 sprintf(p_ftp_buf, "quit\r\n");
dkato 0:c2da359279a6 80 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 81 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 0:c2da359279a6 82 return false;
dkato 0:c2da359279a6 83 }
dkato 0:c2da359279a6 84 if (strncmp(p_ftp_buf, "250", 3) != 0) {
dkato 0:c2da359279a6 85 return false;
dkato 0:c2da359279a6 86 }
dkato 0:c2da359279a6 87 _login = false;
dkato 0:c2da359279a6 88
dkato 0:c2da359279a6 89 FTPClientControlSock.close();
dkato 0:c2da359279a6 90 _ctr_open = false;
dkato 0:c2da359279a6 91 return true;
dkato 0:c2da359279a6 92 }
dkato 0:c2da359279a6 93
dkato 0:c2da359279a6 94 bool FTPClient::get(const char* file_name) {
dkato 0:c2da359279a6 95 FILE* fp;
dkato 0:c2da359279a6 96 int size;
dkato 0:c2da359279a6 97
dkato 0:c2da359279a6 98 if (!_login) {
dkato 0:c2da359279a6 99 return false;
dkato 0:c2da359279a6 100 }
dkato 0:c2da359279a6 101
dkato 0:c2da359279a6 102 if (!open_data_sock()) {
dkato 0:c2da359279a6 103 return false;
dkato 0:c2da359279a6 104 }
dkato 0:c2da359279a6 105
dkato 0:c2da359279a6 106 FTPClientDataSock.set_timeout(500);
dkato 0:c2da359279a6 107 sprintf(p_ftp_buf, "retr %s\r\n", file_name);
dkato 0:c2da359279a6 108 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 109 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 0:c2da359279a6 110 return false;
dkato 0:c2da359279a6 111 }
dkato 0:c2da359279a6 112 if ((strncmp(p_ftp_buf, "150", 3) != 0) && (strncmp(p_ftp_buf, "125", 3) != 0)) {
dkato 0:c2da359279a6 113 return false;
dkato 0:c2da359279a6 114 }
dkato 0:c2da359279a6 115
dkato 0:c2da359279a6 116 sprintf(p_ftp_buf, "%s/%s", _root, file_name);
dkato 0:c2da359279a6 117 fp = fopen(p_ftp_buf, "w");
dkato 0:c2da359279a6 118 while (1) {
dkato 0:c2da359279a6 119 size = FTPClientDataSock.recv(p_ftp_buf, FTP_BUF_SIZE);
dkato 0:c2da359279a6 120 if (size > 0) {
dkato 0:c2da359279a6 121 fwrite(p_ftp_buf, size, sizeof(char), fp);
dkato 0:c2da359279a6 122 } else {
dkato 0:c2da359279a6 123 break;
dkato 0:c2da359279a6 124 }
dkato 0:c2da359279a6 125 }
dkato 0:c2da359279a6 126 fclose(fp);
dkato 0:c2da359279a6 127 FTPClientDataSock.close();
dkato 0:c2da359279a6 128
dkato 0:c2da359279a6 129 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 0:c2da359279a6 130 return false;
dkato 0:c2da359279a6 131 }
dkato 0:c2da359279a6 132 if (strncmp(p_ftp_buf, "226", 3) != 0) {
dkato 0:c2da359279a6 133 return false;
dkato 0:c2da359279a6 134 }
dkato 0:c2da359279a6 135 return true;
dkato 0:c2da359279a6 136 }
dkato 0:c2da359279a6 137
dkato 0:c2da359279a6 138 bool FTPClient::put(const char* file_name) {
dkato 0:c2da359279a6 139 FILE* fp;
dkato 0:c2da359279a6 140 int32_t remain_size;
dkato 0:c2da359279a6 141 int32_t send_size;
dkato 0:c2da359279a6 142
dkato 0:c2da359279a6 143 if (!_login) {
dkato 0:c2da359279a6 144 return false;
dkato 0:c2da359279a6 145 }
dkato 0:c2da359279a6 146
dkato 0:c2da359279a6 147 if (!open_data_sock()) {
dkato 0:c2da359279a6 148 return false;
dkato 0:c2da359279a6 149 }
dkato 0:c2da359279a6 150
dkato 0:c2da359279a6 151 FTPClientDataSock.set_timeout(osWaitForever);
dkato 0:c2da359279a6 152 sprintf(p_ftp_buf, "stor %s\r\n", file_name);
dkato 0:c2da359279a6 153 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 154 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 0:c2da359279a6 155 return false;
dkato 0:c2da359279a6 156 }
dkato 0:c2da359279a6 157 if ((strncmp(p_ftp_buf, "150", 3) != 0) && (strncmp(p_ftp_buf, "125", 3) != 0)) {
dkato 0:c2da359279a6 158 return false;
dkato 0:c2da359279a6 159 }
dkato 0:c2da359279a6 160
dkato 0:c2da359279a6 161 sprintf(p_ftp_buf, "%s/%s", _root, file_name);
dkato 0:c2da359279a6 162 fp = fopen(p_ftp_buf, "r");
dkato 0:c2da359279a6 163 fseek(fp, 0, SEEK_END);
dkato 0:c2da359279a6 164 remain_size = ftell(fp);
dkato 0:c2da359279a6 165 fseek(fp, 0, SEEK_SET);
dkato 0:c2da359279a6 166
dkato 0:c2da359279a6 167 while (remain_size > 0) {
dkato 0:c2da359279a6 168 if (remain_size > FTP_BUF_SIZE) {
dkato 0:c2da359279a6 169 send_size = FTP_BUF_SIZE;
dkato 0:c2da359279a6 170 } else {
dkato 0:c2da359279a6 171 send_size = remain_size;
dkato 0:c2da359279a6 172 }
dkato 0:c2da359279a6 173 fread(p_ftp_buf, 1, send_size, fp);
dkato 0:c2da359279a6 174 FTPClientDataSock.send(p_ftp_buf, send_size);
dkato 0:c2da359279a6 175 remain_size -= send_size;
dkato 0:c2da359279a6 176 }
dkato 0:c2da359279a6 177 fclose(fp);
dkato 0:c2da359279a6 178 FTPClientDataSock.close();
dkato 0:c2da359279a6 179
dkato 0:c2da359279a6 180 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 0:c2da359279a6 181 return false;
dkato 0:c2da359279a6 182 }
dkato 0:c2da359279a6 183 if (strncmp(p_ftp_buf, "226", 3) != 0) {
dkato 0:c2da359279a6 184 return false;
dkato 0:c2da359279a6 185 }
dkato 0:c2da359279a6 186 return true;
dkato 0:c2da359279a6 187 }
dkato 0:c2da359279a6 188
dkato 0:c2da359279a6 189 bool FTPClient::del(const char* file_name) {
dkato 0:c2da359279a6 190 if (!_login) {
dkato 0:c2da359279a6 191 return false;
dkato 0:c2da359279a6 192 }
dkato 0:c2da359279a6 193
dkato 0:c2da359279a6 194 sprintf(p_ftp_buf, "dele %s\r\n", file_name);
dkato 0:c2da359279a6 195 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 196 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 0:c2da359279a6 197 return false;
dkato 0:c2da359279a6 198 }
dkato 0:c2da359279a6 199 if (strncmp(p_ftp_buf, "250", 3) != 0) {
dkato 0:c2da359279a6 200 return false;
dkato 0:c2da359279a6 201 }
dkato 0:c2da359279a6 202
dkato 0:c2da359279a6 203 return true;
dkato 0:c2da359279a6 204 }
dkato 0:c2da359279a6 205
dkato 0:c2da359279a6 206 bool FTPClient::mkdir(const char* dir_name) {
dkato 0:c2da359279a6 207 if (!_login) {
dkato 0:c2da359279a6 208 return false;
dkato 0:c2da359279a6 209 }
dkato 0:c2da359279a6 210
dkato 0:c2da359279a6 211 sprintf(p_ftp_buf, "xmkd %s\r\n", dir_name);
dkato 0:c2da359279a6 212 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 213 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 0:c2da359279a6 214 return false;
dkato 0:c2da359279a6 215 }
dkato 0:c2da359279a6 216 if (strncmp(p_ftp_buf, "257", 3) != 0) {
dkato 0:c2da359279a6 217 return false;
dkato 0:c2da359279a6 218 }
dkato 0:c2da359279a6 219
dkato 0:c2da359279a6 220 return true;
dkato 0:c2da359279a6 221 }
dkato 0:c2da359279a6 222
dkato 0:c2da359279a6 223 bool FTPClient::cd(const char* dir_name) {
dkato 0:c2da359279a6 224 if (!_login) {
dkato 0:c2da359279a6 225 return false;
dkato 0:c2da359279a6 226 }
dkato 0:c2da359279a6 227
dkato 0:c2da359279a6 228 sprintf(p_ftp_buf, "cwd %s\r\n", dir_name);
dkato 0:c2da359279a6 229 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 230 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 0:c2da359279a6 231 return false;
dkato 0:c2da359279a6 232 }
dkato 0:c2da359279a6 233 if (strncmp(p_ftp_buf, "250", 3) != 0) {
dkato 0:c2da359279a6 234 return false;
dkato 0:c2da359279a6 235 }
dkato 0:c2da359279a6 236
dkato 0:c2da359279a6 237 return true;
dkato 0:c2da359279a6 238 }
dkato 0:c2da359279a6 239
dkato 0:c2da359279a6 240 bool FTPClient::dir(char* list_buf, int buf_size) {
dkato 0:c2da359279a6 241 int size;
dkato 0:c2da359279a6 242 int idx = 0;
dkato 0:c2da359279a6 243 int remain_size = buf_size - 1;
dkato 0:c2da359279a6 244
dkato 0:c2da359279a6 245 if (list_buf == NULL) {
dkato 0:c2da359279a6 246 return false;
dkato 0:c2da359279a6 247 }
dkato 0:c2da359279a6 248 list_buf[0] = '\0';
dkato 0:c2da359279a6 249
dkato 0:c2da359279a6 250 if (!_login) {
dkato 0:c2da359279a6 251 return false;
dkato 0:c2da359279a6 252 }
dkato 0:c2da359279a6 253
dkato 0:c2da359279a6 254 if (!open_data_sock()) {
dkato 0:c2da359279a6 255 return false;
dkato 0:c2da359279a6 256 }
dkato 0:c2da359279a6 257
dkato 0:c2da359279a6 258 FTPClientDataSock.set_timeout(500);
dkato 0:c2da359279a6 259 sprintf(p_ftp_buf, "list\r\n");
dkato 0:c2da359279a6 260 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 261 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 0:c2da359279a6 262 return false;
dkato 0:c2da359279a6 263 }
dkato 0:c2da359279a6 264 if ((strncmp(p_ftp_buf, "150", 3) != 0) && (strncmp(p_ftp_buf, "125", 3) != 0)) {
dkato 0:c2da359279a6 265 return false;
dkato 0:c2da359279a6 266 }
dkato 0:c2da359279a6 267
dkato 0:c2da359279a6 268 while (remain_size > 0) {
dkato 0:c2da359279a6 269 size = FTPClientDataSock.recv(p_ftp_buf, FTP_BUF_SIZE);
dkato 0:c2da359279a6 270 if (size > 0) {
dkato 0:c2da359279a6 271 if (size > remain_size) {
dkato 0:c2da359279a6 272 size = remain_size;
dkato 0:c2da359279a6 273 }
dkato 0:c2da359279a6 274 memcpy(&list_buf[idx], p_ftp_buf, size);
dkato 0:c2da359279a6 275 idx += size;
dkato 0:c2da359279a6 276 remain_size -= size;
dkato 0:c2da359279a6 277 } else {
dkato 0:c2da359279a6 278 break;
dkato 0:c2da359279a6 279 }
dkato 0:c2da359279a6 280 }
dkato 0:c2da359279a6 281 list_buf[idx] = '\0';
dkato 0:c2da359279a6 282 FTPClientDataSock.close();
dkato 0:c2da359279a6 283
dkato 0:c2da359279a6 284 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 0:c2da359279a6 285 return false;
dkato 0:c2da359279a6 286 }
dkato 0:c2da359279a6 287 if (strncmp(p_ftp_buf, "226", 3) != 0) {
dkato 0:c2da359279a6 288 return false;
dkato 0:c2da359279a6 289 }
dkato 0:c2da359279a6 290 return true;
dkato 0:c2da359279a6 291 }
dkato 0:c2da359279a6 292
dkato 0:c2da359279a6 293 bool FTPClient::ls(char* list_buf, int buf_size) {
dkato 0:c2da359279a6 294 int size;
dkato 0:c2da359279a6 295 int idx = 0;
dkato 0:c2da359279a6 296 int remain_size = buf_size - 1;
dkato 0:c2da359279a6 297
dkato 0:c2da359279a6 298 if (list_buf == NULL) {
dkato 0:c2da359279a6 299 return false;
dkato 0:c2da359279a6 300 }
dkato 0:c2da359279a6 301 list_buf[0] = '\0';
dkato 0:c2da359279a6 302
dkato 0:c2da359279a6 303 if (!_login) {
dkato 0:c2da359279a6 304 return false;
dkato 0:c2da359279a6 305 }
dkato 0:c2da359279a6 306
dkato 0:c2da359279a6 307 if (!open_data_sock()) {
dkato 0:c2da359279a6 308 return false;
dkato 0:c2da359279a6 309 }
dkato 0:c2da359279a6 310
dkato 0:c2da359279a6 311 FTPClientDataSock.set_timeout(500);
dkato 0:c2da359279a6 312 sprintf(p_ftp_buf, "nlst\r\n");
dkato 0:c2da359279a6 313 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 314 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 0:c2da359279a6 315 return false;
dkato 0:c2da359279a6 316 }
dkato 0:c2da359279a6 317 if ((strncmp(p_ftp_buf, "150", 3) != 0) && (strncmp(p_ftp_buf, "125", 3) != 0)) {
dkato 0:c2da359279a6 318 return false;
dkato 0:c2da359279a6 319 }
dkato 0:c2da359279a6 320
dkato 0:c2da359279a6 321 while (remain_size > 0) {
dkato 0:c2da359279a6 322 size = FTPClientDataSock.recv(p_ftp_buf, FTP_BUF_SIZE);
dkato 0:c2da359279a6 323 if (size > 0) {
dkato 0:c2da359279a6 324 if (size > remain_size) {
dkato 0:c2da359279a6 325 size = remain_size;
dkato 0:c2da359279a6 326 }
dkato 0:c2da359279a6 327 memcpy(&list_buf[idx], p_ftp_buf, size);
dkato 0:c2da359279a6 328 idx += size;
dkato 0:c2da359279a6 329 remain_size -= size;
dkato 0:c2da359279a6 330 } else {
dkato 0:c2da359279a6 331 break;
dkato 0:c2da359279a6 332 }
dkato 0:c2da359279a6 333 }
dkato 0:c2da359279a6 334 list_buf[idx] = '\0';
dkato 0:c2da359279a6 335 FTPClientDataSock.close();
dkato 0:c2da359279a6 336
dkato 0:c2da359279a6 337 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 0:c2da359279a6 338 return false;
dkato 0:c2da359279a6 339 }
dkato 0:c2da359279a6 340 if (strncmp(p_ftp_buf, "226", 3) != 0) {
dkato 0:c2da359279a6 341 return false;
dkato 0:c2da359279a6 342 }
dkato 0:c2da359279a6 343 return true;
dkato 0:c2da359279a6 344 }
dkato 0:c2da359279a6 345
dkato 0:c2da359279a6 346 bool FTPClient::open_data_sock() {
dkato 0:c2da359279a6 347 uint8_t ip_addr[4];
dkato 0:c2da359279a6 348 int i;
dkato 0:c2da359279a6 349 int remote_port = 0;
dkato 0:c2da359279a6 350 char* token = NULL;
dkato 0:c2da359279a6 351 char* savept = NULL;
dkato 0:c2da359279a6 352
dkato 0:c2da359279a6 353 sprintf(p_ftp_buf, "pasv\r\n");
dkato 0:c2da359279a6 354 FTPClientControlSock.send(p_ftp_buf, strlen(p_ftp_buf));
dkato 0:c2da359279a6 355 if (FTPClientControlSock.recv(p_ftp_buf, FTP_BUF_SIZE) <= 0) {
dkato 0:c2da359279a6 356 return false;
dkato 0:c2da359279a6 357 }
dkato 0:c2da359279a6 358 if (strncmp(p_ftp_buf, "227", 3) != 0) {
dkato 0:c2da359279a6 359 return false;
dkato 0:c2da359279a6 360 }
dkato 0:c2da359279a6 361
dkato 0:c2da359279a6 362 token = strchr(p_ftp_buf, '(') + 1;
dkato 0:c2da359279a6 363 for (i = 0; i < 4; i++) {
dkato 0:c2da359279a6 364 token = strtok_r(token, ",", &savept);
dkato 0:c2da359279a6 365 ip_addr[i] = (uint8_t)atoi(token);
dkato 0:c2da359279a6 366 token = savept;
dkato 0:c2da359279a6 367 if (token == NULL) {
dkato 0:c2da359279a6 368 return false;
dkato 0:c2da359279a6 369 }
dkato 0:c2da359279a6 370 }
dkato 0:c2da359279a6 371
dkato 0:c2da359279a6 372 for (i = 0; i < 2; i++) {
dkato 0:c2da359279a6 373 token = strtok_r(token, ",)", &savept);
dkato 0:c2da359279a6 374 remote_port <<= 8;
dkato 0:c2da359279a6 375 remote_port += atoi(token);
dkato 0:c2da359279a6 376 token = savept;
dkato 0:c2da359279a6 377 if (token == NULL) {
dkato 0:c2da359279a6 378 return false;
dkato 0:c2da359279a6 379 }
dkato 0:c2da359279a6 380 }
dkato 0:c2da359279a6 381 sprintf(ftp_data_ip_addr, "%d.%d.%d.%d", ip_addr[0], ip_addr[1], ip_addr[2], ip_addr[3]);
dkato 0:c2da359279a6 382
dkato 0:c2da359279a6 383 FTPClientDataSock.open(p_network);
dkato 0:c2da359279a6 384 for (i = 0; i < 20; i++) {
dkato 0:c2da359279a6 385 if (FTPClientDataSock.connect(ftp_data_ip_addr, remote_port) >= 0) {
dkato 0:c2da359279a6 386 return true;
dkato 0:c2da359279a6 387 }
dkato 0:c2da359279a6 388 wait(1);
dkato 0:c2da359279a6 389 }
dkato 0:c2da359279a6 390 return false;
dkato 0:c2da359279a6 391 }
dkato 0:c2da359279a6 392