1
0

msh_cmd.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. /*
  2. * internal commands for RT-Thread module shell
  3. *
  4. * COPYRIGHT (C) 2013-2015, Shanghai Real-Thread Technology Co., Ltd
  5. *
  6. * This file is part of RT-Thread (http://www.rt-thread.org)
  7. * Maintainer: bernard.xiong <bernard.xiong at gmail.com>
  8. *
  9. * All rights reserved.
  10. *
  11. * This program is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License as published by
  13. * the Free Software Foundation; either version 2 of the License, or
  14. * (at your option) any later version.
  15. *
  16. * This program is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU General Public License along
  22. * with this program; if not, write to the Free Software Foundation, Inc.,
  23. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  24. *
  25. * Change Logs:
  26. * Date Author Notes
  27. * 2013-03-30 Bernard the first verion for FinSH
  28. * 2015-08-28 Bernard Add mkfs command.
  29. */
  30. #include <rtthread.h>
  31. #include <finsh.h>
  32. #include "msh.h"
  33. #ifdef FINSH_USING_MSH
  34. #ifdef RT_USING_DFS
  35. #include <dfs_posix.h>
  36. #ifdef DFS_USING_WORKDIR
  37. extern char working_directory[];
  38. #endif
  39. int cmd_ls(int argc, char **argv)
  40. {
  41. extern void ls(const char *pathname);
  42. if (argc == 1)
  43. {
  44. #ifdef DFS_USING_WORKDIR
  45. ls(working_directory);
  46. #else
  47. ls("/");
  48. #endif
  49. }
  50. else
  51. {
  52. ls(argv[1]);
  53. }
  54. return 0;
  55. }
  56. FINSH_FUNCTION_EXPORT_ALIAS(cmd_ls, __cmd_ls, List information about the FILEs.);
  57. int cmd_cp(int argc, char **argv)
  58. {
  59. void copy(const char *src, const char *dst);
  60. if (argc != 3)
  61. {
  62. rt_kprintf("Usage: cp SOURCE DEST\n");
  63. rt_kprintf("Copy SOURCE to DEST.\n");
  64. }
  65. else
  66. {
  67. copy(argv[1], argv[2]);
  68. }
  69. return 0;
  70. }
  71. FINSH_FUNCTION_EXPORT_ALIAS(cmd_cp, __cmd_cp, Copy SOURCE to DEST.);
  72. int cmd_mv(int argc, char **argv)
  73. {
  74. if (argc != 3)
  75. {
  76. rt_kprintf("Usage: mv SOURCE DEST\n");
  77. rt_kprintf("Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.\n");
  78. }
  79. else
  80. {
  81. int fd;
  82. char *dest = RT_NULL;
  83. rt_kprintf("%s => %s\n", argv[1], argv[2]);
  84. fd = open(argv[2], O_DIRECTORY, 0);
  85. if (fd >= 0)
  86. {
  87. char *src;
  88. close(fd);
  89. /* it's a directory */
  90. dest = (char *)rt_malloc(DFS_PATH_MAX);
  91. if (dest == RT_NULL)
  92. {
  93. rt_kprintf("out of memory\n");
  94. return -RT_ENOMEM;
  95. }
  96. src = argv[1] + rt_strlen(argv[1]);
  97. while (src != argv[1])
  98. {
  99. if (*src == '/') break;
  100. src --;
  101. }
  102. rt_snprintf(dest, DFS_PATH_MAX - 1, "%s/%s", argv[2], src);
  103. }
  104. else
  105. {
  106. fd = open(argv[2], O_RDONLY, 0);
  107. if (fd >= 0)
  108. {
  109. close(fd);
  110. unlink(argv[2]);
  111. }
  112. dest = argv[2];
  113. }
  114. rename(argv[1], dest);
  115. if (dest != RT_NULL && dest != argv[2]) rt_free(dest);
  116. }
  117. return 0;
  118. }
  119. FINSH_FUNCTION_EXPORT_ALIAS(cmd_mv, __cmd_mv, Rename SOURCE to DEST.);
  120. int cmd_cat(int argc, char **argv)
  121. {
  122. int index;
  123. extern void cat(const char *filename);
  124. if (argc == 1)
  125. {
  126. rt_kprintf("Usage: cat [FILE]...\n");
  127. rt_kprintf("Concatenate FILE(s)\n");
  128. return 0;
  129. }
  130. for (index = 1; index < argc; index ++)
  131. {
  132. cat(argv[index]);
  133. }
  134. return 0;
  135. }
  136. FINSH_FUNCTION_EXPORT_ALIAS(cmd_cat, __cmd_cat, Concatenate FILE(s));
  137. int cmd_rm(int argc, char **argv)
  138. {
  139. int index;
  140. if (argc == 1)
  141. {
  142. rt_kprintf("Usage: rm FILE...\n");
  143. rt_kprintf("Remove (unlink) the FILE(s).\n");
  144. return 0;
  145. }
  146. for (index = 1; index < argc; index ++)
  147. {
  148. unlink(argv[index]);
  149. }
  150. return 0;
  151. }
  152. FINSH_FUNCTION_EXPORT_ALIAS(cmd_rm, __cmd_rm, Remove(unlink) the FILE(s).);
  153. #ifdef DFS_USING_WORKDIR
  154. int cmd_cd(int argc, char **argv)
  155. {
  156. if (argc == 1)
  157. {
  158. rt_kprintf("%s\n", working_directory);
  159. }
  160. else if (argc == 2)
  161. {
  162. if (chdir(argv[1]) != 0)
  163. {
  164. rt_kprintf("No such directory: %s\n", argv[1]);
  165. }
  166. }
  167. return 0;
  168. }
  169. FINSH_FUNCTION_EXPORT_ALIAS(cmd_cd, __cmd_cd, Change the shell working directory.);
  170. int cmd_pwd(int argc, char **argv)
  171. {
  172. rt_kprintf("%s\n", working_directory);
  173. return 0;
  174. }
  175. FINSH_FUNCTION_EXPORT_ALIAS(cmd_pwd, __cmd_pwd, Print the name of the current working directory.);
  176. #endif
  177. int cmd_mkdir(int argc, char **argv)
  178. {
  179. if (argc == 1)
  180. {
  181. rt_kprintf("Usage: mkdir [OPTION] DIRECTORY\n");
  182. rt_kprintf("Create the DIRECTORY, if they do not already exist.\n");
  183. }
  184. else
  185. {
  186. mkdir(argv[1], 0);
  187. }
  188. return 0;
  189. }
  190. FINSH_FUNCTION_EXPORT_ALIAS(cmd_mkdir, __cmd_mkdir, Create the DIRECTORY.);
  191. int cmd_mkfs(int argc, char **argv)
  192. {
  193. int result = 0;
  194. char *type = "elm"; /* use the default file system type as 'fatfs' */
  195. if (argc == 2)
  196. {
  197. result = dfs_mkfs(type, argv[1]);
  198. }
  199. else if (argc == 4)
  200. {
  201. if (strcmp(argv[1], "-t") == 0)
  202. {
  203. type = argv[2];
  204. result = dfs_mkfs(type, argv[3]);
  205. }
  206. }
  207. else
  208. {
  209. rt_kprintf("Usage: mkfs [-t type] device\n");
  210. return 0;
  211. }
  212. if (result != RT_EOK)
  213. {
  214. rt_kprintf("mkfs failed, result=%d\n", result);
  215. }
  216. return 0;
  217. }
  218. FINSH_FUNCTION_EXPORT_ALIAS(cmd_mkfs, __cmd_mkfs, format disk with file system);
  219. extern int df(const char *path);
  220. int cmd_df(int argc, char** argv)
  221. {
  222. if (argc != 2)
  223. {
  224. df("/");
  225. }
  226. else
  227. {
  228. if ((strcmp(argv[1], "--help") == 0) || (strcmp(argv[1], "-h") == 0))
  229. {
  230. rt_kprintf("df [path]\n");
  231. }
  232. else
  233. {
  234. df(argv[1]);
  235. }
  236. }
  237. return 0;
  238. }
  239. FINSH_FUNCTION_EXPORT_ALIAS(cmd_df, __cmd_df, disk free);
  240. int cmd_echo(int argc, char** argv)
  241. {
  242. if (argc == 2)
  243. {
  244. rt_kprintf("%s\n", argv[1]);
  245. }
  246. else if (argc == 3)
  247. {
  248. int fd;
  249. fd = open(argv[2], O_RDWR | O_APPEND | O_CREAT, 0);
  250. if (fd >= 0)
  251. {
  252. write (fd, argv[1], strlen(argv[1]));
  253. close(fd);
  254. }
  255. else
  256. {
  257. rt_kprintf("open file:%s failed!\n", argv[2]);
  258. }
  259. }
  260. else
  261. {
  262. rt_kprintf("Usage: echo \"string\" [filename]\n");
  263. }
  264. return 0;
  265. }
  266. FINSH_FUNCTION_EXPORT_ALIAS(cmd_echo, __cmd_echo, echo string to file);
  267. #endif
  268. #ifdef RT_USING_LWIP
  269. int cmd_ifconfig(int argc, char **argv)
  270. {
  271. extern void list_if(void);
  272. extern void set_if(char *netif_name, char *ip_addr, char *gw_addr, char *nm_addr);
  273. if (argc == 1)
  274. {
  275. list_if();
  276. }
  277. else if (argc == 5)
  278. {
  279. rt_kprintf("config : %s\n", argv[1]);
  280. rt_kprintf("IP addr: %s\n", argv[2]);
  281. rt_kprintf("Gateway: %s\n", argv[3]);
  282. rt_kprintf("netmask: %s\n", argv[4]);
  283. set_if(argv[1], argv[2], argv[3], argv[4]);
  284. }
  285. else
  286. {
  287. rt_kprintf("bad parameter! e.g: ifconfig e0 192.168.1.30 192.168.1.1 255.255.255.0\n");
  288. }
  289. return 0;
  290. }
  291. FINSH_FUNCTION_EXPORT_ALIAS(cmd_ifconfig, __cmd_ifconfig, list the information of network interfaces);
  292. #ifdef RT_LWIP_DNS
  293. #include <lwip/api.h>
  294. #include <lwip/dns.h>
  295. #include <lwip/ip_addr.h>
  296. #include <lwip/init.h>
  297. int cmd_dns(int argc, char **argv)
  298. {
  299. extern void set_dns(char* dns_server);
  300. if (argc == 1)
  301. {
  302. int index;
  303. #if (LWIP_VERSION) < 0x02000000U
  304. ip_addr_t ip_addr;
  305. for(index=0; index<DNS_MAX_SERVERS; index++)
  306. {
  307. ip_addr = dns_getserver(index);
  308. rt_kprintf("dns server #%d: %s\n", index, ipaddr_ntoa(&ip_addr));
  309. }
  310. #else
  311. const ip_addr_t *ip_addr;
  312. for(index=0; index<DNS_MAX_SERVERS; index++)
  313. {
  314. ip_addr = dns_getserver(index);
  315. rt_kprintf("dns server #%d: %s\n", index, ipaddr_ntoa(ip_addr));
  316. }
  317. #endif
  318. }
  319. else if (argc == 2)
  320. {
  321. rt_kprintf("dns : %s\n", argv[1]);
  322. set_dns(argv[1]);
  323. }
  324. else
  325. {
  326. rt_kprintf("bad parameter! e.g: dns 114.114.114.114\n");
  327. }
  328. return 0;
  329. }
  330. FINSH_FUNCTION_EXPORT_ALIAS(cmd_dns, __cmd_dns, list the information of dns);
  331. #endif
  332. #ifdef RT_LWIP_TCP
  333. int cmd_netstat(int argc, char **argv)
  334. {
  335. extern void list_tcps(void);
  336. list_tcps();
  337. return 0;
  338. }
  339. FINSH_FUNCTION_EXPORT_ALIAS(cmd_netstat, __cmd_netstat, list the information of TCP / IP);
  340. #endif
  341. #endif /* RT_USING_LWIP */
  342. int cmd_ps(int argc, char **argv)
  343. {
  344. extern long list_thread(void);
  345. extern int list_module(void);
  346. #ifdef RT_USING_MODULE
  347. if ((argc == 2) && (strcmp(argv[1], "-m") == 0))
  348. list_module();
  349. else
  350. #endif
  351. list_thread();
  352. return 0;
  353. }
  354. FINSH_FUNCTION_EXPORT_ALIAS(cmd_ps, __cmd_ps, List threads in the system.);
  355. int cmd_time(int argc, char **argv)
  356. {
  357. return 0;
  358. }
  359. FINSH_FUNCTION_EXPORT_ALIAS(cmd_time, __cmd_time, Execute command with time.);
  360. #ifdef RT_USING_HEAP
  361. int cmd_free(int argc, char **argv)
  362. {
  363. extern void list_mem(void);
  364. extern void list_memheap(void);
  365. #ifdef RT_USING_MEMHEAP_AS_HEAP
  366. list_memheap();
  367. #else
  368. list_mem();
  369. #endif
  370. return 0;
  371. }
  372. FINSH_FUNCTION_EXPORT_ALIAS(cmd_free, __cmd_free, Show the memory usage in the system.);
  373. #endif
  374. #endif