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 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 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 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 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 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 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 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 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 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); 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 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 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 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) 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 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 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 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