summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-01-27 07:18:26 +0100
committerAndreas Kling <awesomekling@gmail.com>2019-01-27 07:18:26 +0100
commit15fad649ea51d25e168e0456b5621beb820e254d (patch)
tree5ed0fea95db44d9d28bcf37b653070e93595cce6
parenta34bb07abbe2152c705e95d6dd460e57557422c7 (diff)
downloadserenity-15fad649ea51d25e168e0456b5621beb820e254d.zip
Userland: Make a simple /bin/cp for copying files.
-rwxr-xr-xKernel/sync.sh1
-rw-r--r--Userland/.gitignore1
-rw-r--r--Userland/Makefile5
-rw-r--r--Userland/cp.cpp42
4 files changed, 49 insertions, 0 deletions
diff --git a/Kernel/sync.sh b/Kernel/sync.sh
index 6b83e1549a..0a7524f6a7 100755
--- a/Kernel/sync.sh
+++ b/Kernel/sync.sh
@@ -43,6 +43,7 @@ cp -v ../Userland/touch mnt/bin/touch
cp -v ../Userland/sync mnt/bin/sync
cp -v ../Userland/more mnt/bin/more
cp -v ../Userland/rm mnt/bin/rm
+cp -v ../Userland/cp mnt/bin/cp
cp -v ../Userland/guitest mnt/bin/guitest
cp -v ../Userland/guitest2 mnt/bin/guitest2
cp -v ../Userland/sysctl mnt/bin/sysctl
diff --git a/Userland/.gitignore b/Userland/.gitignore
index 425fa3f830..45e4d0fcc6 100644
--- a/Userland/.gitignore
+++ b/Userland/.gitignore
@@ -25,3 +25,4 @@ guitest
guitest2
sysctl
rm
+cp
diff --git a/Userland/Makefile b/Userland/Makefile
index a774dd3e40..4cca09a50d 100644
--- a/Userland/Makefile
+++ b/Userland/Makefile
@@ -22,6 +22,7 @@ OBJS = \
guitest.o \
guitest2.o \
sysctl.o \
+ cp.o \
rm.o
APPS = \
@@ -49,6 +50,7 @@ APPS = \
guitest \
guitest2 \
sysctl \
+ cp \
rm
ARCH_FLAGS =
@@ -141,6 +143,9 @@ guitest2: guitest2.o
sysctl: sysctl.o
$(LD) -o $@ $(LDFLAGS) $< ../LibC/LibC.a
+cp: cp.o
+ $(LD) -o $@ $(LDFLAGS) $< ../LibC/LibC.a
+
rm: rm.o
$(LD) -o $@ $(LDFLAGS) $< ../LibC/LibC.a
diff --git a/Userland/cp.cpp b/Userland/cp.cpp
new file mode 100644
index 0000000000..db5c08b2d9
--- /dev/null
+++ b/Userland/cp.cpp
@@ -0,0 +1,42 @@
+#include <unistd.h>
+#include <fcntl.h>
+#include <assert.h>
+#include <stdio.h>
+
+int main(int argc, char** argv)
+{
+ if (argc != 3) {
+ printf("usage: cp <source> <destination>\n");
+ return 0;
+ }
+ int src_fd = open(argv[1], 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;
+ }
+
+ for (;;) {
+ char buffer[BUFSIZ];
+ ssize_t nread = read(src_fd, buffer, sizeof(buffer));
+ if (nread < 0) {
+ perror("read src");
+ return 1;
+ }
+ if (nread == 0)
+ break;
+ ssize_t nwritten = write(dst_fd, buffer, nread);
+ if (nwritten < 0) {
+ perror("write dst");
+ return 1;
+ }
+ assert(nwritten != 0);
+ }
+ close(src_fd);
+ close(dst_fd);
+ return 0;
+}