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