From 7d463756900ad989455e94ec6e1082e830f582cf Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 6 Mar 2019 20:22:23 +0100 Subject: [PATCH] Userland: Support "cp foo somedirectory" Don't overwrite the literal directory inode contents when copying a file to a directory, duh. :^) --- Userland/cp.cpp | 43 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/Userland/cp.cpp b/Userland/cp.cpp index 86def7de34..b7810fdbcf 100644 --- a/Userland/cp.cpp +++ b/Userland/cp.cpp @@ -3,6 +3,9 @@ #include #include #include +#include +#include +#include int main(int argc, char** argv) { @@ -10,17 +13,14 @@ int main(int argc, char** argv) printf("usage: cp \n"); return 0; } + String src_path = argv[1]; + String dst_path = argv[2]; - int src_fd = open(argv[1], O_RDONLY); + int src_fd = open(src_path.characters(), O_RDONLY); if (src_fd < 0) { perror("open src"); return 1; } - int dst_fd = open(argv[2], O_WRONLY | O_CREAT); - if (dst_fd < 0) { - perror("open dst"); - return 1; - } struct stat src_stat; int rc = fstat(src_fd, &src_stat); @@ -29,6 +29,37 @@ int main(int argc, char** argv) return 1; } + if (S_ISDIR(src_stat.st_mode)) { + fprintf(stderr, "cp: FIXME: Copying directories is not yet supported\n"); + return 1; + } + + int dst_fd = open(dst_path.characters(), O_WRONLY | O_CREAT); + if (dst_fd < 0) { + perror("open dst"); + return 1; + } + + struct stat dst_stat; + rc = fstat(dst_fd, &dst_stat); + if (rc < 0) { + perror("stat dst"); + return 1; + } + + if (S_ISDIR(dst_stat.st_mode)) { + StringBuilder builder; + builder.append(dst_path); + builder.append('/'); + builder.append(FileSystemPath(src_path).basename()); + dst_path = builder.to_string(); + dst_fd = open(dst_path.characters(), O_WRONLY | O_CREAT); + if (dst_fd < 0) { + perror("open dst"); + return 1; + } + } + for (;;) { char buffer[BUFSIZ]; ssize_t nread = read(src_fd, buffer, sizeof(buffer));