From a2812910db3b3bd862736e874647b9cc9bc500b8 Mon Sep 17 00:00:00 2001 From: Charlie Gordon Date: Mon, 11 May 2026 12:59:48 +0200 Subject: [PATCH] Libc: update ctermios interface file * add more function calls * add FreeBSD and OpenBSD --- libs/libc/ctermios.c2i | 391 ++++++++++++++++++++++++++++++++++------- 1 file changed, 331 insertions(+), 60 deletions(-) diff --git a/libs/libc/ctermios.c2i b/libs/libc/ctermios.c2i index 2000cee95..0892469fa 100644 --- a/libs/libc/ctermios.c2i +++ b/libs/libc/ctermios.c2i @@ -1,21 +1,22 @@ module ctermios extern "C"; #if SYSTEM_LINUX -typedef unsigned Flag; -typedef unsigned Speed; -typedef unsigned char CC; +typedef unsigned char cc_t; +typedef unsigned int speed_t; +typedef unsigned int tcflag_t; +typedef int pid_t; const u32 NCCS = 32; struct Termios @(cname="termios") { - Flag c_iflag; /* input mode flags */ - Flag c_oflag; /* output mode flags */ - Flag c_cflag; /* control mode flags */ - Flag c_lflag; /* local mode flags */ - CC c_line; /* line discipline */ - CC[NCCS] c_cc; /* control characters */ - Speed c_ispeed; /* input speed */ - Speed c_ospeed; /* output speed */ + tcflag_t c_iflag; /* input mode flags */ + tcflag_t c_oflag; /* output mode flags */ + tcflag_t c_cflag; /* control mode flags */ + tcflag_t c_lflag; /* local mode flags */ + cc_t c_line; /* line discipline */ + cc_t[NCCS] c_cc; /* control characters */ + speed_t c_ispeed; /* input speed */ + speed_t c_ospeed; /* output speed */ } /* c_cc characters */ @@ -89,22 +90,22 @@ const unsigned FF1 = 0100000; /* c_cflag bit meaning */ const unsigned CBAUD = 0010017; -const unsigned B0 = 0000000; /* hang up */ -const unsigned B50 = 0000001; -const unsigned B75 = 0000002; -const unsigned B110 = 0000003; -const unsigned B134 = 0000004; -const unsigned B150 = 0000005; -const unsigned B200 = 0000006; -const unsigned B300 = 0000007; -const unsigned B600 = 0000010; -const unsigned B1200 = 0000011; -const unsigned B1800 = 0000012; -const unsigned B2400 = 0000013; -const unsigned B4800 = 0000014; -const unsigned B9600 = 0000015; -const unsigned B19200 = 0000016; -const unsigned B38400 = 0000017; +const unsigned B0 = 0; /* hang up */ +const unsigned B50 = 1; +const unsigned B75 = 2; +const unsigned B110 = 3; +const unsigned B134 = 4; +const unsigned B150 = 5; +const unsigned B200 = 6; +const unsigned B300 = 7; +const unsigned B600 = 8; +const unsigned B1200 = 9; +const unsigned B1800 = 10; +const unsigned B2400 = 11; +const unsigned B4800 = 12; +const unsigned B9600 = 13; +const unsigned B19200 = 14; +const unsigned B38400 = 15; const unsigned EXTA = B19200; const unsigned EXTB = B38400; const unsigned CSIZE = 0000060; @@ -159,20 +160,23 @@ const unsigned EXTPROC = 0200000; #endif #if SYSTEM_DARWIN -typedef unsigned long Flag; -typedef unsigned long Speed; -typedef unsigned char CC; +typedef unsigned long tcflag_t; +typedef unsigned char cc_t; +typedef unsigned long speed_t; +typedef int pid_t; + const u32 NCCS = 20; struct Termios @(cname="termios") { - Flag c_iflag; /* input mode flags */ - Flag c_oflag; /* output mode flags */ - Flag c_cflag; /* control mode flags */ - Flag c_lflag; /* local mode flags */ - CC[NCCS] c_cc; /* control characters */ - Speed c_ispeed; /* input speed */ - Speed c_ospeed; /* output speed */ + tcflag_t c_iflag; /* input mode flags */ + tcflag_t c_oflag; /* output mode flags */ + tcflag_t c_cflag; /* control mode flags */ + tcflag_t c_lflag; /* local mode flags */ + cc_t[NCCS] c_cc; /* control characters */ + speed_t c_ispeed; /* input speed */ + speed_t c_ospeed; /* output speed */ } + /* c_cc characters */ const unsigned VEOF = 0; const unsigned VEOL = 1; @@ -183,6 +187,7 @@ const unsigned VKILL = 5; const unsigned VREPRINT = 6; const unsigned VINTR = 8; const unsigned VQUIT = 9; +const unsigned VSUSP = 10; const unsigned VSTART = 12; const unsigned VSTOP = 13; const unsigned VLNEXT = 14; @@ -201,8 +206,8 @@ const unsigned INLCR = 0000100; const unsigned IGNCR = 0000200; const unsigned ICRNL = 0000400; const unsigned IXON = 0001000; -const unsigned IXOFF = 0002000; const unsigned IXANY = 0004000; +const unsigned IXOFF = 0002000; const unsigned IMAXBEL = 0020000; const unsigned IUTF8 = 0040000; @@ -214,7 +219,7 @@ const unsigned ONOCR = 0000040; const unsigned ONLRET = 0000100; const unsigned OFILL = 0000200; const unsigned OFDEL = 0400000; -const unsigned NLDLY = 00001400; +const unsigned NLDLY = 0001400; const unsigned NL0 = 0000000; const unsigned NL1 = 0000400; const unsigned CRDLY = 0030000; @@ -238,22 +243,147 @@ const unsigned FF0 = 0000000; const unsigned FF1 = 0040000; /* c_cflag bit meaning */ -const unsigned B0 = 0000000; /* hang up */ -const unsigned B50 = 0000062; -const unsigned B75 = 0000113; -const unsigned B110 = 0000156; -const unsigned B134 = 0000206; -const unsigned B150 = 0000226; -const unsigned B200 = 0000310; -const unsigned B300 = 0000454; -const unsigned B600 = 0001130; -const unsigned B1200 = 0002260; -const unsigned B1800 = 0003410; -const unsigned B2400 = 0004540; -const unsigned B4800 = 0011300; -const unsigned B9600 = 0022600; -const unsigned B19200 = 0045400; -const unsigned B38400 = 0113000; +const unsigned B0 = 0; /* hang up */ +const unsigned B50 = 50; +const unsigned B75 = 75; +const unsigned B110 = 110; +const unsigned B134 = 134; +const unsigned B150 = 150; +const unsigned B200 = 200; +const unsigned B300 = 300; +const unsigned B600 = 600; +const unsigned B1200 = 1200; +const unsigned B1800 = 1800; +const unsigned B2400 = 2400; +const unsigned B4800 = 4800; +const unsigned B9600 = 9600; +const unsigned B19200 = 19200; +const unsigned B38400 = 38400; +const unsigned EXTA = B19200; +const unsigned EXTB = B38400; +const unsigned CSIZE = 0001400; +const unsigned CS5 = 0000000; +const unsigned CS6 = 0000400; +const unsigned CS7 = 0001000; +const unsigned CS8 = 0001400; +const unsigned CSTOPB = 0002000; +const unsigned CREAD = 0004000; +const unsigned PARENB = 0010000; +const unsigned PARODD = 0020000; +const unsigned HUPCL = 0040000; +const unsigned CLOCAL = 0100000; +const unsigned B57600 = 57600; +const unsigned B115200 = 115200; +const unsigned B230400 = 230400; +const unsigned CRTSCTS = 0600000; /* flow control */ + +/* c_lflag bits */ +const unsigned ISIG = 0000200; +const unsigned ICANON = 0000400; +const unsigned ECHO = 0000010; +const unsigned ECHOE = 0000002; +const unsigned ECHOK = 0000004; +const unsigned ECHONL = 0000020; +const unsigned NOFLSH = 020000000000; +const unsigned TOSTOP = 020000000; +const unsigned ECHOCTL = 0000100; +const unsigned ECHOPRT = 0000040; +const unsigned ECHOKE = 0000001; +const unsigned FLUSHO = 040000000; +const unsigned PENDIN = 04000000000; +const unsigned IEXTEN = 0002000; +const unsigned EXTPROC = 0004000; +#endif + +#if SYSTEM_FREEBSD + +typedef unsigned int tcflag_t; +typedef unsigned char cc_t; +typedef unsigned int speed_t; + +const u32 NCCS = 20; + +struct Termios @(cname="termios") { + tcflag_t c_iflag; /* input flags */ + tcflag_t c_oflag; /* output flags */ + tcflag_t c_cflag; /* control flags */ + tcflag_t c_lflag; /* local flags */ + cc_t[NCCS] c_cc; /* control chars */ + speed_t c_ispeed; /* input speed */ + speed_t c_ospeed; /* output speed */ +}; + +/* + * Window/terminal size structure. This information is stored by the kernel + * in order to provide a consistent interface, but is not used by the kernel. + */ +struct Winsize @(cname="winsize") { + unsigned short ws_row; /* rows, in characters */ + unsigned short ws_col; /* columns, in characters */ + unsigned short ws_xpixel; /* horizontal size, pixels */ + unsigned short ws_ypixel; /* vertical size, pixels */ +}; + +/* c_cc characters */ +const unsigned VEOF = 0; +const unsigned VEOL = 1; +const unsigned VEOL2 = 2; +const unsigned VERASE = 3; +const unsigned VWERASE = 4; +const unsigned VKILL = 5; +const unsigned VREPRINT = 6; +const unsigned VINTR = 8; +const unsigned VQUIT = 9; +const unsigned VSUSP = 10; +const unsigned VSTART = 12; +const unsigned VSTOP = 13; +const unsigned VLNEXT = 14; +const unsigned VDISCARD = 15; +const unsigned VMIN = 16; +const unsigned VTIME = 17; + +/* c_iflag bits */ +const unsigned IGNBRK = 0000001; +const unsigned BRKINT = 0000002; +const unsigned IGNPAR = 0000004; +const unsigned PARMRK = 0000010; +const unsigned INPCK = 0000020; +const unsigned ISTRIP = 0000040; +const unsigned INLCR = 0000100; +const unsigned IGNCR = 0000200; +const unsigned ICRNL = 0000400; +const unsigned IXON = 0001000; +const unsigned IXANY = 0004000; +const unsigned IXOFF = 0002000; +const unsigned IMAXBEL = 0020000; + +/* c_oflag bits */ +const unsigned OPOST = 0000001; +const unsigned ONLCR = 0000002; +const unsigned OCRNL = 0000020; +const unsigned ONOCR = 0000040; +const unsigned ONLRET = 0000100; +const unsigned TABDLY = 0000004; +const unsigned TAB0 = 0000000; +const unsigned TAB3 = 0000004; + +/* c_cflag bit meaning */ +const unsigned B0 = 0; /* hang up */ +const unsigned B50 = 50; +const unsigned B75 = 75; +const unsigned B110 = 110; +const unsigned B134 = 134; +const unsigned B150 = 150; +const unsigned B200 = 200; +const unsigned B300 = 300; +const unsigned B600 = 600; +const unsigned B1200 = 1200; +const unsigned B1800 = 1800; +const unsigned B2400 = 2400; +const unsigned B4800 = 4800; +const unsigned B9600 = 9600; +const unsigned B19200 = 19200; +const unsigned B38400 = 38400; const unsigned EXTA = B19200; const unsigned EXTB = B38400; const unsigned CSIZE = 0001400; @@ -267,9 +397,19 @@ const unsigned PARENB = 0010000; const unsigned PARODD = 0020000; const unsigned HUPCL = 0040000; const unsigned CLOCAL = 0100000; -const unsigned B57600 = 0160400; -const unsigned B115200 = 0341000; -const unsigned B230400 = 0702000; +const unsigned B57600 = 57600; +const unsigned B115200 = 115200; +const unsigned B230400 = 230400; +const unsigned B460800 = 460800; +const unsigned B500000 = 500000; +const unsigned B921600 = 921600; +const unsigned B1000000 = 1000000; +const unsigned B1500000 = 1500000; +const unsigned B2000000 = 2000000; +const unsigned B2500000 = 2500000; +const unsigned B3000000 = 3000000; +const unsigned B3500000 = 3500000; +const unsigned B4000000 = 4000000; const unsigned CRTSCTS = 0600000; /* flow control */ /* c_lflag bits */ @@ -288,8 +428,139 @@ const unsigned FLUSHO = 040000000; const unsigned PENDIN = 04000000000; const unsigned IEXTEN = 0002000; const unsigned EXTPROC = 0004000; + +void cfmakesane(Termios *termios_p); +int tcsetsid(int fd, pid_t pid); +int tcgetwinsize(int fd, Winsize *wp); +int tcsetwinsize(int fd, const Winsize *wp); +#endif + +#if SYSTEM_OPENBSD + +typedef unsigned int tcflag_t; +typedef unsigned char cc_t; +typedef unsigned int speed_t; + +const u32 NCCS = 20; + +struct Termios @(cname="termios") { + tcflag_t c_iflag; + tcflag_t c_oflag; + tcflag_t c_cflag; + tcflag_t c_lflag; + cc_t[NCCS] c_cc; + int c_ispeed; + int c_ospeed; +}; + +/* c_cc characters */ +const unsigned VEOF = 0; +const unsigned VEOL = 1; +const unsigned VEOL2 = 2; +const unsigned VERASE = 3; +const unsigned VWERASE = 4; +const unsigned VKILL = 5; +const unsigned VREPRINT = 6; +const unsigned VINTR = 8; +const unsigned VQUIT = 9; +const unsigned VSUSP = 10; +const unsigned VSTART = 12; +const unsigned VSTOP = 13; +const unsigned VLNEXT = 14; +const unsigned VDISCARD = 15; +const unsigned VMIN = 16; +const unsigned VTIME = 17; + +/* c_iflag bits */ +const unsigned IGNBRK = 0000001; +const unsigned BRKINT = 0000002; +const unsigned IGNPAR = 0000004; +const unsigned PARMRK = 0000010; +const unsigned INPCK = 0000020; +const unsigned ISTRIP = 0000040; +const unsigned INLCR = 0000100; +const unsigned IGNCR = 0000200; +const unsigned ICRNL = 0000400; +const unsigned IUCLC = 0010000; +const unsigned IXON = 0001000; +const unsigned IXANY = 0004000; +const unsigned IXOFF = 0002000; +const unsigned IMAXBEL = 0020000; + +/* c_oflag bits */ +const unsigned OPOST = 0000001; +const unsigned OLCUC = 0000040; +const unsigned ONLCR = 0000002; +const unsigned OCRNL = 0000020; +const unsigned ONOCR = 0000100; +const unsigned ONLRET = 0000200; + +/* c_cflag bit meaning */ +const unsigned B0 = 0; /* hang up */ +const unsigned B50 = 50; +const unsigned B75 = 75; +const unsigned B110 = 110; +const unsigned B134 = 134; +const unsigned B150 = 150; +const unsigned B200 = 200; +const unsigned B300 = 300; +const unsigned B600 = 600; +const unsigned B1200 = 1200; +const unsigned B1800 = 1800; +const unsigned B2400 = 2400; +const unsigned B4800 = 4800; +const unsigned B9600 = 9600; +const unsigned B19200 = 19200; +const unsigned B38400 = 38400; +const unsigned EXTA = B19200; +const unsigned EXTB = B38400; +const unsigned CSIZE = 0001400; +const unsigned CS5 = 0000000; +const unsigned CS6 = 0000400; +const unsigned CS7 = 0001000; +const unsigned CS8 = 0001400; +const unsigned CSTOPB = 0002000; +const unsigned CREAD = 0004000; +const unsigned PARENB = 0010000; +const unsigned PARODD = 0020000; +const unsigned HUPCL = 0040000; +const unsigned CLOCAL = 0100000; +const unsigned B57600 = 57600; +const unsigned B115200 = 115200; +const unsigned B230400 = 230400; +const unsigned CRTSCTS = 0200000; /* flow control */ + +/* c_lflag bits */ +const unsigned ISIG = 0000200; +const unsigned ICANON = 0000400; +const unsigned XCASE = 0100000000; +const unsigned ECHO = 0000010; +const unsigned ECHOE = 0000002; +const unsigned ECHOK = 0000004; +const unsigned ECHONL = 0000020; +const unsigned NOFLSH = 020000000000; +const unsigned TOSTOP = 020000000; +const unsigned ECHOCTL = 0000100; +const unsigned ECHOPRT = 0000040; +const unsigned ECHOKE = 0000001; +const unsigned FLUSHO = 040000000; +const unsigned PENDIN = 04000000000; +const unsigned IEXTEN = 0002000; +const unsigned EXTPROC = 0004000; + #endif -int tcgetattr(int fd, Termios* termios_p); -int tcsetattr(int fd, int optional_actions, const Termios* termios_p); +speed_t cfgetispeed(const Termios *termios_p); +speed_t cfgetospeed(const Termios *termios_p); +int cfsetispeed(Termios *termios_p, speed_t speed); +int cfsetospeed(Termios *termios_p, speed_t speed); +int cfsetspeed(Termios *termios_p, speed_t speed); +void cfmakeraw(Termios *termios_p); +int tcgetattr(int fd, Termios *termios_p); +int tcsetattr(int fd, int optional_actions, const Termios *termios_p); +int tcdrain(int fd); +int tcflow(int fd, int action); +int tcflush(int fd, int queue_selector); +int tcsendbreak(int fd, int duration); +pid_t tcgetsid(int fd);