All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ian Jones <ian@contractcoder.biz>
To: util-linux@vger.kernel.org
Subject: POSIX compliance patch preventing exit on EOF without -e flag.
Date: Thu, 24 Jun 2021 13:59:18 +0100	[thread overview]
Message-ID: <20210624125918.GB2541@contractcoder.biz> (raw)

[-- Attachment #1: Type: text/plain, Size: 391 bytes --]

Hi, 

I hope you don't mind my sending you this patch. I ran into a problem
with a piece of software that relies on POSIX compliant implementation
of more, that only exits on EOF with the addition of a -e flag.

Having checked the POSIX documentation for more this would appear to be
correct behavior:
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/more.html

Best regards,

Ian

[-- Attachment #2: 0001-Implemented-e-and-changed-default-behavior-to-be-POS.patch --]
[-- Type: text/x-diff, Size: 3028 bytes --]

From 65ee6afeeb4940d7ea0a83dcb3c2c3d2d78f2503 Mon Sep 17 00:00:00 2001
From: Ian Jones <ian@contractcoder.biz>
Date: Thu, 24 Jun 2021 13:40:52 +0100
Subject: [PATCH] Implemented -e and changed default behavior to be POSIX
 compliant:
 https://pubs.opengroup.org/onlinepubs/9699919799/utilities/more.html

---
 text-utils/more.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/text-utils/more.c b/text-utils/more.c
index 6299e8d82..a5faea286 100644
--- a/text-utils/more.c
+++ b/text-utils/more.c
@@ -207,6 +207,7 @@ struct more_control {
 		eat_newline:1,		/* is newline ignored after 80 cols */
 		erase_input_ok:1,	/* is erase input supported */
 		erase_previous_ok:1,	/* is erase previous supported */
+		exit_on_eof:1,	    /* exit on EOF */
 		first_file:1,		/* is the input file the first in list */
 		fold_long_lines:1,	/* fold long lines */
 		hard_tabs:1,		/* print spaces instead of '\t' */
@@ -243,6 +244,7 @@ static void __attribute__((__noreturn__)) usage(void)
 	printf("%s\n", _(" -l, --no-pause        suppress pause after form feed"));
 	printf("%s\n", _(" -c, --print-over      do not scroll, display text and clean line ends"));
 	printf("%s\n", _(" -p, --clean-print     do not scroll, clean screen and display text"));
+	printf("%s\n", _(" -e, --exit-on-eof     exit on EOF"));
 	printf("%s\n", _(" -s, --squeeze         squeeze multiple blank lines into one"));
 	printf("%s\n", _(" -u, --plain           suppress underlining and bold"));
 	printf("%s\n", _(" -n, --lines <number>  the number of lines per screenful"));
@@ -264,6 +266,7 @@ static void argscan(struct more_control *ctl, int as_argc, char **as_argv)
 		{ "no-pause",    no_argument,       NULL, 'l' },
 		{ "print-over",  no_argument,       NULL, 'c' },
 		{ "clean-print", no_argument,       NULL, 'p' },
+		{ "exit-on-eof", no_argument,       NULL, 'e' },
 		{ "squeeze",     no_argument,       NULL, 's' },
 		{ "plain",       no_argument,       NULL, 'u' },
 		{ "lines",       required_argument, NULL, 'n' },
@@ -324,7 +327,8 @@ static void argscan(struct more_control *ctl, int as_argc, char **as_argv)
 		case 'n':
 			ctl->lines_per_screen = strtou16_or_err(optarg, _("argument error"));
 			break;
-		case 'e':	/* ignored silently to be posix compliant */
+		case 'e':
+            ctl->exit_on_eof = 1;
 			break;
 		case 'V':
 			print_version(EXIT_SUCCESS);
@@ -1809,7 +1813,7 @@ static void screen(struct more_control *ctl, int num_lines)
 
 	for (;;) {
 		while (num_lines > 0 && !ctl->is_paused) {
-			if ((nchars = get_line(ctl, &length)) == EOF) {
+			if ((nchars = get_line(ctl, &length)) == EOF && ctl->exit_on_eof) {
 				if (ctl->clear_line_ends)
 					putp(ctl->clear_rest);
 				return;
@@ -1834,7 +1838,7 @@ static void screen(struct more_control *ctl, int num_lines)
 			num_lines--;
 		}
 		fflush(NULL);
-		if ((c = more_getc(ctl)) == EOF) {
+		if ((c = more_getc(ctl)) == EOF && ctl->exit_on_eof) {
 			if (ctl->clear_line_ends)
 				putp(ctl->clear_rest);
 			return;
-- 
2.20.1


                 reply	other threads:[~2021-06-24 13:07 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210624125918.GB2541@contractcoder.biz \
    --to=ian@contractcoder.biz \
    --cc=util-linux@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.