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:
(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.