msh_cmd.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  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. int cmd_echo(int argc, char** argv)
  220. {
  221. if (argc == 2)
  222. {
  223. rt_kprintf("%s\n", argv[1]);
  224. }
  225. else if (argc == 3)
  226. {
  227. int fd;
  228. fd = open(argv[2], O_RDWR | O_APPEND | O_CREAT, 0);
  229. if (fd >= 0)
  230. {
  231. write (fd, argv[1], strlen(argv[1]));
  232. close(fd);
  233. }
  234. else
  235. {
  236. rt_kprintf("open file:%s failed!\n", argv[2]);
  237. }
  238. }
  239. else
  240. {
  241. rt_kprintf("Usage: echo \"string\" [filename]\n");
  242. }
  243. return 0;
  244. }
  245. FINSH_FUNCTION_EXPORT_ALIAS(cmd_echo, __cmd_echo, echo string to file);
  246. #endif
  247. #ifdef RT_USING_LWIP
  248. int cmd_ifconfig(int argc, char **argv)
  249. {
  250. extern void list_if(void);
  251. extern void set_if(char *netif_name, char *ip_addr, char *gw_addr, char *nm_addr);
  252. if (argc == 1)
  253. {
  254. list_if();
  255. }
  256. else if (argc == 5)
  257. {
  258. rt_kprintf("config : %s\n", argv[1]);
  259. rt_kprintf("IP addr: %s\n", argv[2]);
  260. rt_kprintf("Gateway: %s\n", argv[3]);
  261. rt_kprintf("netmask: %s\n", argv[4]);
  262. set_if(argv[1], argv[2], argv[3], argv[4]);
  263. }
  264. else
  265. {
  266. rt_kprintf("bad parameter! e.g: ifconfig e0 192.168.1.30 192.168.1.1 255.255.255.0\n");
  267. }
  268. return 0;
  269. }
  270. FINSH_FUNCTION_EXPORT_ALIAS(cmd_ifconfig, __cmd_ifconfig, list the information of network interfaces);
  271. #ifdef RT_LWIP_DNS
  272. #include <lwip/api.h>
  273. #include <lwip/dns.h>
  274. #include <lwip/ip_addr.h>
  275. #include <lwip/init.h>
  276. int cmd_dns(int argc, char **argv)
  277. {
  278. extern void set_dns(char* dns_server);
  279. if (argc == 1)
  280. {
  281. int index;
  282. #if (LWIP_VERSION) < 0x02000000U
  283. ip_addr_t ip_addr;
  284. for(index=0; index<DNS_MAX_SERVERS; index++)
  285. {
  286. ip_addr = dns_getserver(index);
  287. rt_kprintf("dns server #%d: %s\n", index, ipaddr_ntoa(&ip_addr));
  288. }
  289. #else
  290. const ip_addr_t *ip_addr;
  291. for(index=0; index<DNS_MAX_SERVERS; index++)
  292. {
  293. ip_addr = dns_getserver(index);
  294. rt_kprintf("dns server #%d: %s\n", index, ipaddr_ntoa(ip_addr));
  295. }
  296. #endif
  297. }
  298. else if (argc == 2)
  299. {
  300. rt_kprintf("dns : %s\n", argv[1]);
  301. set_dns(argv[1]);
  302. }
  303. else
  304. {
  305. rt_kprintf("bad parameter! e.g: dns 114.114.114.114\n");
  306. }
  307. return 0;
  308. }
  309. FINSH_FUNCTION_EXPORT_ALIAS(cmd_dns, __cmd_dns, list the information of dns);
  310. #endif
  311. #ifdef RT_LWIP_TCP
  312. int cmd_netstat(int argc, char **argv)
  313. {
  314. extern void list_tcps(void);
  315. list_tcps();
  316. return 0;
  317. }
  318. FINSH_FUNCTION_EXPORT_ALIAS(cmd_netstat, __cmd_netstat, list the information of TCP / IP);
  319. #endif
  320. #endif /* RT_USING_LWIP */
  321. int cmd_ps(int argc, char **argv)
  322. {
  323. extern long list_thread(void);
  324. extern int list_module(void);
  325. #ifdef RT_USING_MODULE
  326. if ((argc == 2) && (strcmp(argv[1], "-m") == 0))
  327. list_module();
  328. else
  329. #endif
  330. list_thread();
  331. return 0;
  332. }
  333. FINSH_FUNCTION_EXPORT_ALIAS(cmd_ps, __cmd_ps, List threads in the system.);
  334. int cmd_time(int argc, char **argv)
  335. {
  336. return 0;
  337. }
  338. FINSH_FUNCTION_EXPORT_ALIAS(cmd_time, __cmd_time, Execute command with time.);
  339. #ifdef RT_USING_HEAP
  340. int cmd_free(int argc, char **argv)
  341. {
  342. extern void list_mem(void);
  343. extern void list_memheap(void);
  344. #ifdef RT_USING_MEMHEAP_AS_HEAP
  345. list_memheap();
  346. #else
  347. list_mem();
  348. #endif
  349. return 0;
  350. }
  351. FINSH_FUNCTION_EXPORT_ALIAS(cmd_free, __cmd_free, Show the memory usage in the system.);
  352. #endif
  353. #endif