NetBSD Problem Report #58151

From www@netbsd.org  Sun Apr 14 14:26:15 2024
Return-Path: <www@netbsd.org>
Received: from mail.netbsd.org (mail.netbsd.org [199.233.217.200])
	(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits))
	(Client CN "mail.NetBSD.org", Issuer "mail.NetBSD.org CA" (not verified))
	by mollari.NetBSD.org (Postfix) with ESMTPS id B19B11A9238
	for <gnats-bugs@gnats.NetBSD.org>; Sun, 14 Apr 2024 14:26:15 +0000 (UTC)
Message-Id: <20240414142613.B097D1A9239@mollari.NetBSD.org>
Date: Sun, 14 Apr 2024 14:26:13 +0000 (UTC)
From: achowe@snert.com
Reply-To: achowe@snert.com
To: gnats-bugs@NetBSD.org
Subject: Should Curses getnstr() family handle erase and kill characters when input is not a tty?
X-Send-Pr-Version: www-1.0

>Number:         58151
>Category:       lib
>Synopsis:       Should Curses getnstr() family handle erase and kill characters when input is not a tty?
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    lib-bug-people
>State:          closed
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Sun Apr 14 14:30:01 +0000 2024
>Closed-Date:    Mon Apr 22 22:19:11 +0000 2024
>Last-Modified:  Mon Apr 22 22:19:11 +0000 2024
>Originator:     Anthony Howe
>Release:        10.0
>Organization:
>Environment:
NetBSD elf.snert.com 10.0 NetBSD 10.0 (GENERIC) #0: Thu Mar 28 08:33:33 UTC 2024  mkrepro@mkrepro.NetBSD.org:/usr/src/sys/arch/amd64/compile/GENERIC amd64

