| 240 | MSH_CMD_EXPORT_ALIAS(cmd_cp, cp, Copy SOURCE to DEST.); |
| 241 | |
| 242 | static int cmd_mv(int argc, char **argv) |
| 243 | { |
| 244 | if (argc != 3) |
| 245 | { |
| 246 | rt_kprintf("Usage: mv SOURCE DEST\n"); |
| 247 | rt_kprintf("Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.\n"); |
| 248 | } |
| 249 | else |
| 250 | { |
| 251 | int fd; |
| 252 | char *dest = RT_NULL; |
| 253 | |
| 254 | rt_kprintf("%s => %s\n", argv[1], argv[2]); |
| 255 | |
| 256 | fd = open(argv[2], O_DIRECTORY, 0); |
| 257 | if (fd >= 0) |
| 258 | { |
| 259 | char *src; |
| 260 | |
| 261 | close(fd); |
| 262 | |
| 263 | /* it's a directory */ |
| 264 | dest = (char *)rt_malloc(DFS_PATH_MAX); |
| 265 | if (dest == RT_NULL) |
| 266 | { |
| 267 | rt_kprintf("out of memory\n"); |
| 268 | return -RT_ENOMEM; |
| 269 | } |
| 270 | |
| 271 | src = argv[1] + rt_strlen(argv[1]); |
| 272 | while (src != argv[1]) |
| 273 | { |
| 274 | if (*src == '/') break; |
| 275 | src --; |
| 276 | } |
| 277 | |
| 278 | rt_snprintf(dest, DFS_PATH_MAX - 1, "%s/%s", argv[2], src); |
| 279 | } |
| 280 | else |
| 281 | { |
| 282 | fd = open(argv[2], O_RDONLY, 0); |
| 283 | if (fd >= 0) |
| 284 | { |
| 285 | close(fd); |
| 286 | |
| 287 | unlink(argv[2]); |
| 288 | } |
| 289 | |
| 290 | dest = argv[2]; |
| 291 | } |
| 292 | |
| 293 | rename(argv[1], dest); |
| 294 | if (dest != RT_NULL && dest != argv[2]) rt_free(dest); |
| 295 | } |
| 296 | |
| 297 | return 0; |
| 298 | } |
| 299 | MSH_CMD_EXPORT_ALIAS(cmd_mv, mv, Rename SOURCE to DEST.); |
nothing calls this directly
no test coverage detected