Skip to content

Commit 2b49289

Browse files
committed
Fix baud rate constants for glibc 2.42 and up.
In glibc 2.42, baud rate constants changed. Their value is now simply the baud rate as integer. Additionally, the `tcset{i,o,}speed` function accepts any arbitrary baud rate, and the `tcget{i,o,}speed` can return any arbitrary baud rate. On MIPS and SPARC, the termios struct from glibc now also has the `c_ispeed` and `c_ospeed` fields.
1 parent 61b722e commit 2b49289

File tree

18 files changed

+707
-558
lines changed

18 files changed

+707
-558
lines changed

build.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ const ALLOWED_CFGS: &[&str] = &[
2424
// Corresponds to `__USE_TIME_BITS64` in UAPI
2525
"linux_time_bits64",
2626
"musl_v1_2_3",
27+
"gnu_simple_baud_rates",
2728
];
2829

2930
// Extra values to allow for check-cfg.
@@ -139,6 +140,11 @@ fn main() {
139140
}
140141
}
141142

143+
#[cfg(target_env = "gnu")]
144+
if have_symbol("GLIBC_2.42") {
145+
set_cfg("gnu_simple_baud_rates");
146+
}
147+
142148
// On CI: deny all warnings
143149
if libc_ci {
144150
set_cfg("libc_deny_warnings");
@@ -288,6 +294,29 @@ fn emcc_version_code() -> Option<u64> {
288294
Some(major * 10000 + minor * 100 + patch)
289295
}
290296

297+
/// Check if a symbol is available in the current process.
298+
///
299+
/// This can be used to detect properties of the system libc at build time.
300+
#[cfg(target_env = "gnu")]
301+
fn have_symbol(symbol: &str) -> bool {
302+
use std::ffi::CString;
303+
use std::os::raw::{c_char, c_void};
304+
extern "C" {
305+
fn dlerror() -> *const c_void;
306+
fn dlsym(handle: *const c_void, symbol: *const c_char) -> *const c_void;
307+
}
308+
let symbol = CString::new(symbol).unwrap();
309+
unsafe {
310+
// Clear any error from previous dlopen/dlsym calls.
311+
dlerror();
312+
// Try to load the symbol.
313+
// The symbol could be present but null, so ignore the return value.
314+
dlsym(std::ptr::null(), symbol.as_ptr());
315+
// Check that there is no new error.
316+
dlerror().is_null()
317+
}
318+
}
319+
291320
fn set_cfg(cfg: &str) {
292321
assert!(
293322
ALLOWED_CFGS.contains(&cfg),

src/unix/linux_like/linux/gnu/b32/arm/mod.rs

Lines changed: 37 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -496,39 +496,43 @@ pub const FFDLY: crate::tcflag_t = 0o100000;
496496
pub const VTDLY: crate::tcflag_t = 0o040000;
497497
pub const XTABS: crate::tcflag_t = 0o014000;
498498

499-
pub const B0: crate::speed_t = 0o000000;
500-
pub const B50: crate::speed_t = 0o000001;
501-
pub const B75: crate::speed_t = 0o000002;
502-
pub const B110: crate::speed_t = 0o000003;
503-
pub const B134: crate::speed_t = 0o000004;
504-
pub const B150: crate::speed_t = 0o000005;
505-
pub const B200: crate::speed_t = 0o000006;
506-
pub const B300: crate::speed_t = 0o000007;
507-
pub const B600: crate::speed_t = 0o000010;
508-
pub const B1200: crate::speed_t = 0o000011;
509-
pub const B1800: crate::speed_t = 0o000012;
510-
pub const B2400: crate::speed_t = 0o000013;
511-
pub const B4800: crate::speed_t = 0o000014;
512-
pub const B9600: crate::speed_t = 0o000015;
513-
pub const B19200: crate::speed_t = 0o000016;
514-
pub const B38400: crate::speed_t = 0o000017;
515-
pub const EXTA: crate::speed_t = B19200;
516-
pub const EXTB: crate::speed_t = B38400;
517-
pub const B57600: crate::speed_t = 0o010001;
518-
pub const B115200: crate::speed_t = 0o010002;
519-
pub const B230400: crate::speed_t = 0o010003;
520-
pub const B460800: crate::speed_t = 0o010004;
521-
pub const B500000: crate::speed_t = 0o010005;
522-
pub const B576000: crate::speed_t = 0o010006;
523-
pub const B921600: crate::speed_t = 0o010007;
524-
pub const B1000000: crate::speed_t = 0o010010;
525-
pub const B1152000: crate::speed_t = 0o010011;
526-
pub const B1500000: crate::speed_t = 0o010012;
527-
pub const B2000000: crate::speed_t = 0o010013;
528-
pub const B2500000: crate::speed_t = 0o010014;
529-
pub const B3000000: crate::speed_t = 0o010015;
530-
pub const B3500000: crate::speed_t = 0o010016;
531-
pub const B4000000: crate::speed_t = 0o010017;
499+
cfg_if! {
500+
if #[cfg(not(gnu_simple_baud_rates))] {
501+
pub const B0: crate::speed_t = 0o000000;
502+
pub const B50: crate::speed_t = 0o000001;
503+
pub const B75: crate::speed_t = 0o000002;
504+
pub const B110: crate::speed_t = 0o000003;
505+
pub const B134: crate::speed_t = 0o000004;
506+
pub const B150: crate::speed_t = 0o000005;
507+
pub const B200: crate::speed_t = 0o000006;
508+
pub const B300: crate::speed_t = 0o000007;
509+
pub const B600: crate::speed_t = 0o000010;
510+
pub const B1200: crate::speed_t = 0o000011;
511+
pub const B1800: crate::speed_t = 0o000012;
512+
pub const B2400: crate::speed_t = 0o000013;
513+
pub const B4800: crate::speed_t = 0o000014;
514+
pub const B9600: crate::speed_t = 0o000015;
515+
pub const B19200: crate::speed_t = 0o000016;
516+
pub const B38400: crate::speed_t = 0o000017;
517+
pub const EXTA: crate::speed_t = B19200;
518+
pub const EXTB: crate::speed_t = B38400;
519+
pub const B57600: crate::speed_t = 0o010001;
520+
pub const B115200: crate::speed_t = 0o010002;
521+
pub const B230400: crate::speed_t = 0o010003;
522+
pub const B460800: crate::speed_t = 0o010004;
523+
pub const B500000: crate::speed_t = 0o010005;
524+
pub const B576000: crate::speed_t = 0o010006;
525+
pub const B921600: crate::speed_t = 0o010007;
526+
pub const B1000000: crate::speed_t = 0o010010;
527+
pub const B1152000: crate::speed_t = 0o010011;
528+
pub const B1500000: crate::speed_t = 0o010012;
529+
pub const B2000000: crate::speed_t = 0o010013;
530+
pub const B2500000: crate::speed_t = 0o010014;
531+
pub const B3000000: crate::speed_t = 0o010015;
532+
pub const B3500000: crate::speed_t = 0o010016;
533+
pub const B4000000: crate::speed_t = 0o010017;
534+
}
535+
}
532536

533537
pub const VEOL: usize = 11;
534538
pub const VEOL2: usize = 16;

src/unix/linux_like/linux/gnu/b32/csky/mod.rs

Lines changed: 37 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -392,39 +392,43 @@ pub const FFDLY: crate::tcflag_t = 0o100000;
392392
pub const VTDLY: crate::tcflag_t = 0o040000;
393393
pub const XTABS: crate::tcflag_t = 0o014000;
394394

395-
pub const B0: crate::speed_t = 0o000000;
396-
pub const B50: crate::speed_t = 0o000001;
397-
pub const B75: crate::speed_t = 0o000002;
398-
pub const B110: crate::speed_t = 0o000003;
399-
pub const B134: crate::speed_t = 0o000004;
400-
pub const B150: crate::speed_t = 0o000005;
401-
pub const B200: crate::speed_t = 0o000006;
402-
pub const B300: crate::speed_t = 0o000007;
403-
pub const B600: crate::speed_t = 0o000010;
404-
pub const B1200: crate::speed_t = 0o000011;
405-
pub const B1800: crate::speed_t = 0o000012;
406-
pub const B2400: crate::speed_t = 0o000013;
407-
pub const B4800: crate::speed_t = 0o000014;
408-
pub const B9600: crate::speed_t = 0o000015;
409-
pub const B19200: crate::speed_t = 0o000016;
410-
pub const B38400: crate::speed_t = 0o000017;
411-
pub const EXTA: crate::speed_t = B19200;
412-
pub const EXTB: crate::speed_t = B38400;
413-
pub const B57600: crate::speed_t = 0o010001;
414-
pub const B115200: crate::speed_t = 0o010002;
415-
pub const B230400: crate::speed_t = 0o010003;
416-
pub const B460800: crate::speed_t = 0o010004;
417-
pub const B500000: crate::speed_t = 0o010005;
418-
pub const B576000: crate::speed_t = 0o010006;
419-
pub const B921600: crate::speed_t = 0o010007;
420-
pub const B1000000: crate::speed_t = 0o010010;
421-
pub const B1152000: crate::speed_t = 0o010011;
422-
pub const B1500000: crate::speed_t = 0o010012;
423-
pub const B2000000: crate::speed_t = 0o010013;
424-
pub const B2500000: crate::speed_t = 0o010014;
425-
pub const B3000000: crate::speed_t = 0o010015;
426-
pub const B3500000: crate::speed_t = 0o010016;
427-
pub const B4000000: crate::speed_t = 0o010017;
395+
cfg_if! {
396+
if #[cfg(not(gnu_simple_baud_rates))] {
397+
pub const B0: crate::speed_t = 0o000000;
398+
pub const B50: crate::speed_t = 0o000001;
399+
pub const B75: crate::speed_t = 0o000002;
400+
pub const B110: crate::speed_t = 0o000003;
401+
pub const B134: crate::speed_t = 0o000004;
402+
pub const B150: crate::speed_t = 0o000005;
403+
pub const B200: crate::speed_t = 0o000006;
404+
pub const B300: crate::speed_t = 0o000007;
405+
pub const B600: crate::speed_t = 0o000010;
406+
pub const B1200: crate::speed_t = 0o000011;
407+
pub const B1800: crate::speed_t = 0o000012;
408+
pub const B2400: crate::speed_t = 0o000013;
409+
pub const B4800: crate::speed_t = 0o000014;
410+
pub const B9600: crate::speed_t = 0o000015;
411+
pub const B19200: crate::speed_t = 0o000016;
412+
pub const B38400: crate::speed_t = 0o000017;
413+
pub const EXTA: crate::speed_t = B19200;
414+
pub const EXTB: crate::speed_t = B38400;
415+
pub const B57600: crate::speed_t = 0o010001;
416+
pub const B115200: crate::speed_t = 0o010002;
417+
pub const B230400: crate::speed_t = 0o010003;
418+
pub const B460800: crate::speed_t = 0o010004;
419+
pub const B500000: crate::speed_t = 0o010005;
420+
pub const B576000: crate::speed_t = 0o010006;
421+
pub const B921600: crate::speed_t = 0o010007;
422+
pub const B1000000: crate::speed_t = 0o010010;
423+
pub const B1152000: crate::speed_t = 0o010011;
424+
pub const B1500000: crate::speed_t = 0o010012;
425+
pub const B2000000: crate::speed_t = 0o010013;
426+
pub const B2500000: crate::speed_t = 0o010014;
427+
pub const B3000000: crate::speed_t = 0o010015;
428+
pub const B3500000: crate::speed_t = 0o010016;
429+
pub const B4000000: crate::speed_t = 0o010017;
430+
}
431+
}
428432

429433
pub const VEOL: usize = 11;
430434
pub const VEOL2: usize = 16;

src/unix/linux_like/linux/gnu/b32/m68k/mod.rs

Lines changed: 37 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -390,39 +390,43 @@ pub const FFDLY: crate::tcflag_t = 0o100000;
390390
pub const VTDLY: crate::tcflag_t = 0o040000;
391391
pub const XTABS: crate::tcflag_t = 0o014000;
392392

393-
pub const B0: crate::speed_t = 0o000000;
394-
pub const B50: crate::speed_t = 0o000001;
395-
pub const B75: crate::speed_t = 0o000002;
396-
pub const B110: crate::speed_t = 0o000003;
397-
pub const B134: crate::speed_t = 0o000004;
398-
pub const B150: crate::speed_t = 0o000005;
399-
pub const B200: crate::speed_t = 0o000006;
400-
pub const B300: crate::speed_t = 0o000007;
401-
pub const B600: crate::speed_t = 0o000010;
402-
pub const B1200: crate::speed_t = 0o000011;
403-
pub const B1800: crate::speed_t = 0o000012;
404-
pub const B2400: crate::speed_t = 0o000013;
405-
pub const B4800: crate::speed_t = 0o000014;
406-
pub const B9600: crate::speed_t = 0o000015;
407-
pub const B19200: crate::speed_t = 0o000016;
408-
pub const B38400: crate::speed_t = 0o000017;
409-
pub const EXTA: crate::speed_t = B19200;
410-
pub const EXTB: crate::speed_t = B38400;
411-
pub const B57600: crate::speed_t = 0o010001;
412-
pub const B115200: crate::speed_t = 0o010002;
413-
pub const B230400: crate::speed_t = 0o010003;
414-
pub const B460800: crate::speed_t = 0o010004;
415-
pub const B500000: crate::speed_t = 0o010005;
416-
pub const B576000: crate::speed_t = 0o010006;
417-
pub const B921600: crate::speed_t = 0o010007;
418-
pub const B1000000: crate::speed_t = 0o010010;
419-
pub const B1152000: crate::speed_t = 0o010011;
420-
pub const B1500000: crate::speed_t = 0o010012;
421-
pub const B2000000: crate::speed_t = 0o010013;
422-
pub const B2500000: crate::speed_t = 0o010014;
423-
pub const B3000000: crate::speed_t = 0o010015;
424-
pub const B3500000: crate::speed_t = 0o010016;
425-
pub const B4000000: crate::speed_t = 0o010017;
393+
cfg_if! {
394+
if #[cfg(not(gnu_simple_baud_rates))] {
395+
pub const B0: crate::speed_t = 0o000000;
396+
pub const B50: crate::speed_t = 0o000001;
397+
pub const B75: crate::speed_t = 0o000002;
398+
pub const B110: crate::speed_t = 0o000003;
399+
pub const B134: crate::speed_t = 0o000004;
400+
pub const B150: crate::speed_t = 0o000005;
401+
pub const B200: crate::speed_t = 0o000006;
402+
pub const B300: crate::speed_t = 0o000007;
403+
pub const B600: crate::speed_t = 0o000010;
404+
pub const B1200: crate::speed_t = 0o000011;
405+
pub const B1800: crate::speed_t = 0o000012;
406+
pub const B2400: crate::speed_t = 0o000013;
407+
pub const B4800: crate::speed_t = 0o000014;
408+
pub const B9600: crate::speed_t = 0o000015;
409+
pub const B19200: crate::speed_t = 0o000016;
410+
pub const B38400: crate::speed_t = 0o000017;
411+
pub const EXTA: crate::speed_t = B19200;
412+
pub const EXTB: crate::speed_t = B38400;
413+
pub const B57600: crate::speed_t = 0o010001;
414+
pub const B115200: crate::speed_t = 0o010002;
415+
pub const B230400: crate::speed_t = 0o010003;
416+
pub const B460800: crate::speed_t = 0o010004;
417+
pub const B500000: crate::speed_t = 0o010005;
418+
pub const B576000: crate::speed_t = 0o010006;
419+
pub const B921600: crate::speed_t = 0o010007;
420+
pub const B1000000: crate::speed_t = 0o010010;
421+
pub const B1152000: crate::speed_t = 0o010011;
422+
pub const B1500000: crate::speed_t = 0o010012;
423+
pub const B2000000: crate::speed_t = 0o010013;
424+
pub const B2500000: crate::speed_t = 0o010014;
425+
pub const B3000000: crate::speed_t = 0o010015;
426+
pub const B3500000: crate::speed_t = 0o010016;
427+
pub const B4000000: crate::speed_t = 0o010017;
428+
}
429+
}
426430

