mirror of
https://sourceware.org/git/glibc.git
synced 2026-01-06 11:51:29 +03:00
linux: implement arbitrary and split speeds in termios
Linux has supported arbitrary speeds and split speeds in the kernel since 2008 on all platforms except Alpha (fixed in 2020), but glibc was never updated to match. This is further complicated by POSIX uses of macros for the cf[gs]et[io]speed interfaces, rather than plain numbers, as it really ought to have. On most platforms, the glibc ABI includes the c_[io]speed fields in struct termios, but they are incorrectly used. On MIPS and SPARC, they are entirely missing. For backwards compatibility, the kernel will still use the legacy speed fields unless they are set to BOTHER, and will use the legacy output speed as the input speed if the latter is 0 (== B0). However, the specific encoding used is visible to user space applications, including ones other than the one running. - SPARC and MIPS get a new struct termios, and tc[gs]etattr() is versioned accordingly. However, the new struct termios is set to be a strict extension of the old one, which means that cf* interfaces other than the speed-related ones do not need versioning. - The Bxxx constants are redefined as equivalent to their integer values and the legacy Bxxx constants are renamed __Bxxx. - cf[gs]et[io]speed() and cfsetspeed() are versioned accordingly. - tcgetattr() and cfset[io]speed() are adjusted to always keep the c_[io]speed fields correct (unlike earlier versions), but to canonicalize the representation to ALSO configure the legacy fields if a valid legacy representation exists. - tcsetattr(), too, canonicalizes the representation in this way before passing it to the kernel, to maximize compatibility with older applications/tools. - The old IBAUD0 hack is removed; it is no longer necessary since even the legacy c_cflag baud rate fields have had separate input values for a long time. Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com> Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
This commit is contained in:
committed by
Adhemerval Zanella
parent
5f54d8bc48
commit
5cf101a85a
@@ -24,35 +24,41 @@ typedef unsigned char cc_t;
|
||||
typedef unsigned int speed_t;
|
||||
typedef unsigned int tcflag_t;
|
||||
|
||||
#include <bits/termios-struct.h>
|
||||
#ifdef _TERMIOS_H
|
||||
# include <bits/termios-struct.h>
|
||||
#endif
|
||||
|
||||
#include <bits/termios-c_cc.h>
|
||||
#include <bits/termios-c_iflag.h>
|
||||
#include <bits/termios-c_oflag.h>
|
||||
|
||||
/* c_cflag bit meaning */
|
||||
#define B0 0000000 /* hang up */
|
||||
#define B50 0000001
|
||||
#define B75 0000002
|
||||
#define B110 0000003
|
||||
#define B134 0000004
|
||||
#define B150 0000005
|
||||
#define B200 0000006
|
||||
#define B300 0000007
|
||||
#define B600 0000010
|
||||
#define B1200 0000011
|
||||
#define B1800 0000012
|
||||
#define B2400 0000013
|
||||
#define B4800 0000014
|
||||
#define B9600 0000015
|
||||
#define B19200 0000016
|
||||
#define B38400 0000017
|
||||
#ifdef __USE_MISC
|
||||
# define EXTA B19200
|
||||
# define EXTB B38400
|
||||
#endif
|
||||
#include <bits/termios-baud.h>
|
||||
|
||||
#include <bits/termios-c_cflag.h>
|
||||
|
||||
#define __B0 0000000 /* hang up */
|
||||
#define __B50 0000001
|
||||
#define __B75 0000002
|
||||
#define __B110 0000003
|
||||
#define __B134 0000004
|
||||
#define __B150 0000005
|
||||
#define __B200 0000006
|
||||
#define __B300 0000007
|
||||
#define __B600 0000010
|
||||
#define __B1200 0000011
|
||||
#define __B1800 0000012
|
||||
#define __B2400 0000013
|
||||
#define __B4800 0000014
|
||||
#define __B9600 0000015
|
||||
#define __B19200 0000016
|
||||
#define __B38400 0000017
|
||||
#include <bits/termios-cbaud.h>
|
||||
|
||||
#ifdef __USE_MISC
|
||||
# define EXTA __B19200
|
||||
# define EXTB __B38400
|
||||
# define BOTHER __BOTHER
|
||||
#endif
|
||||
|
||||
#include <bits/termios-c_lflag.h>
|
||||
|
||||
#ifdef __USE_MISC
|
||||
@@ -74,3 +80,5 @@ typedef unsigned int tcflag_t;
|
||||
#include <bits/termios-tcflow.h>
|
||||
|
||||
#include <bits/termios-misc.h>
|
||||
|
||||
#include <bits/termios-baud.h>
|
||||
|
||||
Reference in New Issue
Block a user