From a11658737a292d0dbbbb13feb9c83f99c5773546 Mon Sep 17 00:00:00 2001 From: Peter Elliott Date: Tue, 6 Jul 2021 14:14:54 -0600 Subject: [PATCH] Userland: Less: emulate cat when stdout is not a tty This is the most logical behavior when less is used in a pipe. --- Userland/Utilities/less.cpp | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/Userland/Utilities/less.cpp b/Userland/Utilities/less.cpp index 3662ba59a2..f89be6c5f4 100644 --- a/Userland/Utilities/less.cpp +++ b/Userland/Utilities/less.cpp @@ -286,10 +286,26 @@ static String get_key_sequence() return String(buff, n); } +static void cat_file(FILE* file) +{ + ByteBuffer buffer = ByteBuffer::create_uninitialized(4096); + while (!feof(file)) { + size_t n = fread(buffer.data(), 1, buffer.size(), file); + if (n == 0 && ferror(file)) { + perror("fread"); + exit(1); + } + + n = fwrite(buffer.data(), 1, n, stdout); + if (n == 0 && ferror(stdout)) { + perror("fwrite"); + exit(1); + } + } +} + int main(int argc, char** argv) { - VERIFY(isatty(STDOUT_FILENO)); - char const* filename = "-"; char const* prompt = "?f%f :.(line %l)?e (END):."; bool dont_switch_buffer = false; @@ -321,6 +337,11 @@ int main(int argc, char** argv) prompt = "--More--"; } + if (!isatty(STDOUT_FILENO)) { + cat_file(file); + return 0; + } + setup_tty(!dont_switch_buffer); Pager pager(file, stdout, g_wsize.ws_col, g_wsize.ws_row);