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