[git commit] less: make read error reporting actually visible
Denys Vlasenko
vda.linux at googlemail.com
Fri Feb 27 10:57:50 UTC 2026
commit: https://git.busybox.net/busybox/commit/?id=1068aa8220bda260f7713f1455d38b86c4fce684
branch: https://git.busybox.net/busybox/log/?h=master
function old new delta
m_status_print 252 275 +23
status_print 111 122 +11
read_lines 783 775 -8
.rodata 107141 107131 -10
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/2 up/down: 34/-18) Total: 16 bytes
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
miscutils/less.c | 29 +++++++++++++++++++----------
1 file changed, 19 insertions(+), 10 deletions(-)
diff --git a/miscutils/less.c b/miscutils/less.c
index 12bb31537..d275fd3b3 100644
--- a/miscutils/less.c
+++ b/miscutils/less.c
@@ -529,7 +529,7 @@ static void read_lines(void)
readpos = 0;
read_size = G.eof_error_ok;
if (G.eof_error_ok <= 0) {
- read_size = 0; // -1 would be seen as UNIT_MAX, prevent
+ read_size = 0; // -1 would be seen as UINT_MAX, prevent
if (G.eof_error_ok < 0 && errno == EAGAIN)
G.eof_error_ok = 1; // "neither EOF nor error"
goto reached_eof;
@@ -637,10 +637,13 @@ static void read_lines(void)
if (ndelay_set == 0) // stdin was not nonblocking, restore that
fcntl(STDIN_FILENO, F_SETFL, fdflags);
- if (G.eof_error_ok < 0) // error?
- print_statusline(bb_msg_read_error);
+ // Will not be seen (overwritten immediately)
+ //if (G.eof_error_ok < 0) { // error?
+ // print_statusline(bb_msg_read_error);
+ // bb_error_msg("G.eof_error_ok:%d", G.eof_error_ok); sleep(5);
+ //} else
#if ENABLE_FEATURE_LESS_FLAGS
- else if (G.eof_error_ok == 0) // EOF?
+ if (G.eof_error_ok == 0) // EOF?
num_lines = max_lineno;
#endif
@@ -715,17 +718,17 @@ static void m_status_print(void)
clear_line();
printf(HIGHLIGHT"%s", filename);
if (num_files > 1)
- printf(" (file %i of %i)", current_file, num_files);
+ printf(" (file %d of %d)", current_file, num_files);
first = safe_lineno(cur_fline);
last = (option_mask32 & FLAG_S)
? MIN(first + max_displayed_line, max_lineno)
: safe_lineno(cur_fline + max_displayed_line);
- printf(" lines %i-%i", first, last);
+ printf(" lines %d-%d", first, last);
update_num_lines();
if (num_lines >= 0)
- printf("/%i", num_lines);
+ printf("/%d", num_lines);
if (at_end()) {
printf(" (END)");
@@ -733,8 +736,11 @@ static void m_status_print(void)
printf(" - next: %s", files[current_file]);
} else if (num_lines > 0) {
percent = (100 * last + num_lines/2) / num_lines;
- printf(" %i%%", percent <= 100 ? percent : 100);
+ printf(" %d%%", percent <= 100 ? percent : 100);
}
+ if (G.eof_error_ok < 0)
+ // Reproducer: strace -oLOG -e fault=read:error=EIO:when=2 less FILE
+ printf(" %s", bb_msg_read_error);
printf(NORMAL);
}
#endif
@@ -764,6 +770,9 @@ static void status_print(void)
p = "(END)";
if (!cur_fline)
p = filename;
+ if (G.eof_error_ok < 0)
+ // Reproducer: strace -oLOG -e fault=read:error=EIO:when=2 less FILE
+ p = bb_msg_read_error;
if (num_files > 1) {
printf(HIGHLIGHT"%s (file %i of %i)"NORMAL,
p, current_file, num_files);
@@ -1137,7 +1146,7 @@ static int64_t getch_nowait(void)
int r;
/* NB: SIGWINCH interrupts poll() */
r = poll(pfd + dont_poll_stdin, 2 - dont_poll_stdin, -1);
- if (/*r < 0 && errno == EINTR &&*/ winch_counter)
+ if (/*r < 0 && errno == EINTR &&*/ winch_counter != 0)
return '\\'; /* anything which has no defined function */
if (r) break;
}
@@ -1927,7 +1936,7 @@ int less_main(int argc, char **argv)
int64_t keypress;
#if ENABLE_FEATURE_LESS_WINCH
- while (WINCH_COUNTER) {
+ while (WINCH_COUNTER != 0) {
again:
winch_counter--;
IF_FEATURE_LESS_ASK_TERMINAL(G.winsize_err =) get_terminal_width_height(kbd_fd, &width, &max_displayed_line);
More information about the busybox-cvs
mailing list