From 5442e365c9e9cbb43a4a86a71e92b52a1b4e8d81 Mon Sep 17 00:00:00 2001 From: balatt <56897347+balatt@users.noreply.github.com> Date: Tue, 29 Oct 2019 11:08:09 -0400 Subject: cat: Updated to handle multiple input files (#694) Now concatenates multiple files at once with a for loop iterating through a vector of file arguments. --- Userland/cat.cpp | 48 ++++++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 18 deletions(-) (limited to 'Userland') diff --git a/Userland/cat.cpp b/Userland/cat.cpp index e03801487d..bfbcc110f1 100644 --- a/Userland/cat.cpp +++ b/Userland/cat.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -8,26 +9,37 @@ int main(int argc, char** argv) { - int fd = argc > 1 ? open(argv[1], O_RDONLY) : 0; - if (fd == -1) { - fprintf(stderr, "Failed to open %s: %s\n", argv[1], strerror(errno)); - return 1; - } - for (;;) { - char buf[4096]; - ssize_t nread = read(fd, buf, sizeof(buf)); - if (nread == 0) - break; - if (nread < 0) { - perror("read"); - return 2; + Vector fds; + if (argc > 1) { + for (int i = 0; i < argc; i++) { + int fd; + if ((fd = open(argv[i], O_RDONLY)) == -1) { + fprintf(stderr, "Failed to open %s: %s\n", argv[i], strerror(errno)); + continue; + } + fds.append(fd); } - ssize_t nwritten = write(1, buf, nread); - if (nwritten < 0) { - perror("write"); - return 3; + } else { + fds.append(0); + } + for (auto& fd : fds) { + for (;;) { + char buf[4096]; + ssize_t nread = read(fd, buf, sizeof(buf)); + if (nread == 0) + break; + if (nread < 0) { + perror("read"); + return 2; + } + ssize_t nwritten = write(1, buf, nread); + if (nwritten < 0) { + perror("write"); + return 3; + } + ASSERT(nwritten == nread); } - ASSERT(nwritten == nread); + close(fd); } return 0; } -- cgit v1.2.3