summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbernard <[email protected]>2014-06-25 17:23:28 +0800
committerbernard <[email protected]>2014-06-25 17:23:28 +0800
commitdcd79747947803dbc724bcd49bcfca42a5932c06 (patch)
treefd9754717f48c5798a38c22298fc277ef99c76c8
parenta58593f784d4b84ce09f194c15bc79e20a80aa6a (diff)
[Finsh] Enhance mv command.
-rw-r--r--components/finsh/msh_cmd.c44
1 files changed, 43 insertions, 1 deletions
diff --git a/components/finsh/msh_cmd.c b/components/finsh/msh_cmd.c
index 3bbd46958f..7c67681833 100644
--- a/components/finsh/msh_cmd.c
+++ b/components/finsh/msh_cmd.c
@@ -88,8 +88,50 @@ int cmd_mv(int argc, char** argv)
}
else
{
+ int fd;
+ char *dest = RT_NULL;
+
rt_kprintf("%s => %s\n", argv[1], argv[2]);
- rename(argv[1], argv[2]);
+
+ fd = open(argv[2], O_DIRECTORY, 0);
+ if (fd >= 0)
+ {
+ char *src;
+
+ close(fd);
+
+ /* it's a directory */
+ dest = (char*)rt_malloc(DFS_PATH_MAX);
+ if (dest == RT_NULL)
+ {
+ rt_kprintf("out of memory\n");
+ return -RT_ENOMEM;
+ }
+
+ src = argv[1] + rt_strlen(argv[1]);
+ while (src != argv[1])
+ {
+ if (*src == '/') break;
+ src --;
+ }
+
+ rt_snprintf(dest, DFS_PATH_MAX - 1, "%s/%s", argv[2], src);
+ }
+ else
+ {
+ fd = open(argv[2], O_RDONLY, 0);
+ if (fd >= 0)
+ {
+ close(fd);
+
+ unlink(argv[2]);
+ }
+
+ dest = argv[2];
+ }
+
+ rename(argv[1], dest);
+ if (dest != RT_NULL && dest != argv[2]) rt_free(dest);
}
return 0;