Vladimir's last_patch_15
diff --git a/util-linux/more.c b/util-linux/more.c
index 9f07633..6cdec72 100644
--- a/util-linux/more.c
+++ b/util-linux/more.c
@@ -9,6 +9,8 @@
  * based on the original more implementation by Bruce, and code from the 
  * Debian boot-floppies team.
  *
+ * Termios corrects by Vladimir Oleynik <vodz@usa.net>
+ *
  * 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
  * the Free Software Foundation; either version 2 of the License, or
@@ -29,29 +31,26 @@
 #include <fcntl.h>
 #include <signal.h>
 #include <stdlib.h>
+#include <unistd.h>
 #include <sys/ioctl.h>
 #include "busybox.h"
 
-/* ED: sparc termios is broken: revert back to old termio handling. */
-#ifdef BB_FEATURE_USE_TERMIOS
-#	if #cpu(sparc)
-#		include <termio.h>
-#		define termios termio
-#		define setTermSettings(fd,argp) ioctl(fd,TCSETAF,argp)
-#		define getTermSettings(fd,argp) ioctl(fd,TCGETA,argp)
-#	else
-#		include <termios.h>
-#		define setTermSettings(fd,argp) tcsetattr(fd,TCSANOW,argp)
-#		define getTermSettings(fd,argp) tcgetattr(fd, argp);
-#	endif
-
 static FILE *cin;
 
+#ifdef BB_FEATURE_USE_TERMIOS
+#include <termios.h>
+#define setTermSettings(fd,argp) tcsetattr(fd,TCSANOW,argp)
+#define getTermSettings(fd,argp) tcgetattr(fd, argp);
+
 static struct termios initial_settings, new_settings;
 
-static void gotsig(int sig)
+static void set_tty_to_initial_mode(void)
 {
 	setTermSettings(fileno(cin), &initial_settings);
+}
+
+static void gotsig(int sig)
+{
 	putchar('\n');
 	exit(EXIT_FAILURE);
 }
@@ -65,7 +64,7 @@
 extern int more_main(int argc, char **argv)
 {
 	int c, lines, input = 0;
-	int please_display_more_prompt;
+	int please_display_more_prompt = -1;
 	struct stat st;
 	FILE *file;
 	int len, page_height;
@@ -77,46 +76,57 @@
 	argc--;
 	argv++;
 
+
+	/* not use inputing from terminal if usage: more > outfile */
+	if(isatty(fileno(stdout))) {
+		cin = fopen("/dev/tty", "r");
+		if (!cin)
+			cin = xfopen("/dev/console", "r");
+		please_display_more_prompt = 0;
+#ifdef BB_FEATURE_USE_TERMIOS
+		getTermSettings(fileno(cin), &initial_settings);
+		new_settings = initial_settings;
+		new_settings.c_lflag &= ~ICANON;
+		new_settings.c_lflag &= ~ECHO;
+#ifndef linux
+                /* Hmm, in linux c_cc[] not parsed if set ~ICANON */
+		new_settings.c_cc[VMIN] = 1;
+		new_settings.c_cc[VTIME] = 0;
+#endif
+		setTermSettings(fileno(cin), &new_settings);
+		atexit(set_tty_to_initial_mode);
+		(void) signal(SIGINT, gotsig);
+		(void) signal(SIGQUIT, gotsig);
+		(void) signal(SIGTERM, gotsig);
+#endif
+	}
+
 	do {
 		if (argc == 0) {
 			file = stdin;
 		} else
-			file = xfopen(*argv, "r");
-
+			file = wfopen(*argv, "r");
+		if(file==0)
+			goto loop;
+			
 		fstat(fileno(file), &st);
 
-#ifdef BB_FEATURE_USE_TERMIOS
-		cin = fopen("/dev/tty", "r");
-		if (!cin)
-			cin = xfopen("/dev/console", "r");
-		getTermSettings(fileno(cin), &initial_settings);
-		new_settings = initial_settings;
-		new_settings.c_cc[VMIN] = 1;
-		new_settings.c_cc[VTIME] = 0;
-		new_settings.c_lflag &= ~ICANON;
-		new_settings.c_lflag &= ~ECHO;
-		setTermSettings(fileno(cin), &new_settings);
+		if(please_display_more_prompt>0)
+			please_display_more_prompt = 0;
 
-#	ifdef BB_FEATURE_AUTOWIDTH
+#if defined BB_FEATURE_AUTOWIDTH && defined BB_FEATURE_USE_TERMIOS
 		ioctl(fileno(stdout), TIOCGWINSZ, &win);
 		if (win.ws_row > 4)
 			terminal_height = win.ws_row - 2;
 		if (win.ws_col > 0)
 			terminal_width = win.ws_col - 1;
-#	endif
-
-		(void) signal(SIGINT, gotsig);
-		(void) signal(SIGQUIT, gotsig);
-		(void) signal(SIGTERM, gotsig);
-
 #endif
 		len=0;
 		lines = 0;
 		page_height = terminal_height;
-		please_display_more_prompt = 0;
 		while ((c = getc(file)) != EOF) {
 
-			if (please_display_more_prompt) {
+			if (please_display_more_prompt>0) {
 				len = printf("--More-- ");
 				if (file != stdin) {
 #if _FILE_OFFSET_BITS == 64
@@ -129,13 +139,6 @@
 						   (double) st.st_size)), (long)st.st_size);
 #endif
 				}
-				len += printf("%s",
-#ifdef BB_FEATURE_USE_TERMIOS
-							   ""
-#else
-							   "\n"
-#endif
-					);
 
 				fflush(stdout);
 
@@ -143,20 +146,16 @@
 				 * We've just displayed the "--More--" prompt, so now we need
 				 * to get input from the user.
 				 */
-#ifdef BB_FEATURE_USE_TERMIOS
 				input = getc(cin);
-#else
-				input = getc(stdin);
+#ifndef BB_FEATURE_USE_TERMIOS
+				printf("\033[A"); /* up cursor */
 #endif
-
-#ifdef BB_FEATURE_USE_TERMIOS
 				/* Erase the "More" message */
 				putc('\r', stdout);
 				while (--len >= 0)
 					putc(' ', stdout);
 				putc('\r', stdout);
 				fflush(stdout);
-#endif
 				len=0;
 				lines = 0;
 				page_height = terminal_height;
@@ -180,6 +179,7 @@
 				/* increment by just one line if we are at
 				 * the end of this line */
 				if (input == '\n')
+					if(please_display_more_prompt==0)
 					please_display_more_prompt = 1;
 				/* Adjust the terminal height for any overlap, so that
 				 * no lines get lost off the top. */
@@ -195,6 +195,7 @@
 					}
 				}
 				if (++lines >= page_height) {
+					if(please_display_more_prompt==0)
 					please_display_more_prompt = 1;
 				}
 				len=0;
@@ -208,12 +209,9 @@
 		}
 		fclose(file);
 		fflush(stdout);
-
+loop:
 		argv++;
 	} while (--argc > 0);
   end:
-#ifdef BB_FEATURE_USE_TERMIOS
-	setTermSettings(fileno(cin), &initial_settings);
-#endif
 	return 0;
 }