summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Tomasz Napierala <trasz@FreeBSD.org>2019-12-16 20:15:44 +0000
committerEdward Tomasz Napierala <trasz@FreeBSD.org>2019-12-16 20:15:44 +0000
commit2cf9eb6c4ead758c0083a30460e3244fab92f268 (patch)
treed6e18b679ee2e1309f33a01216099053f3a2c62a
parenta94ba188c3443d90bad4a1d29bb477a7760c7267 (diff)
Notes
-rw-r--r--share/man/man4/linux.48
-rw-r--r--sys/compat/linux/linux_ioctl.c4
-rw-r--r--sys/compat/linux/linux_ioctl.h1
-rw-r--r--sys/compat/linux/linux_mib.c4
-rw-r--r--sys/compat/linux/linux_mib.h2
5 files changed, 19 insertions, 0 deletions
diff --git a/share/man/man4/linux.4 b/share/man/man4/linux.4
index 04e7a82585f7..997dc16d7692 100644
--- a/share/man/man4/linux.4
+++ b/share/man/man4/linux.4
@@ -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
diff --git a/sys/compat/linux/linux_ioctl.c b/sys/compat/linux/linux_ioctl.c
index d33ddd2bab88..75714cd3d3f2 100644
--- a/sys/compat/linux/linux_ioctl.c
+++ b/sys/compat/linux/linux_ioctl.c
@@ -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 &&
diff --git a/sys/compat/linux/linux_ioctl.h b/sys/compat/linux/linux_ioctl.h
index e529f6494969..d860a708f498 100644
--- a/sys/compat/linux/linux_ioctl.h
+++ b/sys/compat/linux/linux_ioctl.h
@@ -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'
diff --git a/sys/compat/linux/linux_mib.c b/sys/compat/linux/linux_mib.c
index d74313056b32..a7e2273f12ff 100644
--- a/sys/compat/linux/linux_mib.c
+++ b/sys/compat/linux/linux_mib.c
@@ -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);
diff --git a/sys/compat/linux/linux_mib.h b/sys/compat/linux/linux_mib.h
index d5ced52e3398..aea4b1a71c50 100644
--- a/sys/compat/linux/linux_mib.h
+++ b/sys/compat/linux/linux_mib.h
@@ -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_ */