427431
pub const VEOL: usize = 11;
428432
pub const VEOL2: usize = 16;

src/unix/linux_like/linux/gnu/b32/mips/mod.rs

Lines changed: 37 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -887,38 +887,42 @@ pub const FFDLY: crate::tcflag_t = 0o100000;
887887
pub const VTDLY: crate::tcflag_t = 0o040000;
888888
pub const XTABS: crate::tcflag_t = 0o014000;
889889

890-
pub const B0: crate::speed_t = 0o000000;
891-
pub const B50: crate::speed_t = 0o000001;
892-
pub const B75: crate::speed_t = 0o000002;
893-
pub const B110: crate::speed_t = 0o000003;
894-
pub const B134: crate::speed_t = 0o000004;
895-
pub const B150: crate::speed_t = 0o000005;
896-
pub const B200: crate::speed_t = 0o000006;
897-
pub const B300: crate::speed_t = 0o000007;
898-
pub const B600: crate::speed_t = 0o000010;
899-
pub const B1200: crate::speed_t = 0o000011;
900-
pub const B1800: crate::speed_t = 0o000012;
901-
pub const B2400: crate::speed_t = 0o000013;
902-
pub const B4800: crate::speed_t = 0o000014;
903-
pub const B9600: crate::speed_t = 0o000015;
904-
pub const B19200: crate::speed_t = 0o000016;
905-
pub const B38400: crate::speed_t = 0o000017;
906-
pub const EXTA: crate::speed_t = B19200;
907-
pub const EXTB: crate::speed_t = B38400;
908-
pub const B57600: crate::speed_t = 0o010001;
909-
pub const B115200: crate::speed_t = 0o010002;
910-
pub const B230400: crate::speed_t = 0o010003;
911-
pub const B460800: crate::speed_t = 0o010004;
912-
pub const B500000: crate::speed_t = 0o010005;
913-
pub const B576000: crate::speed_t = 0o010006;
914-
pub const B921600: crate::speed_t = 0o010007;
915-
pub const B1000000: crate::speed_t = 0o010010;
916-
pub const B1152000: crate::speed_t = 0o010011;
917-
pub const B1500000: crate::speed_t = 0o010012;
918-
pub const B2000000: crate::speed_t = 0o010013;
919-
pub const B2500000: crate::speed_t = 0o010014;
920-
pub const B3000000: crate::speed_t = 0o010015;
921-
pub const B3500000: crate::speed_t = 0o010016;
922-
pub const B4000000: crate::speed_t = 0o010017;
890+
cfg_if! {
891+
if #[cfg(not(gnu_simple_baud_rates))] {
892+
pub const B0: crate::speed_t = 0o000000;
893+
pub const B50: crate::speed_t = 0o000001;
894+
pub const B75: crate::speed_t = 0o000002;
895+
pub const B110: crate::speed_t = 0o000003;
896+
pub const B134: crate::speed_t = 0o000004;
897+
pub const B150: crate::speed_t = 0o000005;
898+
pub const B200: crate::speed_t = 0o000006;
899+
pub const B300: crate::speed_t = 0o000007;
900+
pub const B600: crate::speed_t = 0o000010;
901+
pub const B1200: crate::speed_t = 0o000011;
902+
pub const B1800: crate::speed_t = 0o000012;
903+
pub const B2400: crate::speed_t = 0o000013;
904+
pub const B4800: crate::speed_t = 0o000014;
905+
pub const B9600: crate::speed_t = 0o000015;
906+
pub const B19200: crate::speed_t = 0o000016;
907+
pub const B38400: crate::speed_t = 0o000017;
908+
pub const EXTA: crate::speed_t = B19200;
909+
pub const EXTB: crate::speed_t = B38400;
910+
pub const B57600: crate::speed_t = 0o010001;
911+
pub const B115200: crate::speed_t = 0o010002;
912+
pub const B230400: crate::speed_t = 0o010003;
913+
pub const B460800: crate::speed_t = 0o010004;
914+
pub const B500000: crate::speed_t = 0o010005;
915+
pub const B576000: crate::speed_t = 0o010006;
916+
pub const B921600: crate::speed_t = 0o010007;
917+
pub const B1000000: crate::speed_t = 0o010010;
918+
pub const B1152000: crate::speed_t = 0o010011;
919+
pub const B1500000: crate::speed_t = 0o010012;
920+
pub const B2000000: crate::speed_t = 0o010013;
921+
pub const B2500000: crate::speed_t = 0o010014;
922+
pub const B3000000: crate::speed_t = 0o010015;
923+
pub const B3500000: crate::speed_t = 0o010016;
924+
pub const B4000000: crate::speed_t = 0o010017;
925+
}
926+
}
923927

924928
pub const EHWPOISON: c_int = 168;

0 commit comments

Comments
 (0)