ftpc.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  1. #include "ftpc.h"
  2. un_l2cval remote_ip;
  3. uint16_t remote_port;
  4. un_l2cval local_ip;
  5. uint16_t local_port;
  6. uint8_t connect_state_control_ftpc = 0;
  7. uint8_t connect_state_data_ftpc = 0;
  8. uint8_t gModeActivePassiveflag = 0;
  9. uint8_t FTP_destip[4] = {192, 168, 10, 230}; // For FTP client examples; destination network info
  10. uint16_t FTP_destport = 21; // For FTP client examples; destination network info
  11. uint8_t gMenuStart = 0;
  12. uint8_t gDataSockReady = 0;
  13. uint8_t gDataPutGetStart = 0;
  14. static uint8_t gMsgBuf[20]={0,};
  15. struct ftpc ftpc;
  16. struct Command Command;
  17. void ftpc_init(uint8_t * src_ip)
  18. {
  19. ftpc.dsock_mode = ACTIVE_MODE;
  20. local_ip.cVal[0] = src_ip[0];
  21. local_ip.cVal[1] = src_ip[1];
  22. local_ip.cVal[2] = src_ip[2];
  23. local_ip.cVal[3] = src_ip[3];
  24. local_port = 35000;
  25. strcpy(ftpc.workingdir, "/");
  26. socket(CTRL_SOCK, Sn_MR_TCP, FTP_destport, 0x0);
  27. }
  28. uint8_t ftpc_run(uint8_t * dbuf)
  29. {
  30. #ifndef Need_UARTGetCharBlocking_func
  31. uint16_t size = 0;
  32. long ret = 0;
  33. uint32_t send_byte, recv_byte;
  34. uint32_t blocklen;
  35. uint32_t remain_filesize;
  36. uint32_t remain_datasize;
  37. uint8_t msg_c;
  38. uint8_t dat[50]={0,};
  39. uint32_t totalSize = 0, availableSize = 0;
  40. switch(getSn_SR(CTRL_SOCK))
  41. {
  42. case SOCK_ESTABLISHED :
  43. if(!connect_state_control_ftpc){
  44. printf("%d:FTP Connected\r\n", CTRL_SOCK);
  45. strcpy(ftpc.workingdir, "/");
  46. connect_state_control_ftpc = 1;
  47. }
  48. if(gMenuStart){
  49. gMenuStart = 0;
  50. printf("\r\n----------------------------------------\r\n");
  51. printf("Press menu key\r\n");
  52. printf("----------------------------------------\r\n");
  53. printf("1> View FTP Server Directory\r\n");
  54. printf("2> View My Directory\r\n");
  55. printf("3> Sets the type of file to be transferred. Current state : %s\r\n", (ftpc.type==ASCII_TYPE)?"Ascii":"Binary");
  56. printf("4> Sets Data Connection. Current state : %s\r\n", (ftpc.dsock_mode==ACTIVE_MODE)?"Active":"Passive");
  57. printf("5> Put File to Server\r\n");
  58. printf("6> Get File from Server\r\n");
  59. #if defined(F_FILESYSTEM)
  60. printf("7> Delete My File\r\n");
  61. #endif
  62. printf("----------------------------------------\r\n");
  63. while(1){
  64. msg_c=ftp_getc();
  65. if(msg_c=='1'){
  66. if(ftpc.dsock_mode==PASSIVE_MODE){
  67. sprintf(dat,"PASV\r\n");
  68. send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
  69. Command.First = f_dir;
  70. break;
  71. }
  72. else{
  73. wiz_NetInfo gWIZNETINFO;
  74. ctlnetwork(CN_GET_NETINFO, (void*) &gWIZNETINFO);
  75. sprintf(dat,"PORT %d,%d,%d,%d,%d,%d\r\n", gWIZNETINFO.ip[0], gWIZNETINFO.ip[1], gWIZNETINFO.ip[2], gWIZNETINFO.ip[3], (uint8_t)(local_port>>8), (uint8_t)(local_port&0x00ff));
  76. send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
  77. Command.First = f_dir;
  78. gModeActivePassiveflag = 1;
  79. break;
  80. }
  81. break;
  82. }
  83. else if(msg_c=='5'){
  84. if(ftpc.dsock_mode==PASSIVE_MODE){
  85. sprintf(dat,"PASV\r\n");
  86. send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
  87. Command.First = f_put;
  88. break;
  89. }
  90. else{
  91. wiz_NetInfo gWIZNETINFO;
  92. ctlnetwork(CN_GET_NETINFO, (void*) &gWIZNETINFO);
  93. sprintf(dat,"PORT %d,%d,%d,%d,%d,%d\r\n", gWIZNETINFO.ip[0], gWIZNETINFO.ip[1], gWIZNETINFO.ip[2], gWIZNETINFO.ip[3], (uint8_t)(local_port>>8), (uint8_t)(local_port&0x00ff));
  94. send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
  95. Command.First = f_put;
  96. gModeActivePassiveflag = 1;
  97. break;
  98. }
  99. }
  100. else if(msg_c=='6'){
  101. if(ftpc.dsock_mode==PASSIVE_MODE){
  102. sprintf(dat,"PASV\r\n");
  103. send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
  104. Command.First = f_get;
  105. break;
  106. }
  107. else{
  108. wiz_NetInfo gWIZNETINFO;
  109. ctlnetwork(CN_GET_NETINFO, (void*) &gWIZNETINFO);
  110. sprintf(dat,"PORT %d,%d,%d,%d,%d,%d\r\n", gWIZNETINFO.ip[0], gWIZNETINFO.ip[1], gWIZNETINFO.ip[2], gWIZNETINFO.ip[3], (uint8_t)(local_port>>8), (uint8_t)(local_port&0x00ff));
  111. send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
  112. Command.First = f_get;
  113. gModeActivePassiveflag = 1;
  114. break;
  115. }
  116. }
  117. else if(msg_c=='2'){
  118. #if defined(F_FILESYSTEM)
  119. scan_files(ftpc.workingdir, dbuf, (int *)&size);
  120. printf("\r\n%s\r\n", dbuf);
  121. #else
  122. if (strncmp(ftpc.workingdir, "/$Recycle.Bin", sizeof("/$Recycle.Bin")) != 0)
  123. size = sprintf(dbuf, "drwxr-xr-x 1 ftp ftp 0 Dec 31 2014 $Recycle.Bin\r\n-rwxr-xr-x 1 ftp ftp 512 Dec 31 2014 test.txt\r\n");
  124. printf("\r\n%s\r\n", dbuf);
  125. #endif
  126. gMenuStart = 1;
  127. break;
  128. }
  129. else if(msg_c=='3'){
  130. printf("1> ASCII\r\n");
  131. printf("2> BINARY\r\n");
  132. while(1){
  133. msg_c=ftp_getc();
  134. if(msg_c=='1'){
  135. sprintf(dat,"TYPE %c\r\n", TransferAscii);
  136. ftpc.type = ASCII_TYPE;
  137. send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
  138. break;
  139. }
  140. else if(msg_c=='2'){
  141. sprintf(dat,"TYPE %c\r\n", TransferBinary);
  142. ftpc.type = IMAGE_TYPE;
  143. send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
  144. break;
  145. }
  146. else{
  147. printf("\r\nRetry...\r\n");
  148. }
  149. }
  150. break;
  151. }
  152. else if(msg_c=='4'){
  153. printf("1> ACTIVE\r\n");
  154. printf("2> PASSIVE\r\n");
  155. while(1){
  156. msg_c=ftp_getc();
  157. if(msg_c=='1'){
  158. ftpc.dsock_mode=ACTIVE_MODE;
  159. break;
  160. }
  161. else if(msg_c=='2'){
  162. ftpc.dsock_mode=PASSIVE_MODE;
  163. break;
  164. }
  165. else{
  166. printf("\r\nRetry...\r\n");
  167. }
  168. }
  169. gMenuStart = 1;
  170. break;
  171. }
  172. #if defined(F_FILESYSTEM)
  173. else if(msg_c=='7'){
  174. printf(">del filename?");
  175. sprintf(ftpc.filename, "/%s\r\n", User_Keyboard_MSG());
  176. if (f_unlink((const char *)ftpc.filename) != 0){
  177. printf("\r\nCould not delete.\r\n");
  178. }
  179. else{
  180. printf("\r\nDeleted.\r\n");
  181. }
  182. gMenuStart = 1;
  183. break;
  184. }
  185. #endif
  186. else{
  187. printf("\r\nRetry...\r\n");
  188. }
  189. }
  190. }
  191. if(gDataSockReady){
  192. gDataSockReady = 0;
  193. switch(Command.First){
  194. case f_dir:
  195. sprintf(dat,"LIST\r\n");
  196. send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
  197. break;
  198. case f_put:
  199. printf(">put file name?");
  200. sprintf(dat,"STOR %s\r\n", User_Keyboard_MSG());
  201. send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
  202. break;
  203. case f_get:
  204. printf(">get file name?");
  205. sprintf(dat,"RETR %s\r\n", User_Keyboard_MSG());
  206. send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
  207. break;
  208. default:
  209. printf("Command.First = default\r\n");
  210. break;
  211. }
  212. }
  213. if((size = getSn_RX_RSR(CTRL_SOCK)) > 0){ // Don't need to check SOCKERR_BUSY because it doesn't not occur.
  214. memset(dbuf, 0, _MAX_SS);
  215. if(size > _MAX_SS) size = _MAX_SS - 1;
  216. ret = recv(CTRL_SOCK,dbuf,size);
  217. dbuf[ret] = '\0';
  218. if(ret != size)
  219. {
  220. if(ret==SOCK_BUSY) return 0;
  221. if(ret < 0){
  222. printf("%d:recv() error:%ld\r\n",CTRL_SOCK,ret);
  223. close(CTRL_SOCK);
  224. return ret;
  225. }
  226. }
  227. printf("Rcvd Command: %s\r\n", dbuf);
  228. proc_ftpc((char *)dbuf);
  229. }
  230. break;
  231. case SOCK_CLOSE_WAIT :
  232. printf("%d:CloseWait\r\n",CTRL_SOCK);
  233. if((ret=disconnect(CTRL_SOCK)) != SOCK_OK) return ret;
  234. printf("%d:Closed\r\n",CTRL_SOCK);
  235. break;
  236. case SOCK_CLOSED :
  237. printf("%d:FTPStart\r\n",CTRL_SOCK);
  238. if((ret=socket(CTRL_SOCK, Sn_MR_TCP, FTP_destport, 0x0)) != CTRL_SOCK){
  239. printf("%d:socket() error:%ld\r\n", CTRL_SOCK, ret);
  240. close(CTRL_SOCK);
  241. return ret;
  242. }
  243. break;
  244. case SOCK_INIT :
  245. printf("%d:Opened\r\n",CTRL_SOCK);
  246. if((ret = connect(CTRL_SOCK, FTP_destip, FTP_destport)) != SOCK_OK){
  247. printf("%d:Connect error\r\n",CTRL_SOCK);
  248. return ret;
  249. }
  250. connect_state_control_ftpc = 0;
  251. printf("%d:Connectting...\r\n",CTRL_SOCK);
  252. break;
  253. default :
  254. break;
  255. }
  256. switch(getSn_SR(DATA_SOCK)){
  257. case SOCK_ESTABLISHED :
  258. if(!connect_state_data_ftpc){
  259. printf("%d:FTP Data socket Connected\r\n", DATA_SOCK);
  260. connect_state_data_ftpc = 1;
  261. }
  262. if(gDataPutGetStart){
  263. switch(Command.Second){
  264. case s_dir:
  265. printf("dir waiting...\r\n");
  266. if((size = getSn_RX_RSR(DATA_SOCK)) > 0){ // Don't need to check SOCKERR_BUSY because it doesn't not occur.
  267. printf("ok\r\n");
  268. memset(dbuf, 0, _MAX_SS);
  269. if(size > _MAX_SS) size = _MAX_SS - 1;
  270. ret = recv(DATA_SOCK,dbuf,size);
  271. dbuf[ret] = '\0';
  272. if(ret != size){
  273. if(ret==SOCK_BUSY) return 0;
  274. if(ret < 0){
  275. printf("%d:recv() error:%ld\r\n",CTRL_SOCK,ret);
  276. close(DATA_SOCK);
  277. return ret;
  278. }
  279. }
  280. printf("Rcvd Data:\n\r%s\n\r", dbuf);
  281. gDataPutGetStart = 0;
  282. Command.Second = s_nocmd;
  283. }
  284. break;
  285. case s_put:
  286. printf("put waiting...\r\n");
  287. if(strlen(ftpc.workingdir) == 1)
  288. sprintf(ftpc.filename, "/%s", (uint8_t *)gMsgBuf);
  289. else
  290. sprintf(ftpc.filename, "%s/%s", ftpc.workingdir, (uint8_t *)gMsgBuf);
  291. #if defined(F_FILESYSTEM)
  292. ftpc.fr = f_open(&(ftpc.fil), (const char *)ftpc.filename, FA_READ);
  293. if(ftpc.fr == FR_OK){
  294. remain_filesize = ftpc.fil.fsize;
  295. printf("f_open return FR_OK\r\n");
  296. do{
  297. memset(dbuf, 0, _MAX_SS);
  298. if(remain_filesize > _MAX_SS)
  299. send_byte = _MAX_SS;
  300. else
  301. send_byte = remain_filesize;
  302. ftpc.fr = f_read(&(ftpc.fil), (void *)dbuf, send_byte , (UINT *)&blocklen);
  303. if(ftpc.fr != FR_OK){
  304. break;
  305. }
  306. printf("#");
  307. send(DATA_SOCK, dbuf, blocklen);
  308. remain_filesize -= blocklen;
  309. }while(remain_filesize != 0);
  310. printf("\r\nFile read finished\r\n");
  311. ftpc.fr = f_close(&(ftpc.fil));
  312. }
  313. else{
  314. printf("File Open Error: %d\r\n", ftpc.fr);
  315. ftpc.fr = f_close(&(ftpc.fil));
  316. }
  317. #else
  318. remain_filesize = strlen(ftpc.filename);
  319. do{
  320. memset(dbuf, 0, _MAX_SS);
  321. blocklen = sprintf(dbuf, "%s", ftpc.filename);
  322. printf("########## dbuf:%s\r\n", dbuf);
  323. send(DATA_SOCK, dbuf, blocklen);
  324. remain_filesize -= blocklen;
  325. }while(remain_filesize != 0);
  326. #endif
  327. gDataPutGetStart = 0;
  328. Command.Second = s_nocmd;
  329. disconnect(DATA_SOCK);
  330. break;
  331. case s_get:
  332. printf("get waiting...\r\n");
  333. if(strlen(ftpc.workingdir) == 1)
  334. sprintf(ftpc.filename, "/%s", (uint8_t *)gMsgBuf);
  335. else
  336. sprintf(ftpc.filename, "%s/%s", ftpc.workingdir, (uint8_t *)gMsgBuf);
  337. #if defined(F_FILESYSTEM)
  338. ftpc.fr = f_open(&(ftpc.fil), (const char *)ftpc.filename, FA_CREATE_ALWAYS | FA_WRITE);
  339. if(ftpc.fr == FR_OK){
  340. printf("f_open return FR_OK\r\n");
  341. while(1){
  342. if((remain_datasize = getSn_RX_RSR(DATA_SOCK)) > 0){
  343. while(1){
  344. memset(dbuf, 0, _MAX_SS);
  345. if(remain_datasize > _MAX_SS) recv_byte = _MAX_SS;
  346. else recv_byte = remain_datasize;
  347. ret = recv(DATA_SOCK, dbuf, recv_byte);
  348. ftpc.fr = f_write(&(ftpc.fil), (const void *)dbuf, (UINT)ret, (UINT *)&blocklen);
  349. remain_datasize -= blocklen;
  350. if(ftpc.fr != FR_OK){
  351. printf("f_write failed\r\n");
  352. break;
  353. }
  354. if(remain_datasize <= 0) break;
  355. }
  356. if(ftpc.fr != FR_OK){
  357. printf("f_write failed\r\n");
  358. break;
  359. }
  360. printf("#");
  361. }
  362. else{
  363. if(getSn_SR(DATA_SOCK) != SOCK_ESTABLISHED) break;
  364. }
  365. }
  366. printf("\r\nFile write finished\r\n");
  367. ftpc.fr = f_close(&(ftpc.fil));
  368. gDataPutGetStart = 0;
  369. }else{
  370. printf("File Open Error: %d\r\n", ftpc.fr);
  371. }
  372. #else
  373. while(1){
  374. if((remain_datasize = getSn_RX_RSR(DATA_SOCK)) > 0){
  375. while(1){
  376. memset(dbuf, 0, _MAX_SS);
  377. if(remain_datasize > _MAX_SS)
  378. recv_byte = _MAX_SS;
  379. else
  380. recv_byte = remain_datasize;
  381. ret = recv(DATA_SOCK, dbuf, recv_byte);
  382. printf("########## dbuf:%s\r\n", dbuf);
  383. remain_datasize -= ret;
  384. if(remain_datasize <= 0)
  385. break;
  386. }
  387. }else{
  388. if(getSn_SR(DATA_SOCK) != SOCK_ESTABLISHED)
  389. break;
  390. }
  391. }
  392. gDataPutGetStart = 0;
  393. Command.Second = s_nocmd;
  394. #endif
  395. break;
  396. default:
  397. printf("Command.Second = default\r\n");
  398. break;
  399. }
  400. }
  401. break;
  402. case SOCK_CLOSE_WAIT :
  403. printf("%d:CloseWait\r\n",DATA_SOCK);
  404. if((ret=disconnect(DATA_SOCK)) != SOCK_OK) return ret;
  405. printf("%d:Closed\r\n",DATA_SOCK);
  406. break;
  407. case SOCK_CLOSED :
  408. if(ftpc.dsock_state == DATASOCK_READY){
  409. if(ftpc.dsock_mode == PASSIVE_MODE){
  410. printf("%d:FTPDataStart, port : %d\r\n",DATA_SOCK, local_port);
  411. if((ret=socket(DATA_SOCK, Sn_MR_TCP, local_port, 0x0)) != DATA_SOCK){
  412. printf("%d:socket() error:%ld\r\n", DATA_SOCK, ret);
  413. close(DATA_SOCK);
  414. return ret;
  415. }
  416. local_port++;
  417. if(local_port > 50000)
  418. local_port = 35000;
  419. }else{
  420. printf("%d:FTPDataStart, port : %d\r\n",DATA_SOCK, local_port);
  421. if((ret=socket(DATA_SOCK, Sn_MR_TCP, local_port, 0x0)) != DATA_SOCK){
  422. printf("%d:socket() error:%ld\r\n", DATA_SOCK, ret);
  423. close(DATA_SOCK);
  424. return ret;
  425. }
  426. local_port++;
  427. if(local_port > 50000)
  428. local_port = 35000;
  429. }
  430. ftpc.dsock_state = DATASOCK_START;
  431. }
  432. break;
  433. case SOCK_INIT :
  434. printf("%d:Opened\r\n",DATA_SOCK);
  435. if(ftpc.dsock_mode == ACTIVE_MODE){
  436. if( (ret = listen(DATA_SOCK)) != SOCK_OK){
  437. printf("%d:Listen error\r\n",DATA_SOCK);
  438. return ret;
  439. }
  440. gDataSockReady = 1;
  441. printf("%d:Listen ok\r\n",DATA_SOCK);
  442. }else{
  443. if((ret = connect(DATA_SOCK, remote_ip.cVal, remote_port)) != SOCK_OK){
  444. printf("%d:Connect error\r\n", DATA_SOCK);
  445. return ret;
  446. }
  447. gDataSockReady = 1;
  448. }
  449. connect_state_data_ftpc = 0;
  450. break;
  451. default :
  452. break;
  453. }
  454. #endif
  455. return 0;
  456. }
  457. char proc_ftpc(char * buf)
  458. {
  459. uint16_t Responses;
  460. uint8_t dat[30]={0,};
  461. Responses =(buf[0]-'0')*100+(buf[1]-'0')*10+(buf[2]-'0');
  462. switch(Responses){
  463. case R_220: /* Service ready for new user. */
  464. printf("\r\nInput your User ID > ");
  465. sprintf(dat,"USER %s\r\n", User_Keyboard_MSG());
  466. printf("\r\n");
  467. send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
  468. break;
  469. case R_331: /* User name okay, need password. */
  470. printf("\r\nInput your Password > ");
  471. sprintf(dat,"PASS %s\r\n", User_Keyboard_MSG());
  472. printf("\r\n");
  473. send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
  474. break;
  475. case R_230: /* User logged in, proceed */
  476. printf("\r\nUser logged in, proceed\r\n");
  477. sprintf(dat,"TYPE %c\r\n", TransferAscii);
  478. ftpc.type = ASCII_TYPE;
  479. send(CTRL_SOCK, (uint8_t *)dat, strlen(dat));
  480. break;
  481. case R_200:
  482. if((ftpc.dsock_mode==ACTIVE_MODE)&&gModeActivePassiveflag){
  483. ftpc.dsock_state = DATASOCK_READY;
  484. gModeActivePassiveflag = 0;
  485. }
  486. else{
  487. gMenuStart = 1;
  488. }
  489. break;
  490. case R_150:
  491. switch(Command.First){
  492. case f_dir:
  493. Command.First = f_nocmd;
  494. Command.Second = s_dir;
  495. gDataPutGetStart = 1;
  496. break;
  497. case f_get:
  498. Command.First = f_nocmd;
  499. Command.Second = s_get;
  500. gDataPutGetStart = 1;
  501. break;
  502. case f_put:
  503. Command.First = f_nocmd;
  504. Command.Second = s_put;
  505. gDataPutGetStart = 1;
  506. break;
  507. default :
  508. printf("Command.First = default\r\n");
  509. break;
  510. }
  511. break;
  512. case R_226:
  513. gMenuStart = 1;
  514. break;
  515. case R_227:
  516. if (pportc(buf) == -1){
  517. printf("Bad port syntax\r\n");
  518. }
  519. else{
  520. printf("Go Open Data Sock...\r\n ");
  521. ftpc.dsock_mode = PASSIVE_MODE;
  522. ftpc.dsock_state = DATASOCK_READY;
  523. }
  524. break;
  525. default:
  526. printf("\r\nDefault Status = %d\r\n",(uint16_t)Responses);
  527. gDataSockReady = 1;
  528. break;
  529. }
  530. return 1;
  531. }
  532. int pportc(char * arg)
  533. {
  534. int i;
  535. char* tok=0;
  536. strtok(arg,"(");
  537. for (i = 0; i < 4; i++)
  538. {
  539. if(i==0) tok = strtok(NULL,",\r\n");
  540. else tok = strtok(NULL,",");
  541. remote_ip.cVal[i] = (uint8_t)atoi(tok);
  542. if (!tok){
  543. printf("bad pport : %s\r\n", arg);
  544. return -1;
  545. }
  546. }
  547. remote_port = 0;
  548. for (i = 0; i < 2; i++){
  549. tok = strtok(NULL,",\r\n");
  550. remote_port <<= 8;
  551. remote_port += atoi(tok);
  552. if (!tok){
  553. printf("bad pport : %s\r\n", arg);
  554. return -1;
  555. }
  556. }
  557. printf("ip : %d.%d.%d.%d, port : %d\r\n", remote_ip.cVal[0], remote_ip.cVal[1], remote_ip.cVal[2], remote_ip.cVal[3], remote_port);
  558. return 0;
  559. }
  560. uint8_t* User_Keyboard_MSG()
  561. {
  562. uint8_t i=0;
  563. do{
  564. gMsgBuf[i] = ftp_getc();
  565. i++;
  566. }while(gMsgBuf[i-1]!=0x0d);
  567. gMsgBuf[i-1]=0;
  568. return gMsgBuf;
  569. }