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