From 9ed2031dd23a77420c5b057b205997dfe1ab73af Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Wed, 7 Mar 2012 21:06:29 +0100 Subject: [PATCH] pager(1) now supports reading from stdin. --- utils/pager.cpp | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/utils/pager.cpp b/utils/pager.cpp index 74318269..ff9e5e63 100644 --- a/utils/pager.cpp +++ b/utils/pager.cpp @@ -8,9 +8,28 @@ #include #include +char* stdinargv[2]; + int main(int argc, char* argv[]) { - if ( argc < 2 ) { printf("usage: %s [FILE] ...\n", argv[0]); return 0; } + if ( isatty(0) && argc < 2 ) + { + printf("usage: %s [FILE] ...\n", argv[0]); + return 0; + } + + if ( !isatty(0) && argc < 2 ) + { + stdinargv[0] = argv[0]; + stdinargv[1] = (char*) "-"; + argv = stdinargv; + argc = 2; + } + + int stdinfd = dup(0); + close(0); + int ttyfd = open("/dev/tty", O_RDONLY); + if ( ttyfd != 0 ) { perror("/dev/tty"); return 1; } const int HEIGHT = 25; const int WIDTH = 80; int linesleft = HEIGHT-1; @@ -18,7 +37,7 @@ int main(int argc, char* argv[]) size_t charleft = WIDTH; for ( int i = 1; i < argc; i++ ) { - int fd = ( strcmp(argv[i], "-") == 0 ) ? 0 : open(argv[i], O_RDONLY); + int fd = ( strcmp(argv[i], "-") == 0 ) ? stdinfd : open(argv[i], O_RDONLY); if ( fd < 0 ) { result = 1; perror(argv[i]); continue; } const size_t BUFFER_SIZE = 4096; char buffer[BUFFER_SIZE]; @@ -68,7 +87,7 @@ int main(int argc, char* argv[]) if ( c == '\t' ) { charleft &= ~(4-1); } } } - if ( fd != 0 ) { close(fd); } + if ( fd != stdinfd ) { close(fd); } } return result; }