Add a hack to make ^T work for Linux binaries, enabled with

'compat.linux.preserve_vstatus=1' sysctl.

MFC after:	2 weeks
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D21967
This commit is contained in:
Edward Tomasz Napierala 2019-12-16 20:15:44 +00:00
parent a94ba188c3
commit 2cf9eb6c4e
5 changed files with 19 additions and 0 deletions

View File

@ -109,6 +109,14 @@ Recent versions of GNU libc are known to use different syscalls depending
on the value of this sysctl.
.It Va compat.linux.oss_version
Linux Open Sound System version.
.It Va compat.linux.preserve_vstatus
When set to 1, it prevents Linux applications from resetting the
.Xr termios 4
VSTATUS setting.
From a user perspective, this makes
.Va SIGINFO
work for Linux executables.
Defaults to 0.
.Sh FILES
.Bl -tag -width /compat/linux/dev/shm -compact
.It Pa /compat/linux

View File

@ -500,6 +500,8 @@ bsd_to_linux_termios(struct termios *bios, struct linux_termios *lios)
lios->c_cc[LINUX_VDISCARD] = bios->c_cc[VDISCARD];
lios->c_cc[LINUX_VWERASE] = bios->c_cc[VWERASE];
lios->c_cc[LINUX_VLNEXT] = bios->c_cc[VLNEXT];
if (linux_preserve_vstatus)
lios->c_cc[LINUX_VSTATUS] = bios->c_cc[VSTATUS];
for (i=0; i<LINUX_NCCS; i++) {
if (i != LINUX_VMIN && i != LINUX_VTIME &&
@ -614,6 +616,8 @@ linux_to_bsd_termios(struct linux_termios *lios, struct termios *bios)
bios->c_cc[VDISCARD] = lios->c_cc[LINUX_VDISCARD];
bios->c_cc[VWERASE] = lios->c_cc[LINUX_VWERASE];
bios->c_cc[VLNEXT] = lios->c_cc[LINUX_VLNEXT];
if (linux_preserve_vstatus)
bios->c_cc[VSTATUS] = lios->c_cc[LINUX_VSTATUS];
for (i=0; i<NCCS; i++) {
if (i != VMIN && i != VTIME &&

View File

@ -435,6 +435,7 @@
#define LINUX_VWERASE 14
#define LINUX_VLNEXT 15
#define LINUX_VEOL2 16
#define LINUX_VSTATUS 18
#define LINUX_NCCS 19
#define LINUX_POSIX_VDISABLE '\0'

View File

@ -62,6 +62,10 @@ static unsigned linux_osd_jail_slot;
SYSCTL_NODE(_compat, OID_AUTO, linux, CTLFLAG_RW, 0, "Linux mode");
int linux_preserve_vstatus = 0;
SYSCTL_INT(_compat_linux, OID_AUTO, preserve_vstatus, CTLFLAG_RWTUN,
&linux_preserve_vstatus, 0, "Preserve VSTATUS termios(4) flag");
static int linux_set_osname(struct thread *td, char *osname);
static int linux_set_osrelease(struct thread *td, char *osrelease);
static int linux_set_oss_version(struct thread *td, int oss_version);

View File

@ -62,4 +62,6 @@ int linux_kernver(struct thread *td);
#define linux_use26(t) (linux_kernver(t) >= LINUX_KERNVER_2006000)
extern int linux_preserve_vstatus;
#endif /* _LINUX_MIB_H_ */