From ef5f260da6336d404a7a9b22f95de152e7357629 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 21 Nov 2025 04:17:16 +0100 Subject: [PATCH 1/8] stty/flags: Do not show tandem option It is just an alias for ixoff, and it's marked with `OMIT` in GNU version --- src/uu/stty/src/flags.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/uu/stty/src/flags.rs b/src/uu/stty/src/flags.rs index c346cbe7c5c..77af81da9b3 100644 --- a/src/uu/stty/src/flags.rs +++ b/src/uu/stty/src/flags.rs @@ -92,8 +92,8 @@ pub const INPUT_FLAGS: &[Flag] = &[ Flag::new("igncr", I::IGNCR), Flag::new("icrnl", I::ICRNL).sane(), Flag::new("ixoff", I::IXOFF), - Flag::new("tandem", I::IXOFF), Flag::new("ixon", I::IXON), + Flag::new("tandem", I::IXOFF).hidden(), // not supported by nix // Flag::new("iuclc", I::IUCLC), Flag::new("ixany", I::IXANY), From 3cc4c61f765fccc8749f3fa83b902c7a1845feae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 21 Nov 2025 04:19:22 +0100 Subject: [PATCH 2/8] stty/flags: Use same order of GNU in printing ixoff/ixon Now the order is respected --- src/uu/stty/src/flags.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/uu/stty/src/flags.rs b/src/uu/stty/src/flags.rs index 77af81da9b3..1277492f541 100644 --- a/src/uu/stty/src/flags.rs +++ b/src/uu/stty/src/flags.rs @@ -91,8 +91,8 @@ pub const INPUT_FLAGS: &[Flag] = &[ Flag::new("inlcr", I::INLCR), Flag::new("igncr", I::IGNCR), Flag::new("icrnl", I::ICRNL).sane(), - Flag::new("ixoff", I::IXOFF), Flag::new("ixon", I::IXON), + Flag::new("ixoff", I::IXOFF), Flag::new("tandem", I::IXOFF).hidden(), // not supported by nix // Flag::new("iuclc", I::IUCLC), From d62b3470a5fd001eb6f5fcab6f9ffb291d371b50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 21 Nov 2025 04:20:17 +0100 Subject: [PATCH 3/8] stty/flags: Add missing tabs combination setting --- src/uu/stty/src/flags.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/uu/stty/src/flags.rs b/src/uu/stty/src/flags.rs index 1277492f541..7047c2f9c51 100644 --- a/src/uu/stty/src/flags.rs +++ b/src/uu/stty/src/flags.rs @@ -398,4 +398,5 @@ pub const COMBINATION_SETTINGS: &[(&str, bool)] = &[ ("pass8", true), ("raw", true), ("sane", false), + ("tabs", true), ]; From 8ce5b7b025fa325529431973b7d2eedd3424c578 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 21 Nov 2025 04:22:13 +0100 Subject: [PATCH 4/8] stty/flags: Add delayed suspend (dsusp) support It's only supported by BSD, aix and solaris, but still available in nix --- src/uu/stty/src/flags.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/uu/stty/src/flags.rs b/src/uu/stty/src/flags.rs index 7047c2f9c51..e32a41d89b4 100644 --- a/src/uu/stty/src/flags.rs +++ b/src/uu/stty/src/flags.rs @@ -7,7 +7,7 @@ // spell-checker:ignore ignbrk brkint ignpar parmrk inpck istrip inlcr igncr icrnl ixoff ixon iuclc ixany imaxbel iutf // spell-checker:ignore opost olcuc ocrnl onlcr onocr onlret ofdel nldly crdly tabdly bsdly vtdly ffdly // spell-checker:ignore isig icanon iexten echoe crterase echok echonl noflsh xcase tostop echoprt prterase echoctl ctlecho echoke crtkill flusho extproc -// spell-checker:ignore lnext rprnt susp swtch vdiscard veof veol verase vintr vkill vlnext vquit vreprint vstart vstop vsusp vswtc vwerase werase +// spell-checker:ignore lnext rprnt susp dsusp swtch vdiscard veof veol verase vintr vkill vlnext vquit vreprint vstart vstop vsusp vswtc vwerase werase VDSUSP // spell-checker:ignore sigquit sigtstp // spell-checker:ignore cbreak decctlq evenp litout oddp @@ -370,6 +370,18 @@ pub const CONTROL_CHARS: &[(&str, S)] = &[ ("stop", S::VSTOP), // Sends a suspend signal (SIGTSTP). ("susp", S::VSUSP), + #[cfg(any( + target_os = "freebsd", + target_os = "dragonfly", + target_os = "ios", + target_os = "macos", + target_os = "netbsd", + target_os = "openbsd", + target_os = "aix", + target_os = "solaris" + ))] + // Sends a delayed suspend signal (SIGTSTP). + ("dsusp", S::VDSUSP), // Reprints the current line. ("rprnt", S::VREPRINT), // Deletes the last word typed. From 6aaeab4f3f78b3f20a1469cb21cc11b3748fc3d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 21 Nov 2025 04:23:52 +0100 Subject: [PATCH 5/8] stty/flags: List all missing flags that GNU version supports List the remaining flags that GNU stty support, they cannot be be listed yet since we have no nix support for them, but it's better to keep the lists in sync so that it's easier to enable what will be supported in future --- src/uu/stty/src/flags.rs | 44 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/src/uu/stty/src/flags.rs b/src/uu/stty/src/flags.rs index e32a41d89b4..445607a226a 100644 --- a/src/uu/stty/src/flags.rs +++ b/src/uu/stty/src/flags.rs @@ -10,6 +10,7 @@ // spell-checker:ignore lnext rprnt susp dsusp swtch vdiscard veof veol verase vintr vkill vlnext vquit vreprint vstart vstop vsusp vswtc vwerase werase VDSUSP // spell-checker:ignore sigquit sigtstp // spell-checker:ignore cbreak decctlq evenp litout oddp +// spell-checker:ignore cdtrdsr CDTRDSR ofill OFILL dsusp VDSUSP VFLUSHO VSTATUS noncanonical VMIN deciseconds noncanonical VTIME use crate::Flag; @@ -75,10 +76,14 @@ pub const CONTROL_FLAGS: &[Flag] = &[ Flag::new_grouped("cs7", C::CS7, C::CSIZE), Flag::new_grouped("cs8", C::CS8, C::CSIZE).sane(), Flag::new("hupcl", C::HUPCL), + // Not supported by nix and libc. + // Flag::new("hup", C::HUP).hidden(), Flag::new("cstopb", C::CSTOPB), Flag::new("cread", C::CREAD).sane(), Flag::new("clocal", C::CLOCAL), Flag::new("crtscts", C::CRTSCTS), + // Not supported by nix and libc. + // Flag::new("cdtrdsr", C::CDTRDSR), ]; pub const INPUT_FLAGS: &[Flag] = &[ @@ -122,6 +127,16 @@ pub const OUTPUT_FLAGS: &[Flag] = &[ target_os = "linux", target_os = "macos" ))] + // Not supported by nix. + // See: https://github.com/nix-rust/nix/pull/2701 + // #[cfg(any( + // target_os = "android", + // target_os = "haiku", + // target_os = "ios", + // target_os = "linux", + // target_os = "macos" + // ))] + // Flag::new("ofill", O::OFILL), Flag::new("ofdel", O::OFDEL), #[cfg(any( target_os = "android", @@ -263,7 +278,15 @@ pub const LOCAL_FLAGS: &[Flag] = &[ Flag::new("echok", L::ECHOK).sane(), Flag::new("echonl", L::ECHONL), Flag::new("noflsh", L::NOFLSH), - // Not supported by nix + // Not supported by nix and libc: + // - https://github.com/rust-lang/libc/pull/4847 + // - https://github.com/nix-rust/nix/pull/2703 + // #[cfg(any( + // target_os = "aix", + // target_os = "android", + // target_os = "haiku", + // target_os = "linux", + // ))] // Flag::new("xcase", L::XCASE), Flag::new("tostop", L::TOSTOP), #[cfg(not(target_os = "cygwin"))] @@ -390,6 +413,25 @@ pub const CONTROL_CHARS: &[(&str, S)] = &[ ("lnext", S::VLNEXT), // Discards the current line. ("discard", S::VDISCARD), + // deprecated compat option. + // Not supported by nix and libc. + // ("flush", S::VFLUSHO), + #[cfg(any( + target_os = "freebsd", + target_os = "dragonfly", + target_os = "ios", + target_os = "macos", + target_os = "netbsd", + target_os = "openbsd", + ))] + // Status character + ("status", S::VSTATUS), + // Minimum number of characters for noncanonical read. + // We handle this manually. + // ("min", S::VMIN), + // Timeout in deciseconds for noncanonical read. + // We handle this manually. + // ("time", S::VTIME), ]; /// This constant lists all possible combination settings, using a bool to represent if the setting is negatable From 9331894ad727f5a059cd0c063850e6cb7b52c8eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Sat, 22 Nov 2025 00:55:35 +0100 Subject: [PATCH 6/8] stty/flags: Add references to support to IUCLC This is going to be supported via those PRs, so let's track them to make it easier to support it in future --- src/uu/stty/src/flags.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/uu/stty/src/flags.rs b/src/uu/stty/src/flags.rs index 445607a226a..2f3b308f1b7 100644 --- a/src/uu/stty/src/flags.rs +++ b/src/uu/stty/src/flags.rs @@ -99,7 +99,15 @@ pub const INPUT_FLAGS: &[Flag] = &[ Flag::new("ixon", I::IXON), Flag::new("ixoff", I::IXOFF), Flag::new("tandem", I::IXOFF).hidden(), - // not supported by nix + // not supported by nix and libc: + // - https://github.com/rust-lang/libc/pull/4846 + // - https://github.com/nix-rust/nix/pull/2702 + // #[cfg(any( + // target_os = "aix", + // target_os = "android", + // target_os = "haiku", + // target_os = "linux", + // ))] // Flag::new("iuclc", I::IUCLC), Flag::new("ixany", I::IXANY), Flag::new("imaxbel", I::IMAXBEL).sane(), From 1fdbdc705491227a4086b7524aeaffc5ac8e3782 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Sat, 22 Nov 2025 04:59:48 +0100 Subject: [PATCH 7/8] stty: Use libc definition for OFILL Until nix won't include it we can safely just rely on the libc definition --- src/uu/stty/src/flags.rs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/uu/stty/src/flags.rs b/src/uu/stty/src/flags.rs index 2f3b308f1b7..a26f8866d28 100644 --- a/src/uu/stty/src/flags.rs +++ b/src/uu/stty/src/flags.rs @@ -135,16 +135,17 @@ pub const OUTPUT_FLAGS: &[Flag] = &[ target_os = "linux", target_os = "macos" ))] + #[cfg(any( + target_os = "android", + target_os = "haiku", + target_os = "ios", + target_os = "linux", + target_os = "macos" + ))] // Not supported by nix. // See: https://github.com/nix-rust/nix/pull/2701 - // #[cfg(any( - // target_os = "android", - // target_os = "haiku", - // target_os = "ios", - // target_os = "linux", - // target_os = "macos" - // ))] - // Flag::new("ofill", O::OFILL), + // FIXME: Flag::new("ofill", O::OFILL), + Flag::new("ofill", O::from_bits_retain(nix::libc::OFILL)), Flag::new("ofdel", O::OFDEL), #[cfg(any( target_os = "android", From c9fe2e5830adf52445cc8b768ce5932bdce0ad6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Sat, 22 Nov 2025 05:15:15 +0100 Subject: [PATCH 8/8] stty: Use c_line (as line_discipline) from nix Nix now supports the line discipline parameter in various platforms, so use upstream definition instead of going through libc See: https://github.com/nix-rust/nix/issues/1802 --- src/uu/stty/src/stty.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/uu/stty/src/stty.rs b/src/uu/stty/src/stty.rs index f34f9b498e5..28637c698b1 100644 --- a/src/uu/stty/src/stty.rs +++ b/src/uu/stty/src/stty.rs @@ -658,12 +658,9 @@ fn print_terminal_size( ); } - #[cfg(any(target_os = "linux", target_os = "redox"))] + #[cfg(any(target_os = "linux", target_os = "android", target_os = "haiku"))] { - // For some reason the normal nix Termios struct does not expose the line, - // so we get the underlying libc::termios struct to get that information. - let libc_termios: nix::libc::termios = termios.clone().into(); - let line = libc_termios.c_line; + let line = termios.line_discipline; printer.print(&translate!("stty-output-line", "line" => line)); } printer.flush(); @@ -1042,7 +1039,7 @@ fn apply_special_setting( )] SpecialSetting::Line(n) => { // nix only defines Termios's `line_discipline` field on these platforms - #[cfg(any(target_os = "linux", target_os = "android"))] + #[cfg(any(target_os = "linux", target_os = "android", target_os = "haiku"))] { _termios.line_discipline = *n; }