X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=util-linux%2Fmore.c;h=bc3850510205b8d454eeb31e28668e5fde843b8b;hb=d0246fb72b40320a74376af1bb944fef2c9b734f;hp=53437ed58c50deed4e14e44c5a3b4a6066d13c34;hpb=b0e9a709ba1ae1724d413a77f5b67b1a3e6c6cb7;p=oweals%2Fbusybox.git diff --git a/util-linux/more.c b/util-linux/more.c index 53437ed58..bc3850510 100644 --- a/util-linux/more.c +++ b/util-linux/more.c @@ -1,7 +1,11 @@ /* * Mini more implementation for busybox * - * Copyright (C) 1998 by Erik Andersen + * + * Copyright (C) 1999 by Lineo, inc. + * Blended by Erik Andersen , + * based on the original more implementation and code from the Debian + * boot-floppies team. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,22 +31,33 @@ #include "internal.h" #include +#include #include -const char more_usage[] = "[file ...]"; +static const char more_usage[] = "[file ...]"; +/* ED: sparc termios is broken: revert back to old termio handling. */ #ifdef BB_MORE_TERM - #include - #include - #include + + +#if defined (__sparc__) +# define USE_OLD_TERMIO +# include +# include +# define termios termio +# define stty(fd,argp) ioctl(fd,TCSETAF,argp) +#else +# include +# define stty(fd,argp) tcsetattr(fd,TCSANOW,argp) +#endif FILE *cin; struct termios initial_settings, new_settings; void gotsig(int sig) { - tcsetattr(fileno(cin), TCSANOW, &initial_settings); + stty(fileno(cin), &initial_settings); exit( TRUE); } #endif @@ -50,13 +65,9 @@ const char more_usage[] = "[file ...]"; extern int more_main(int argc, char **argv) { int c, lines=0, input=0; - int next_page=0, rows = 24; -#ifdef BB_MORE_TERM - int cols=79; - struct winsize win; -#endif + int next_page=0; struct stat st; - FILE *file = stdin; + FILE *file; if ( strcmp(*argv,"--help")==0 || strcmp(*argv,"-h")==0 ) { usage (more_usage); @@ -64,39 +75,48 @@ extern int more_main(int argc, char **argv) argc--; argv++; - while (argc-- > 0) { + while (argc >= 0) { + if (argc==0) { + file = stdin; + } + else file = fopen(*argv, "r"); + if (file == NULL) { - perror("Can't open file"); + perror(*argv); exit(FALSE); } fstat(fileno(file), &st); - fprintf(stderr, "hi\n"); #ifdef BB_MORE_TERM cin = fopen("/dev/tty", "r"); + if (!cin) + cin = fopen("/dev/console", "r"); +#ifdef USE_OLD_TERMIO + ioctl(fileno(cin),TCGETA,&initial_settings); +#else tcgetattr(fileno(cin),&initial_settings); +#endif new_settings = initial_settings; new_settings.c_lflag &= ~ICANON; new_settings.c_lflag &= ~ECHO; - tcsetattr(fileno(cin), TCSANOW, &new_settings); + stty(fileno(cin), &new_settings); (void) signal(SIGINT, gotsig); - ioctl(STDOUT_FILENO, TIOCGWINSZ, &win); - if (win.ws_row > 4) rows = win.ws_row - 2; - if (win.ws_col > 0) cols = win.ws_col - 1; - - #endif while ((c = getc(file)) != EOF) { if ( next_page ) { int len=0; next_page = 0; lines=0; - len = fprintf(stdout, "--More-- (%d%% of %ld bytes)%s", + len = fprintf(stdout, "--More-- "); + if (file != stdin) { + len += fprintf(stdout, "(%d%% of %ld bytes)", (int) (100*( (double) ftell(file) / (double) st.st_size )), - st.st_size, + st.st_size); + } + len += fprintf(stdout, "%s", #ifdef BB_MORE_TERM "" #else @@ -105,13 +125,13 @@ extern int more_main(int argc, char **argv) ); fflush(stdout); - input = getc( stdin); + input = getc( cin); #ifdef BB_MORE_TERM /* Erase the "More" message */ while(len-- > 0) putc('\b', stdout); - while(len++ < cols) + while(len++ < 79) putc(' ', stdout); while(len-- > 0) putc('\b', stdout); @@ -123,7 +143,7 @@ extern int more_main(int argc, char **argv) goto end; if (input==' ' && c == '\n' ) next_page = 1; - if ( c == '\n' && ++lines == (rows + 1) ) + if ( c == '\n' && ++lines == 24 ) next_page = 1; putc(c, stdout); }