From 0c88f927f161224f5c5ce2b12a76133a421af081 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 12 Feb 2024 16:21:21 -0700 Subject: [PATCH] std.os.termios: consolidate and correct --- lib/std/c.zig | 78 +++++++++++++++++ lib/std/c/darwin.zig | 13 --- lib/std/c/emscripten.zig | 14 --- lib/std/c/haiku.zig | 14 --- lib/std/c/linux.zig | 2 - lib/std/c/netbsd.zig | 13 --- lib/std/c/openbsd.zig | 13 --- lib/std/c/solaris.zig | 11 --- lib/std/os.zig | 2 + lib/std/os/linux.zig | 178 ++++++++++++--------------------------- 10 files changed, 135 insertions(+), 203 deletions(-) diff --git a/lib/std/c.zig b/lib/std/c.zig index 348d24b14b..9794e3560b 100644 --- a/lib/std/c.zig +++ b/lib/std/c.zig @@ -790,6 +790,84 @@ pub const NCCS = switch (native_os) { else => @compileError("target libc does not have NCCS"), }; +pub const termios = switch (native_os) { + .linux => std.os.linux.termios, + .macos, .ios, .tvos, .watchos => extern struct { + iflag: tcflag_t, + oflag: tcflag_t, + cflag: tcflag_t, + lflag: tcflag_t, + cc: [NCCS]cc_t, + ispeed: speed_t align(8), + ospeed: speed_t, + }, + .freebsd, .kfreebsd, .netbsd, .dragonfly, .openbsd => extern struct { + iflag: tcflag_t, + oflag: tcflag_t, + cflag: tcflag_t, + lflag: tcflag_t, + cc: [NCCS]cc_t, + ispeed: speed_t, + ospeed: speed_t, + }, + .haiku => extern struct { + iflag: tcflag_t, + oflag: tcflag_t, + cflag: tcflag_t, + lflag: tcflag_t, + line: cc_t, + ispeed: speed_t, + ospeed: speed_t, + cc: [NCCS]cc_t, + }, + .solaris, .illumos => extern struct { + iflag: tcflag_t, + oflag: tcflag_t, + cflag: tcflag_t, + lflag: tcflag_t, + cc: [NCCS]cc_t, + }, + .emscripten, .wasi => extern struct { + iflag: tcflag_t, + oflag: tcflag_t, + cflag: tcflag_t, + lflag: tcflag_t, + line: std.c.cc_t, + cc: [NCCS]cc_t, + ispeed: speed_t, + ospeed: speed_t, + }, + else => @compileError("target libc does not have termios"), +}; + +pub const tcflag_t = switch (native_os) { + .linux => std.os.linux.tcflag_t, + .macos, .ios, .tvos, .watchos => u64, + .freebsd, .kfreebsd => c_uint, + .netbsd => c_uint, + .dragonfly => c_uint, + .openbsd => c_uint, + .haiku => u32, + .solaris, .illumos => c_uint, + .emscripten => u32, + .wasi => c_uint, + else => @compileError("target libc does not have tcflag_t"), +}; + +pub const speed_t = switch (native_os) { + .linux => std.os.linux.speed_t, + .macos, .ios, .tvos, .watchos => u64, + .freebsd, .kfreebsd => c_uint, + .netbsd => c_uint, + .dragonfly => c_uint, + .openbsd => c_uint, + .haiku => u8, + .solaris, .illumos => c_uint, + .emscripten => u32, + .wasi => c_uint, + else => @compileError("target libc does not have speed_t"), +}; + pub const whence_t = if (native_os == .wasi) std.os.wasi.whence_t else c_int; // Unix-like systems diff --git a/lib/std/c/darwin.zig b/lib/std/c/darwin.zig index 66ac3e9855..715678de22 100644 --- a/lib/std/c/darwin.zig +++ b/lib/std/c/darwin.zig @@ -2692,9 +2692,6 @@ pub const SHUT = struct { pub const RDWR = 2; }; -pub const speed_t = u64; -pub const tcflag_t = u64; - pub const IGNBRK: tcflag_t = 0x00000001; // ignore BREAK condition pub const BRKINT: tcflag_t = 0x00000002; // map BREAK to SIGINTR pub const IGNPAR: tcflag_t = 0x00000004; // ignore (discard) parity errors @@ -2829,16 +2826,6 @@ pub const TCOON: tcflag_t = 2; pub const TCIOFF: tcflag_t = 3; pub const TCION: tcflag_t = 4; -pub const termios = extern struct { - iflag: tcflag_t, // input flags - oflag: tcflag_t, // output flags - cflag: tcflag_t, // control flags - lflag: tcflag_t, // local flags - cc: [std.c.NCCS]std.c.cc_t, // control chars - ispeed: speed_t align(8), // input speed - ospeed: speed_t, // output speed -}; - pub const winsize = extern struct { ws_row: u16, ws_col: u16, diff --git a/lib/std/c/emscripten.zig b/lib/std/c/emscripten.zig index 8870e973f5..0031132855 100644 --- a/lib/std/c/emscripten.zig +++ b/lib/std/c/emscripten.zig @@ -178,17 +178,3 @@ pub const dirent = struct { type: u8, name: [256]u8, }; - -pub const speed_t = u32; -pub const tcflag_t = u32; - -pub const termios = extern struct { - iflag: tcflag_t, - oflag: tcflag_t, - cflag: tcflag_t, - lflag: tcflag_t, - line: std.c.cc_t, - cc: [std.c.NCCS]std.c.cc_t, - ispeed: speed_t, - ospeed: speed_t, -}; diff --git a/lib/std/c/haiku.zig b/lib/std/c/haiku.zig index f91625a0c3..723d953d2d 100644 --- a/lib/std/c/haiku.zig +++ b/lib/std/c/haiku.zig @@ -950,18 +950,4 @@ pub const directory_which = enum(c_int) { _, }; -pub const speed_t = u8; -pub const tcflag_t = u32; - -pub const termios = extern struct { - c_iflag: tcflag_t, - c_oflag: tcflag_t, - c_cflag: tcflag_t, - c_lflag: tcflag_t, - c_line: std.c.cc_t, - c_ispeed: speed_t, - c_ospeed: speed_t, - cc_t: [std.c.NCCS]std.c.cc_t, -}; - pub const MSG_NOSIGNAL = 0x0800; diff --git a/lib/std/c/linux.zig b/lib/std/c/linux.zig index dd26c9ccc3..45ced99e41 100644 --- a/lib/std/c/linux.zig +++ b/lib/std/c/linux.zig @@ -85,8 +85,6 @@ pub const sigset_t = linux.sigset_t; pub const sockaddr = linux.sockaddr; pub const socklen_t = linux.socklen_t; pub const stack_t = linux.stack_t; -pub const tcflag_t = linux.tcflag_t; -pub const termios = linux.termios; pub const time_t = linux.time_t; pub const timespec = linux.timespec; pub const timeval = linux.timeval; diff --git a/lib/std/c/netbsd.zig b/lib/std/c/netbsd.zig index 9e232b1608..8f668beb63 100644 --- a/lib/std/c/netbsd.zig +++ b/lib/std/c/netbsd.zig @@ -850,19 +850,6 @@ pub const CDTRCTS: tcflag_t = 0x00020000; // DTR/CTS full-duplex flow control pub const MDMBUF: tcflag_t = 0x00100000; // DTR/DCD hardware flow control pub const CHWFLOW: tcflag_t = (MDMBUF | CRTSCTS | CDTRCTS); // all types of hw flow control -pub const tcflag_t = c_uint; -pub const speed_t = c_uint; - -pub const termios = extern struct { - iflag: tcflag_t, // input flags - oflag: tcflag_t, // output flags - cflag: tcflag_t, // control flags - lflag: tcflag_t, // local flags - cc: [std.c.NCCS]std.c.cc_t, // control chars - ispeed: c_int, // input speed - ospeed: c_int, // output speed -}; - // Commands passed to tcsetattr() for setting the termios structure. pub const TCSA = struct { pub const NOW = 0; // make change immediate diff --git a/lib/std/c/openbsd.zig b/lib/std/c/openbsd.zig index 135ad689a7..a8dc6e615d 100644 --- a/lib/std/c/openbsd.zig +++ b/lib/std/c/openbsd.zig @@ -768,9 +768,6 @@ pub const AUTH = struct { pub const ALLOW: c_int = (OKAY | ROOTOKAY | SECURE); }; -pub const tcflag_t = c_uint; -pub const speed_t = c_uint; - // Input flags - software input processing pub const IGNBRK: tcflag_t = 0x00000001; // ignore BREAK condition pub const BRKINT: tcflag_t = 0x00000002; // map BREAK to SIGINT @@ -816,16 +813,6 @@ pub const CCTS_OFLOW: tcflag_t = CRTSCTS; // XXX compat pub const MDMBUF: tcflag_t = 0x00100000; // DTR/DCD hardware flow control pub const CHWFLOW: tcflag_t = (MDMBUF | CRTSCTS); // all types of hw flow control -pub const termios = extern struct { - iflag: tcflag_t, // input flags - oflag: tcflag_t, // output flags - cflag: tcflag_t, // control flags - lflag: tcflag_t, // local flags - cc: [std.c.NCCS]std.c.cc_t, // control chars - ispeed: c_int, // input speed - ospeed: c_int, // output speed -}; - // Commands passed to tcsetattr() for setting the termios structure. pub const TCSA = struct { pub const NOW = 0; // make change immediate diff --git a/lib/std/c/solaris.zig b/lib/std/c/solaris.zig index 7c094d2969..7cb35697d4 100644 --- a/lib/std/c/solaris.zig +++ b/lib/std/c/solaris.zig @@ -698,17 +698,6 @@ pub const SEEK = struct { pub const HOLE = 4; }; -pub const tcflag_t = c_uint; -pub const speed_t = c_uint; - -pub const termios = extern struct { - c_iflag: tcflag_t, - c_oflag: tcflag_t, - c_cflag: tcflag_t, - c_lflag: tcflag_t, - c_cc: [std.c.NCCS]std.c.cc_t, -}; - fn tioc(t: u16, num: u8) u16 { return (t << 8) | num; } diff --git a/lib/std/os.zig b/lib/std/os.zig index e948440994..f686e867ff 100644 --- a/lib/std/os.zig +++ b/lib/std/os.zig @@ -106,6 +106,7 @@ pub const MFD = system.MFD; pub const MMAP2_UNIT = system.MMAP2_UNIT; pub const MSG = system.MSG; pub const NAME_MAX = system.NAME_MAX; +pub const NCCS = system.NCCS; pub const O = system.O; pub const PATH_MAX = system.PATH_MAX; pub const POLL = system.POLL; @@ -172,6 +173,7 @@ pub const siginfo_t = system.siginfo_t; pub const sigset_t = system.sigset_t; pub const sockaddr = system.sockaddr; pub const socklen_t = system.socklen_t; +pub const speed_t = system.speed_t; pub const stack_t = system.stack_t; pub const tcflag_t = system.tcflag_t; pub const termios = system.termios; diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index 1dae5a7cc8..f2c3eaf3fd 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -5005,6 +5005,7 @@ pub const rusage = extern struct { }; pub const speed_t = u32; +pub const tcflag_t = u32; pub const NCCS = switch (native_arch) { .powerpc, .powerpcle, .powerpc64, .powerpc64le => 19, @@ -5044,88 +5045,7 @@ pub const B3000000 = 0o0010015; pub const B3500000 = 0o0010016; pub const B4000000 = 0o0010017; -pub const V = switch (native_arch) { - .powerpc, .powerpc64, .powerpc64le => struct { - pub const INTR = 0; - pub const QUIT = 1; - pub const ERASE = 2; - pub const KILL = 3; - pub const EOF = 4; - pub const MIN = 5; - pub const EOL = 6; - pub const TIME = 7; - pub const EOL2 = 8; - pub const SWTC = 9; - pub const WERASE = 10; - pub const REPRINT = 11; - pub const SUSP = 12; - pub const START = 13; - pub const STOP = 14; - pub const LNEXT = 15; - pub const DISCARD = 16; - }, - .sparc, .sparc64 => struct { - pub const INTR = 0; - pub const QUIT = 1; - pub const ERASE = 2; - pub const KILL = 3; - pub const EOF = 4; - pub const EOL = 5; - pub const EOL2 = 6; - pub const SWTC = 7; - pub const START = 8; - pub const STOP = 9; - pub const SUSP = 10; - pub const DSUSP = 11; - pub const REPRINT = 12; - pub const DISCARD = 13; - pub const WERASE = 14; - pub const LNEXT = 15; - pub const MIN = EOF; - pub const TIME = EOL; - }, - .mips, .mipsel, .mips64, .mips64el => struct { - pub const INTR = 0; - pub const QUIT = 1; - pub const ERASE = 2; - pub const KILL = 3; - pub const MIN = 4; - pub const TIME = 5; - pub const EOL2 = 6; - pub const SWTC = 7; - pub const SWTCH = 7; - pub const START = 8; - pub const STOP = 9; - pub const SUSP = 10; - pub const REPRINT = 12; - pub const DISCARD = 13; - pub const WERASE = 14; - pub const LNEXT = 15; - pub const EOF = 16; - pub const EOL = 17; - }, - else => struct { - pub const INTR = 0; - pub const QUIT = 1; - pub const ERASE = 2; - pub const KILL = 3; - pub const EOF = 4; - pub const TIME = 5; - pub const MIN = 6; - pub const SWTC = 7; - pub const START = 8; - pub const STOP = 9; - pub const SUSP = 10; - pub const EOL = 11; - pub const REPRINT = 12; - pub const DISCARD = 13; - pub const WERASE = 14; - pub const LNEXT = 15; - pub const EOL2 = 16; - }, -}; - -pub const tc_iflag_t = packed struct (u32) { +pub const tc_iflag_t = packed struct(u32) { IGNBRK: bool = false, BRKINT: bool = false, IGNPAR: bool = false, @@ -5145,42 +5065,42 @@ pub const tc_iflag_t = packed struct (u32) { }; pub const cc_t = switch (native_arch) { - .mips, .mipsel, .mips64, .mips64el => enum(u8){ - VINTR = 0, - VQUIT = 1, - VERASE = 2, - VKILL = 3, - VMIN = 4, - VTIME = 5, - VEOL2 = 6, - VSWTC = 7, - VSTART = 8, - VSTOP = 9, - VSUSP = 10, + .mips, .mipsel, .mips64, .mips64el => enum(u8) { + VINTR = 0, + VQUIT = 1, + VERASE = 2, + VKILL = 3, + VMIN = 4, + VTIME = 5, + VEOL2 = 6, + VSWTC = 7, + VSTART = 8, + VSTOP = 9, + VSUSP = 10, VREPRINT = 12, VDISCARD = 13, - VWERASE = 14, - VLNEXT = 15, - VEOF = 16, - VEOL = 17, + VWERASE = 14, + VLNEXT = 15, + VEOF = 16, + VEOL = 17, }, - .powerpc, .powerpc64, .powerpc64le => enum(u8) { - VINTR = 0, - VQUIT = 1, - VERASE = 2, - VKILL = 3, - VEOF = 4, - VMIN = 5, - VEOL = 6, - VTIME = 7, - VEOL2 = 8, - VSWTC = 9, - VWERASE = 10, + .powerpc, .powerpcle, .powerpc64, .powerpc64le => enum(u8) { + VINTR = 0, + VQUIT = 1, + VERASE = 2, + VKILL = 3, + VEOF = 4, + VMIN = 5, + VEOL = 6, + VTIME = 7, + VEOL2 = 8, + VSWTC = 9, + VWERASE = 10, VREPRINT = 11, - VSUSP = 12, - VSTART = 13, - VSTOP = 14, - VLNEXT = 15, + VSUSP = 12, + VSTART = 13, + VSTOP = 14, + VLNEXT = 15, VDISCARD = 16, }, else => enum(u8) { @@ -5246,15 +5166,27 @@ pub const TCSA = enum(c_uint) { _, }; -pub const termios = extern struct { - iflag: tc_iflag_t, - oflag: tc_oflag_t, - cflag: tc_cflag_t, - lflag: tc_lflag_t, - line: cc_t, - cc: [NCCS]cc_t, - ispeed: speed_t, - ospeed: speed_t, +pub const termios = switch (native_arch) { + .powerpc, .powerpcle, .powerpc64, .powerpc64le => extern struct { + iflag: tcflag_t, + oflag: tcflag_t, + cflag: tcflag_t, + lflag: tcflag_t, + cc: [NCCS]cc_t, + line: cc_t, + ispeed: speed_t, + ospeed: speed_t, + }, + else => extern struct { + iflag: tcflag_t, + oflag: tcflag_t, + cflag: tcflag_t, + lflag: tcflag_t, + line: cc_t, + cc: [NCCS]cc_t, + ispeed: speed_t, + ospeed: speed_t, + }, }; pub const SIOCGIFINDEX = 0x8933;