msh_cmd.c 8.7 KB

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