>Description:
When input is from a TTY, the Curses getnstr() family of functions correctly handle erasechar() (killchar() is subject of bug #57860).

If I attempt to pipe input to a Curses program (see below) which contains erasechar() or killchar() or both, then those characters are not processed and appear as part of the input buffer.

I expect Curses to treat standard input from a TTY or pipe the same.  One use case for this is it allows creating application test cases where input is piped.

In the case of redirected input, a Curses application would use the TERM defined keys or fall back on ^H and ^U when undefined.


>How-To-Repeat:
```
#include <stdio.h>
#include <string.h>
#include <curses.h>
#include <unistd.h>

int
main(int argc, char **argv)
{
	int erase, kill;
	char buf[80];
	if (initscr() == NULL) {
		return 1;
	}
	echo();
	cbreak();
	addstr(" 123456789.123456789.123456789.1234567890\n");
	standout();
	addstr("[                                        ]\n");
	mvgetnstr(1, 1, buf, sizeof (buf));
	standend();
	erase = erasechar();
	kill = killchar();
	endwin();
	printf("%ld:\"%s\"\n", strlen(buf), buf);
	printf("erasechar=%d killchar=%d\n", erase, kill);
	return 0;
}

/*
Type in a string like "abcdefghi", ^U, 1234.
Observe how there is a gap between 1 and 2.
Appears kill char ^U not handled properly.
Backspace / erase char (^H) works just fine.

NetBSD 9.3 lib/57860
*/
```

$ gcc getnstr.c -lcurses
$ print "abcd\b\b\b123\n" | ./a.out | tee output
$ od -a output

Note:
1. the erasechar and killchar are both zero (no defaults).
2. the buffer length is 10, instead of 4, and contains the BS characters from the pipe.


>Fix:

>Release-Note:

>Audit-Trail:
From: David Holland <dholland-bugs@netbsd.org>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: lib/58151: Should Curses getnstr() family handle erase and kill
 characters when input is not a tty?
Date: Tue, 16 Apr 2024 02:09:00 +0000

 On Sun, Apr 14, 2024 at 02:30:01PM +0000, achowe@snert.com wrote:
  > 	echo();
  > 	cbreak();

 Calling cbreak() instructs curses to tell the tty to _not_ handle
 special characters (other than those that generate signals, which
 doesn't include erase and kill). So I don't see a bug here. (Same
 for 57680.)

 One could argue that getnstr/mvgetnstr in cbreak mode should handle
 simple line editing, but it does not, and there are problems with
 doing so. (For example: how simple? Tty cooked mode editing is fairly
 straightforward, but also not particularly useful or adequate since
 it's no longer 1983, but anything more complicated gets into religious
 questions like whether you should move to the beginning of the line
 with ^A or esc-^-i or what.)

 One could _also_ make an argument that curses should fake tty cooked
 mode when the caller does _not_ put the terminal in cbreak mode and
 the input is not a tty, but (a) that's not the way things historically
 work, (b) very few curses applications use tty cooked mode and there
 are good reasons for that, (c) there's an easy workaround (open a
 pty), and (d) it's not clear that there's much if any practical
 application for such behavior anyhow.

 -- 
 David A. Holland
 dholland@netbsd.org

From: David Holland <dholland-bugs@netbsd.org>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: lib/58151: Should Curses getnstr() family handle erase and kill
 characters when input is not a tty?
Date: Tue, 16 Apr 2024 02:36:31 +0000

 On Tue, Apr 16, 2024 at 02:10:02AM +0000, David Holland wrote:
  >  One could argue that getnstr/mvgetnstr in cbreak mode should handle
  >  simple line editing, but it does not, and there are problems with
  >  doing so. (For example: how simple? Tty cooked mode editing is fairly
  >  straightforward, but also not particularly useful or adequate since
  >  it's no longer 1983, but anything more complicated gets into religious
  >  questions like whether you should move to the beginning of the line
  >  with ^A or esc-^-i or what.)

 Hmm. I take it back, apparently it does. This behavior is
 undocumented, and that's a bug. It's also lacking support for werase.
 And EOF, and REPRINT. And what about STATUS? Or INTR/QUIT/SUSP?

 The whole thing seems like a can of worms and a mistake, if you ask
 me.

 Anyway, it appears that if curses thinks it's not on a tty, both
 erasechar() and killchar() return 0. What happens if you send 0 down
 the pipe? If that causes an erase, and it looks like it will, that
 seems like undesirable behavior and erasechar() ought to default to ^H
 or ^? when not on a tty. (But, which?)

 -- 
 David A. Holland
 dholland@netbsd.org

From: Anthony Howe <achowe@snert.com>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: lib/58151: Should Curses getnstr() family handle erase and kill
 characters when input is not a tty?
Date: Tue, 16 Apr 2024 05:55:59 -0400

 This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
 --------------tVVElmQ0JCgrKOi2FZhgs0bK
 Content-Type: multipart/mixed; boundary="------------g0TpJCiymvfv7kgvD0wQR0f0";
  protected-headers="v1"
 From: Anthony Howe <achowe@snert.com>
 To: gnats-bugs@netbsd.org
 Message-ID: <471d51c0-0f37-4d8d-92e9-1d7be3d32e8d@snert.com>
 Subject: Re: lib/58151: Should Curses getnstr() family handle erase and kill
  characters when input is not a tty?
 References: <pr-lib-58151@gnats.netbsd.org>
  <20240414142613.B097D1A9239@mollari.NetBSD.org>
  <20240416024001.CEF911A923A@mollari.NetBSD.org>
 In-Reply-To: <20240416024001.CEF911A923A@mollari.NetBSD.org>

 --------------g0TpJCiymvfv7kgvD0wQR0f0
 Content-Type: multipart/mixed; boundary="------------CbPozJ9igsmYZJmFyCqML8SQ"

 --------------CbPozJ9igsmYZJmFyCqML8SQ
 Content-Type: text/plain; charset=UTF-8; format=flowed
 Content-Transfer-Encoding: base64

 T24gMjAyNC0wNC0xNSAyMjo0MCwgRGF2aWQgSG9sbGFuZCB3cm90ZToNCj4gVGhlIGZvbGxv
 d2luZyByZXBseSB3YXMgbWFkZSB0byBQUiBsaWIvNTgxNTE7IGl0IGhhcyBiZWVuIG5vdGVk
 IGJ5IEdOQVRTLg0KPiANCj4gRnJvbTogRGF2aWQgSG9sbGFuZCA8ZGhvbGxhbmQtYnVnc0Bu
 ZXRic2Qub3JnPg0KPiBUbzogZ25hdHMtYnVnc0BuZXRic2Qub3JnDQo+IENjOg0KPiBTdWJq
 ZWN0OiBSZTogbGliLzU4MTUxOiBTaG91bGQgQ3Vyc2VzIGdldG5zdHIoKSBmYW1pbHkgaGFu
 ZGxlIGVyYXNlIGFuZCBraWxsDQo+ICAgY2hhcmFjdGVycyB3aGVuIGlucHV0IGlzIG5vdCBh
 IHR0eT8NCj4gRGF0ZTogVHVlLCAxNiBBcHIgMjAyNCAwMjozNjozMSArMDAwMA0KPiANCj4g
 ICBPbiBUdWUsIEFwciAxNiwgMjAyNCBhdCAwMjoxMDowMkFNICswMDAwLCBEYXZpZCBIb2xs
 YW5kIHdyb3RlOg0KPiAgICA+ICBPbmUgY291bGQgYXJndWUgdGhhdCBnZXRuc3RyL212Z2V0
 bnN0ciBpbiBjYnJlYWsgbW9kZSBzaG91bGQgaGFuZGxlDQo+ICAgID4gIHNpbXBsZSBsaW5l
 IGVkaXRpbmcsIGJ1dCBpdCBkb2VzIG5vdCwgYW5kIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRo
 DQo+ICAgID4gIGRvaW5nIHNvLiAoRm9yIGV4YW1wbGU6IGhvdyBzaW1wbGU/IFR0eSBjb29r
 ZWQgbW9kZSBlZGl0aW5nIGlzIGZhaXJseQ0KPiAgICA+ICBzdHJhaWdodGZvcndhcmQsIGJ1
 dCBhbHNvIG5vdCBwYXJ0aWN1bGFybHkgdXNlZnVsIG9yIGFkZXF1YXRlIHNpbmNlDQo+ICAg
 ID4gIGl0J3Mgbm8gbG9uZ2VyIDE5ODMsIGJ1dCBhbnl0aGluZyBtb3JlIGNvbXBsaWNhdGVk
 IGdldHMgaW50byByZWxpZ2lvdXMNCj4gICAgPiAgcXVlc3Rpb25zIGxpa2Ugd2hldGhlciB5
 b3Ugc2hvdWxkIG1vdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZQ0KPiAgICA+ICB3
 aXRoIF5BIG9yIGVzYy1eLWkgb3Igd2hhdC4pDQo+ICAgDQo+ICAgSG1tLiBJIHRha2UgaXQg
 YmFjaywgYXBwYXJlbnRseSBpdCBkb2VzLiBUaGlzIGJlaGF2aW9yIGlzDQo+ICAgdW5kb2N1
 bWVudGVkLCBhbmQgdGhhdCdzIGEgYnVnLiBJdCdzIGFsc28gbGFja2luZyBzdXBwb3J0IGZv
 ciB3ZXJhc2UuDQo+ICAgQW5kIEVPRiwgYW5kIFJFUFJJTlQuIEFuZCB3aGF0IGFib3V0IFNU
 QVRVUz8gT3IgSU5UUi9RVUlUL1NVU1A/DQoNCkhpc3RvcmljYWxseSBDdXJzZXMgZG9lcyBu
 b3QgaGFuZGxlIHdlcmFzZS4gIFRoZXJlIGlzIG5vIGVxdWl2YWxlbnQgb2YgDQplcmFzZWNo
 YXIoKSBvciBraWxsY2hhcigpIGZvciB3ZXJhc2UuDQoNCklOVFIvUVVJVC9TVVNQIGFyZSBz
 aWduYWxzIChub3QgbGluZSBlZGl0aW5nKSB3aGljaCBhcmUgaGFuZGxlZCBieSBjYnJlYWso
 KSBhbmQgDQpyYXcoKSBmYW1pbHkuDQoNCkN1cnNlcyBoYXMgbmV2ZXIgc3VwcG9ydGVkIGBy
 ZWFkbGluZWAgZm9yIHZpL2VtYWNzIGxpbmUgZWRpdGluZy4gIFRoYXQgd291bGQgYmUgDQph
 biBleHRlbnNpb24gdG8gaGlzdG9yaWNhbCBiZWhhdmlvdXIuDQoNCj4gICBUaGUgd2hvbGUg
 dGhpbmcgc2VlbXMgbGlrZSBhIGNhbiBvZiB3b3JtcyBhbmQgYSBtaXN0YWtlLCBpZiB5b3Ug
 YXNrDQo+ICAgbWUuDQoNCk5vcGUuICBIaXN0b3JpY2FsLg0KDQo+ICAgQW55d2F5LCBpdCBh
 cHBlYXJzIHRoYXQgaWYgY3Vyc2VzIHRoaW5rcyBpdCdzIG5vdCBvbiBhIHR0eSwgYm90aA0K
 PiAgIGVyYXNlY2hhcigpIGFuZCBraWxsY2hhcigpIHJldHVybiAwLiBXaGF0IGhhcHBlbnMg
 aWYgeW91IHNlbmQgMCBkb3duDQo+ICAgdGhlIHBpcGU/IElmIHRoYXQgY2F1c2VzIGFuIGVy
 YXNlLCBhbmQgaXQgbG9va3MgbGlrZSBpdCB3aWxsLCB0aGF0DQo+ICAgc2VlbXMgbGlrZSB1
 bmRlc2lyYWJsZSBiZWhhdmlvciBhbmQgZXJhc2VjaGFyKCkgb3VnaHQgdG8gZGVmYXVsdCB0
 byBeSA0KPiAgIG9yIF4/IHdoZW4gbm90IG9uIGEgdHR5LiAoQnV0LCB3aGljaD8pDQoNCkJ5
 IGRlZmluaXRpb24gQlMgPSBiYWNrc3BhY2UgPSBeSC4gIEFuZCBraWxsIHR5cGljYWxseSBk
 ZWZhdWx0cyB0byBzdHR5IF5VLiAgVGhlIA0KcHJvYmxlbSB3aGVuIHN0ZGluIGlzIG5vdCBh
 IHR0eSwgaXMgdGhhdCB0ZXJtaW9zIGRvZXMgbm90IGFwcGx5IHNvIGFsbCB0aGUgDQpzcGVj
 aWFsIGtleXMgYXJlIHplcm8uDQoNCkluIHRoZW9yeSwgQ3Vyc2VzIGNvdWxkIGBvcGVuKGN0
 ZXJtaWQoTlVMTCksIC4uLilgIGEgc2VwYXJhdGUgdHR5IHRvIGdldCB0aGUgDQp1c2VyJ3Mg
 c3R0eSBzZXR0aW5ncyB0aGVuIGFwcGx5IHRoZW0gdG8gdGhlIHJlZGlyZWN0ZWQgc3RkaW4u
 DQoNCi0tIA0KQW50aG9ueSBDIEhvd2UNCmFjaG93ZUBzbmVydC5jb20gICAgICAgICAgICAg
 ICAgICAgICAgICAgICAgICAgICAgIEJhcnJpY2FkZU1YICYgTWlsdGVycw0KaHR0cDovL25h
 bm96ZW4uc25lcnQuY29tLyAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3NvZnR3
 YXJlLnNuZXJ0LmNvbS8NCg0K
 --------------CbPozJ9igsmYZJmFyCqML8SQ
 Content-Type: application/pgp-keys; name="OpenPGP_0xA550323B6ED894D7.asc"
 Content-Disposition: attachment; filename="OpenPGP_0xA550323B6ED894D7.asc"
 Content-Description: OpenPGP public key
 Content-Transfer-Encoding: quoted-printable

 -----BEGIN PGP PUBLIC KEY BLOCK-----

 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
 iQ=3D=3D
 =3DW6M6
 -----END PGP PUBLIC KEY BLOCK-----

 --------------CbPozJ9igsmYZJmFyCqML8SQ--

 --------------g0TpJCiymvfv7kgvD0wQR0f0--

 --------------tVVElmQ0JCgrKOi2FZhgs0bK
 Content-Type: application/pgp-signature; name="OpenPGP_signature.asc"
 Content-Description: OpenPGP digital signature
 Content-Disposition: attachment; filename="OpenPGP_signature.asc"

 -----BEGIN PGP SIGNATURE-----

 wsB5BAABCAAjFiEE+yYE6CVEuMOhbTT+pVAyO27YlNcFAmYeSzAFAwAAAAAACgkQpVAyO27YlNcd
 5wgAoBkwLisDco3bmgfE9XgFeU/LF7Fh/f7YwIYb4RrH+yD7DgHRPH+V/dGq6WzQrLckM9i4dn5M
 Aati25qbluSA/my46GJoxmNiOrmOegpCY5tnMo9uiCe7q2nZqLzZ01KXbpX7wgW6dMPLiS8qIbpC
 cJbKWSXaTK421uU7IZA/JcATAlyydceNaPqCkNigB/KHZa7V6lMHIzAktKavgH3e2cr5qSI4YAyT
 GAUuhtZs5xPRS3i4HxqBemxZBuCPxMY44ryd3PomwATnMuDjG+mAZK9W+iv3AH0/wPY8HVzRqZEO
 dpejh2rvMl2gPALqMPH3EVEV5Tmt8hVLZtmzxQDBKw==
 =vwyH
 -----END PGP SIGNATURE-----

 --------------tVVElmQ0JCgrKOi2FZhgs0bK--

From: Anthony Howe <achowe@snert.com>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: lib/58151: Should Curses getnstr() family handle erase and kill
 characters when input is not a tty?
Date: Tue, 16 Apr 2024 06:05:08 -0400

 This is a multi-part message in MIME format.
 --------------0YUG8VAdVE0WkSAil0E23vm1
 Content-Type: text/plain; charset=UTF-8; format=flowed
 Content-Transfer-Encoding: 7bit

 On 2024-04-15 22:40, David Holland wrote:
 > The following reply was made to PR lib/58151; it has been noted by GNATS.
 > 
 > From: David Holland <dholland-bugs@netbsd.org>
 > To: gnats-bugs@netbsd.org
 > Cc:
 > Subject: Re: lib/58151: Should Curses getnstr() family handle erase and kill
 >   characters when input is not a tty?
 > Date: Tue, 16 Apr 2024 02:36:31 +0000
 > 
 >   On Tue, Apr 16, 2024 at 02:10:02AM +0000, David Holland wrote:
 >    >  One could argue that getnstr/mvgetnstr in cbreak mode should handle
 >    >  simple line editing, but it does not, and there are problems with
 >    >  doing so. (For example: how simple? Tty cooked mode editing is fairly
 >    >  straightforward, but also not particularly useful or adequate since
 >    >  it's no longer 1983, but anything more complicated gets into religious
 >    >  questions like whether you should move to the beginning of the line
 >    >  with ^A or esc-^-i or what.)
 >   
 >   Hmm. I take it back, apparently it does. This behavior is
 >   undocumented, and that's a bug. It's also lacking support for werase.
 >   And EOF, and REPRINT. And what about STATUS? Or INTR/QUIT/SUSP?

 Historically Curses does not handle werase.  There is no equivalent of 
 erasechar() or killchar() for werase.

 INTR/QUIT/SUSP are signals (not line editing) which are handled by cbreak() and 
 raw() family.

 Curses has never supported `readline` for vi/emacs line editing.  That would be 
 an extension to historical behaviour.

 >   The whole thing seems like a can of worms and a mistake, if you ask
 >   me.

 Nope.  Historical.

 >   Anyway, it appears that if curses thinks it's not on a tty, both
 >   erasechar() and killchar() return 0. What happens if you send 0 down
 >   the pipe? If that causes an erase, and it looks like it will, that
 >   seems like undesirable behavior and erasechar() ought to default to ^H
 >   or ^? when not on a tty. (But, which?)

 By definition BS = backspace = ^H.  And kill typically defaults to stty ^U.  The 
 problem when stdin is not a tty, is that termios does not apply so all the 
 special keys are zero.

 In theory, Curses could `open(ctermid(NULL), ...)` a separate tty to get the 
 user's stty settings then apply them to the redirected stdin.

 -- 
 Anthony C Howe
 achowe@snert.com                                   BarricadeMX & Milters
 http://nanozen.snert.com/                          http://software.snert.com/

 --------------0YUG8VAdVE0WkSAil0E23vm1
 Content-Type: application/pgp-keys; name="OpenPGP_0xA550323B6ED894D7.asc"
 Content-Disposition: attachment; filename="OpenPGP_0xA550323B6ED894D7.asc"
 Content-Description: OpenPGP public key
 Content-Transfer-Encoding: 7bit

 -----BEGIN PGP PUBLIC KEY BLOCK-----

 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
 iQ==
 =W6M6
 -----END PGP PUBLIC KEY BLOCK-----


 --------------0YUG8VAdVE0WkSAil0E23vm1--

From: Anthony Howe <achowe@snert.com>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: lib/58151: Should Curses getnstr() family handle erase and kill
 characters when input is not a tty?
Date: Tue, 16 Apr 2024 07:57:27 -0400

 On 2024-04-15 22:40, David Holland wrote:
 > The following reply was made to PR lib/58151; it has been noted by GNATS.
 > 
 > From: David Holland <dholland-bugs@netbsd.org>
 > To: gnats-bugs@netbsd.org
 > Cc:
 > Subject: Re: lib/58151: Should Curses getnstr() family handle erase and kill
 >   characters when input is not a tty?
 > Date: Tue, 16 Apr 2024 02:36:31 +0000
 > 
 >   On Tue, Apr 16, 2024 at 02:10:02AM +0000, David Holland wrote:
 >    >  One could argue that getnstr/mvgetnstr in cbreak mode should handle
 >    >  simple line editing, but it does not, and there are problems with
 >    >  doing so. (For example: how simple? Tty cooked mode editing is fairly
 >    >  straightforward, but also not particularly useful or adequate since
 >    >  it's no longer 1983, but anything more complicated gets into religious
 >    >  questions like whether you should move to the beginning of the line
 >    >  with ^A or esc-^-i or what.)
 >   
 >   Hmm. I take it back, apparently it does. This behavior is
 >   undocumented, and that's a bug. It's also lacking support for werase.
 >   And EOF, and REPRINT. And what about STATUS? Or INTR/QUIT/SUSP?

 Historically Curses does not handle werase.  There is no equivalent of 
 erasechar() or killchar() for werase.

 INTR/QUIT/SUSP are signals (not line editing) which are handled by cbreak() and 
 raw() family.

 Curses has never supported `readline` for vi/emacs line editing.  That would be 
 an extension to historical behaviour.

 >   The whole thing seems like a can of worms and a mistake, if you ask
 >   me.

 Nope.  Historical.

 >   Anyway, it appears that if curses thinks it's not on a tty, both
 >   erasechar() and killchar() return 0. What happens if you send 0 down
 >   the pipe? If that causes an erase, and it looks like it will, that
 >   seems like undesirable behavior and erasechar() ought to default to ^H
 >   or ^? when not on a tty. (But, which?)

 By definition BS = backspace = ^H.  And kill typically defaults to stty ^U.  The 
 problem when stdin is not a tty, is that termios does not apply so all the 
 special keys are zero.

 In theory, Curses could `open(ctermid(NULL), ...)` a separate tty to get the 
 user's stty settings then apply them to the redirected stdin.

 -- 
 Anthony C Howe
 achowe@snert.com                                   BarricadeMX & Milters
 http://nanozen.snert.com/                          http://software.snert.com/

From: David Holland <dholland-bugs@netbsd.org>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: lib/58151: Should Curses getnstr() family handle erase and kill
 characters when input is not a tty?
Date: Wed, 17 Apr 2024 16:20:36 +0000

 On Tue, Apr 16, 2024 at 12:00:05PM +0000, Anthony Howe wrote:
  >  Historically Curses does not handle werase.  There is no equivalent of 
  >  erasechar() or killchar() for werase.

 Historically certain old and broken systems don't have werase in the
 tty driver either. But if we're going to argue that in this particular
 combination of circumstances curses should pretend to be tty cooked
 mode, it should be the same cooked mode as the tty driver, not the
 cooked mode from SVr2.

 In principle it ought to also support silly archaic modes like ECHOKE
 too, although since the tty driver doesn't support that one either
 it's not exactly critical.

 However, nothing in that code handles echo vs. noecho modes correctly.

  > INTR/QUIT/SUSP are signals (not line editing) which are handled by
  > cbreak() and raw() family.

 Yes, so if we're in cbreak mode and curses is pretending to be a tty
 because its input is a pipe, it ought to post SIGINT if it receives a
 ^C down that pipe.

  > Curses has never supported `readline` for vi/emacs line editing.
  > That would be an extension to historical behaviour.

 Yes, so? Today all serious programs that handle line input use
 readline or libedit (or implement it by hand) and that's the minimum
 expectation. Curses could behave like libedit here, and that would be
 more consistent with user expectations.

 (Except that curses apps that intend to meet user expectations don't
 use this pathway because it doesn't, either currently, historically,
 or portably, meet those expectations.)

  >> The whole thing seems like a can of worms and a mistake, if you ask
  >> me.
  >  
  >  Nope.  Historical.

 ECHOKE is historical too.

  >>   Anyway, it appears that if curses thinks it's not on a tty, both
  >>   erasechar() and killchar() return 0. What happens if you send 0 down
  >>   the pipe? If that causes an erase, and it looks like it will, that
  >>   seems like undesirable behavior and erasechar() ought to default to ^H
  >>   or ^? when not on a tty. (But, which?)
  >  
  > By definition BS = backspace = ^H.

 Historically erase is ^?, not ^H.

  > In theory, Curses could `open(ctermid(NULL), ...)` a separate tty
  > to get the user's stty settings then apply them to the redirected
  > stdin.

 That's just going to cause more problems.

 -- 
 David A. Holland
 dholland@netbsd.org

From: Brett Lymn <blymn@internode.on.net>
To: gnats-bugs@netbsd.org
Cc: lib-bug-people@netbsd.org, gnats-admin@netbsd.org, netbsd-bugs@netbsd.org,
        achowe@snert.com
Subject: Re: lib/58151: Should Curses getnstr() family handle erase and kill
 characters when input is not a tty?
Date: Thu, 18 Apr 2024 07:51:43 +0930

 Before I sort through the below, I will addres the original statement
 about the output and what is expected to happen.

 It looks like there is some expectation that the backspaces in the input
 will somehow be magically processed internally and only the resultant
 string will be printed.  This may or may not happen depending on what
 the optimisation decides needs to do to update the screen to match the
 internal image of the terminal.  There may be all sorts of characters
 emitted to update the "screen" image.

 Also, erase and kill character processing is not done in cbreak mode
 according to the curses standard.

 On Wed, Apr 17, 2024 at 04:25:01PM +0000, David Holland wrote:
 > The following reply was made to PR lib/58151; it has been noted by GNATS.
 > 
 > From: David Holland <dholland-bugs@netbsd.org>
 > To: gnats-bugs@netbsd.org
 > Cc: 
 > Subject: Re: lib/58151: Should Curses getnstr() family handle erase and kill
 >  characters when input is not a tty?
 > Date: Wed, 17 Apr 2024 16:20:36 +0000
 > 
 >  On Tue, Apr 16, 2024 at 12:00:05PM +0000, Anthony Howe wrote:
 >   >  Historically Curses does not handle werase.  There is no equivalent of 
 >   >  erasechar() or killchar() for werase.
 >  
 >  Historically certain old and broken systems don't have werase in the
 >  tty driver either. But if we're going to argue that in this particular
 >  combination of circumstances curses should pretend to be tty cooked
 >  mode, it should be the same cooked mode as the tty driver, not the
 >  cooked mode from SVr2.
 >  

 We follow the Opengroup SUSv2 curses specification.  Well, we try.

 >  Yes, so if we're in cbreak mode and curses is pretending to be a tty
 >  because its input is a pipe, it ought to post SIGINT if it receives a
 >  ^C down that pipe.
 >  

 This is the problem here, a pipe is not a terminal so you should not
 expect termios behaviour.  If you really want to do this properly you
 should communicate with the curses based application over a pty.

 If you want to see an example of how this is done, have a like at the
 libcurses automated test framework which is used to perform automated
 tests on curses functions.

 >  Yes, so? Today all serious programs that handle line input use
 >  readline or libedit (or implement it by hand) and that's the minimum
 >  expectation. Curses could behave like libedit here, and that would be
 >  more consistent with user expectations.
 >  

 No, it should comply to the documented specification.

 >   >>   erasechar() and killchar() return 0. What happens if you send 0 down
 >   >>   the pipe? If that causes an erase, and it looks like it will, that
 >   >>   seems like undesirable behavior and erasechar() ought to default to ^H
 >   >>   or ^? when not on a tty. (But, which?)
 >   >  
 >   > By definition BS = backspace = ^H.
 >  
 >  Historically erase is ^?, not ^H.
 >  

 Or, in reality, whatever the user sets using stty but also for curses
 the terminfo definitions apply too.

 >   > In theory, Curses could `open(ctermid(NULL), ...)` a separate tty
 >   > to get the user's stty settings then apply them to the redirected
 >   > stdin.
 >  
 >  That's just going to cause more problems.
 >  

 And solve nothing as there is no guarantee that the termios settings are
 the same.

 -- 
 Brett Lymn
 --
 Sent from my NetBSD device.

 "We are were wolves",
 "You mean werewolves?",
 "No we were wolves, now we are something else entirely",
 "Oh"

State-Changed-From-To: open->closed
State-Changed-By: blymn@NetBSD.org
State-Changed-When: Mon, 22 Apr 2024 22:19:11 +0000
State-Changed-Why:
Closed, will not fix.
The standard says backspace is not processed in cbreak mode.
Also, the expectation that curses only emits a processed string is
incorrect.  Screen optimisation may inject cursor motion into the
output.


>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.47 2022/09/11 19:34:41 kim Exp $
$NetBSD: gnats_config.sh,v 1.9 2014/08/02 14:16:04 spz Exp $
Copyright © 1994-2024 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.