diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-04-07 23:35:26 +0200 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-04-07 23:35:26 +0200 |
commit | 37ae00a4dd20e095ca58cf00d666ed5ab373f004 (patch) | |
tree | db6143d4dc52e747bd48b3c95b548e417ba93f3a /Userland/mv.cpp | |
parent | 71b643655282309d347e464806e4ca1cd1115797 (diff) | |
download | serenity-37ae00a4dd20e095ca58cf00d666ed5ab373f004.zip |
Kernel+Userland: Add the rename() syscall along with a basic /bin/mv.
Diffstat (limited to 'Userland/mv.cpp')
-rw-r--r-- | Userland/mv.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/Userland/mv.cpp b/Userland/mv.cpp new file mode 100644 index 0000000000..486761c00e --- /dev/null +++ b/Userland/mv.cpp @@ -0,0 +1,32 @@ +#include <stdio.h> +#include <unistd.h> +#include <sys/stat.h> +#include <AK/AKString.h> +#include <AK/FileSystemPath.h> + +int main(int argc, char** argv) +{ + if (argc != 3) { + printf("usage: mv <old-path> <new-path>\n"); + return 1; + } + + String old_path = argv[1]; + String new_path = argv[2]; + + struct stat st; + int rc = lstat(new_path.characters(), &st); + if (rc == 0) { + if (S_ISDIR(st.st_mode)) { + auto old_basename = FileSystemPath(old_path).basename(); + new_path = String::format("%s/%s", new_path.characters(), old_basename.characters()); + } + } + + rc = rename(old_path.characters(), new_path.characters()); + if (rc < 0) { + perror("rename"); + return 1; + } + return 0; +} |