diff options
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/cat.cpp | 48 |
1 files changed, 30 insertions, 18 deletions
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 <AK/Vector.h> #include <assert.h> #include <errno.h> #include <fcntl.h> @@ -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<int> 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; } |