[PATCH] Revert "Linux: Keep termios ioctl constants strictly internal"
Sam James
sam@gentoo.org
Sun Jul 20 18:11:30 GMT 2025
Florian Weimer <fweimer@redhat.com> writes:
> This reverts commit 3d3572f59059e2b19b8541ea648a6172136ec42e.
>
> Reason for revert: TCGETS etc. work to some extent on at least
> a subset of architectures, so there is no pressing need to force
> applications off them. Removal of the macros breaks building
> the sanitizers, impacting both GCC and LLVM.
>
LGTM.
> Tested on x86_64-linux-gnu.
>
> ---
> NEWS | 5 ---
> sysdeps/unix/sysv/linux/Makefile | 2 --
> sysdeps/unix/sysv/linux/alpha/bits/ioctls.h | 36 +++++++++++++++++++
> sysdeps/unix/sysv/linux/alpha/termios_arch.h | 26 ++++++++++++++
> sysdeps/unix/sysv/linux/bits/ioctls.h | 14 --------
> sysdeps/unix/sysv/linux/hppa/bits/ioctls.h | 36 +++++++++++++++++++
> sysdeps/unix/sysv/linux/isatty.c | 2 +-
> sysdeps/unix/sysv/linux/isatty_nostatus.c | 2 +-
> .../linux/mips/{old_termios.h => termios_arch.h} | 23 ++++++------
> sysdeps/unix/sysv/linux/powerpc/internal-ioctl.h | 27 ++++----------
> sysdeps/unix/sysv/linux/powerpc/termios_arch.h | 33 +++++++++++++++++
> sysdeps/unix/sysv/linux/sparc/bits/ioctls.h | 36 +++++++++++++++++++
> .../linux/sparc/{old_termios.h => termios_arch.h} | 23 ++++++------
> sysdeps/unix/sysv/linux/tcgetattr.c | 2 +-
> sysdeps/unix/sysv/linux/tcsetattr.c | 18 ++++------
> sysdeps/unix/sysv/linux/termios-kernel-consts.sym | 26 --------------
> sysdeps/unix/sysv/linux/termios_arch.h | 23 ++++++++++++
> sysdeps/unix/sysv/linux/termios_internals.h | 42 ++++++++++++++--------
> 18 files changed, 260 insertions(+), 116 deletions(-)
>
> diff --git a/NEWS b/NEWS
> index 9a92dd098a..7c9ff07312 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -46,11 +46,6 @@ Deprecated and removed features, and other changes affecting compatibility:
> obsolete since the very first version of POSIX.1 in 1988, replaced
> with <termios.h>.
>
> -* On Linux, the ioctl constants TCGETS, TCSETS, TCSETSF, TCSETSW,
> - TCGETS2, TCSETS2, TCSETSF2, TCSETSW2 are no longer defined in
> - <sys/ioctl.h>. Applications must use the high-level <termios.h>
> - interfaces instead.
> -
> * The support for TX lock elision of pthread mutexes is deprecated on
> all architectures and will be removed in the next release.
>
> diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
> index 0aec783f1e..c47cbdf428 100644
> --- a/sysdeps/unix/sysv/linux/Makefile
> +++ b/sysdeps/unix/sysv/linux/Makefile
> @@ -425,8 +425,6 @@ sysdep_headers += \
> bits/termios-tcflow.h \
> # sysdep_headers
>
> -gen-as-const-headers += termios-kernel-consts.sym
> -
> tests += \
> tst-termios-linux \
> # tests
> diff --git a/sysdeps/unix/sysv/linux/alpha/bits/ioctls.h b/sysdeps/unix/sysv/linux/alpha/bits/ioctls.h
> new file mode 100644
> index 0000000000..77dc0c1c44
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/alpha/bits/ioctls.h
> @@ -0,0 +1,36 @@
> +/* Copyright (C) 1996-2025 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library. If not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#ifndef _SYS_IOCTL_H
> +# error "Never use <bits/ioctls.h> directly; include <sys/ioctl.h> instead."
> +#endif
> +
> +/* Use the definitions from the kernel header files. */
> +#include <asm/ioctls.h>
> +
> +/* Oh well, this is necessary since the kernel data structure is
> + different from the user-level version. */
> +#undef TCGETS
> +#undef TCSETS
> +#undef TCSETSW
> +#undef TCSETSF
> +#define TCGETS _IOR ('t', 19, char[44])
> +#define TCSETS _IOW ('t', 20, char[44])
> +#define TCSETSW _IOW ('t', 21, char[44])
> +#define TCSETSF _IOW ('t', 22, char[44])
> +
> +#include <linux/sockios.h>
> diff --git a/sysdeps/unix/sysv/linux/alpha/termios_arch.h b/sysdeps/unix/sysv/linux/alpha/termios_arch.h
> new file mode 100644
> index 0000000000..20025f2549
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/alpha/termios_arch.h
> @@ -0,0 +1,26 @@
> +/* Architectural parameters for Linux termios - Alpha/PowerPC version
> +
> + Copyright (C) 1997-2025 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#ifndef TERMIOS_INTERNALS_H
> +# error "<termios_arch.h> should only be included from <termios_internals.h>"
> +#endif
> +
> +#define _TERMIOS2_NCCS 19
> +#define _HAVE_TERMIOS2_C_CC_BEFORE_C_LINE 1
> +#define _HAVE_STRUCT_OLD_TERMIOS 0
> diff --git a/sysdeps/unix/sysv/linux/bits/ioctls.h b/sysdeps/unix/sysv/linux/bits/ioctls.h
> index f340a4f3a0..1ddcd4f45a 100644
> --- a/sysdeps/unix/sysv/linux/bits/ioctls.h
> +++ b/sysdeps/unix/sysv/linux/bits/ioctls.h
> @@ -22,18 +22,4 @@
> /* Use the definitions from the kernel header files. */
> #include <asm/ioctls.h>
>
> -/* The GNU C library has a different definition of struct termios,
> - incompatible with what the ioctl interface expects. The existence
> - of the termios2 ioctls is considered an implementation detail.
> - Undefine all related ioctl constants. */
> -#undef TCGETS
> -#undef TCSETS
> -#undef TCSETSF
> -#undef TCSETSW
> -#undef TCGETS2
> -#undef TCSETS2
> -#undef TCSETSF2
> -#undef TCSETSW2
> -
> -
> #include <linux/sockios.h>
> diff --git a/sysdeps/unix/sysv/linux/hppa/bits/ioctls.h b/sysdeps/unix/sysv/linux/hppa/bits/ioctls.h
> new file mode 100644
> index 0000000000..6563be8030
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/hppa/bits/ioctls.h
> @@ -0,0 +1,36 @@
> +/* Copyright (C) 1996-2025 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library. If not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#ifndef _SYS_IOCTL_H
> +# error "Never use <bits/ioctls.h> directly; include <sys/ioctl.h> instead."
> +#endif
> +
> +/* Use the definitions from the kernel header files. */
> +#include <asm/ioctls.h>
> +
> +/* Oh well, this is necessary since the kernel data structure is
> + different from the user-level version. */
> +#undef TCGETS
> +#undef TCSETS
> +#undef TCSETSW
> +#undef TCSETSF
> +#define TCGETS _IOR ('T', 16, char[36])
> +#define TCSETS _IOW ('T', 17, char[36])
> +#define TCSETSW _IOW ('T', 18, char[36])
> +#define TCSETSF _IOW ('T', 19, char[36])
> +
> +#include <linux/sockios.h>
> diff --git a/sysdeps/unix/sysv/linux/isatty.c b/sysdeps/unix/sysv/linux/isatty.c
> index e7e98f8c8c..3faaec5e66 100644
> --- a/sysdeps/unix/sysv/linux/isatty.c
> +++ b/sysdeps/unix/sysv/linux/isatty.c
> @@ -24,6 +24,6 @@ int
> __isatty (int fd)
> {
> struct termios2 k_termios;
> - return INLINE_SYSCALL_CALL (ioctl, fd, ARCH_TCGETS, &k_termios) == 0;
> + return INLINE_SYSCALL_CALL (ioctl, fd, TCGETS2, &k_termios) == 0;
> }
> weak_alias (__isatty, isatty)
> diff --git a/sysdeps/unix/sysv/linux/isatty_nostatus.c b/sysdeps/unix/sysv/linux/isatty_nostatus.c
> index 99704424f4..406decba62 100644
> --- a/sysdeps/unix/sysv/linux/isatty_nostatus.c
> +++ b/sysdeps/unix/sysv/linux/isatty_nostatus.c
> @@ -22,5 +22,5 @@ int
> __isatty_nostatus (int fd)
> {
> struct termios2 k_termios;
> - return INTERNAL_SYSCALL_CALL (ioctl, fd, ARCH_TCGETS, &k_termios) == 0;
> + return INTERNAL_SYSCALL_CALL (ioctl, fd, TCGETS2, &k_termios) == 0;
> }
> diff --git a/sysdeps/unix/sysv/linux/mips/old_termios.h b/sysdeps/unix/sysv/linux/mips/termios_arch.h
> similarity index 62%
> rename from sysdeps/unix/sysv/linux/mips/old_termios.h
> rename to sysdeps/unix/sysv/linux/mips/termios_arch.h
> index 8164742086..392d9aa792 100644
> --- a/sysdeps/unix/sysv/linux/mips/old_termios.h
> +++ b/sysdeps/unix/sysv/linux/mips/termios_arch.h
> @@ -1,6 +1,6 @@
> -/* old_termios.h for MIPS.
> +/* Architectural parameters for Linux termios - MIPS version
>
> - Copyright (C) 2025 Free Software Foundation, Inc.
> + Copyright (C) 1991-2025 Free Software Foundation, Inc.
> This file is part of the GNU C Library.
>
> The GNU C Library is free software; you can redistribute it and/or
> @@ -17,15 +17,18 @@
> License along with the GNU C Library; if not, see
> <https://www.gnu.org/licenses/>. */
>
> +#define _TERMIOS2_NCCS 23
> +#define _HAVE_TERMIOS2_C_CC_BEFORE_C_LINE 0
> +
> #define _HAVE_STRUCT_OLD_TERMIOS 1
>
> #define OLD_NCCS 32
> -typedef struct old_termios
> +struct old_termios
> {
> - 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 c_cc[OLD_NCCS]; /* control characters */
> -} old_termios_t;
> + 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 c_cc[OLD_NCCS]; /* control characters */
> +};
> diff --git a/sysdeps/unix/sysv/linux/powerpc/internal-ioctl.h b/sysdeps/unix/sysv/linux/powerpc/internal-ioctl.h
> index 94cfd719ca..6c21357a9c 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/internal-ioctl.h
> +++ b/sysdeps/unix/sysv/linux/powerpc/internal-ioctl.h
> @@ -1,4 +1,4 @@
> -/* Linux internal definitions for ioctl. powerpc version.
> +/* Linux internal definitions for ioctl.
> Copyright (C) 2021-2025 Free Software Foundation, Inc.
> This file is part of the GNU C Library.
>
> @@ -17,40 +17,27 @@
> <https://www.gnu.org/licenses/>. */
>
> #include <termios.h>
> -#include <termios_internals.h>
> -#include <assert.h>
> -
> -/* PowerPC quirk: on PowerPC only, ioctl() emulates the TCGETS/TCSETS*
> - ioctls with tcgetattr/tcsetattr using the glibc struct termios.
> - As struct termios2 is the same as the kernel struct termios on PowerPC,
> - simply consider the kernel ones as the termios2 interface, even
> - though the kernel doesn't call it that. */
> -
> -#define GLIBC_TCGETS _IOR ('t', 19, struct termios)
> -#define GLIBC_TCSETS _IOW ('t', 20, struct termios)
> -#define GLIBC_TCSETSW _IOW ('t', 21, struct termios)
> -#define GLIBC_TCSETSF _IOW ('t', 22, struct termios)
>
> +/* The user-visible size of struct termios has changed. Catch ioctl calls
> + using the new-style struct termios, and translate them to old-style. */
> static inline bool
> __ioctl_arch (int *r, int fd, unsigned long request, void *arg)
> {
> - static_assert (GLIBC_TCGETS != KERNEL_TCGETS2,
> - "emulation not possible due to matching ioctl constants");
> switch (request)
> {
> - case GLIBC_TCGETS:
> + case TCGETS:
> *r = __tcgetattr (fd, (struct termios *) arg);
> break;
>
> - case GLIBC_TCSETS:
> + case TCSETS:
> *r = __tcsetattr (fd, TCSANOW, (struct termios *) arg);
> break;
>
> - case GLIBC_TCSETSW:
> + case TCSETSW:
> *r = __tcsetattr (fd, TCSADRAIN, (struct termios *) arg);
> break;
>
> - case GLIBC_TCSETSF:
> + case TCSETSF:
> *r = __tcsetattr (fd, TCSAFLUSH, (struct termios *) arg);
> break;
>
> diff --git a/sysdeps/unix/sysv/linux/powerpc/termios_arch.h b/sysdeps/unix/sysv/linux/powerpc/termios_arch.h
> new file mode 100644
> index 0000000000..919b437650
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/powerpc/termios_arch.h
> @@ -0,0 +1,33 @@
> +/* Architectural parameters for Linux termios - PowerPC version
> +
> + Copyright (C) 1997-2025 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#define _TERMIOS2_NCCS 19
> +#define _HAVE_TERMIOS2_C_CC_BEFORE_C_LINE 1
> +#define _HAVE_STRUCT_OLD_TERMIOS 0
> +
> +/* PowerPC quirk: on PowerPC only, ioctl() emulates the TCGETS/TCSETS*
> + ioctls with tcgetattr/tcsetattr using the glibc struct termios.
> + As struct termios2 is the same as the kernel struct termios on PowerPC,
> + simply consider the kernel ones as the termios2 interface, even
> + though the kernel doesn't call it that. */
> +
> +#define TCGETS2 _IOR ('t', 19, struct termios2)
> +#define TCSETS2 _IOW ('t', 20, struct termios2)
> +#define TCSETSW2 _IOW ('t', 21, struct termios2)
> +#define TCSETSF2 _IOW ('t', 22, struct termios2)
> diff --git a/sysdeps/unix/sysv/linux/sparc/bits/ioctls.h b/sysdeps/unix/sysv/linux/sparc/bits/ioctls.h
> new file mode 100644
> index 0000000000..1a95466e8f
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/sparc/bits/ioctls.h
> @@ -0,0 +1,36 @@
> +/* Copyright (C) 1996-2025 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#ifndef _SYS_IOCTL_H
> +# error "Never use <bits/ioctls.h> directly; include <sys/ioctl.h> instead."
> +#endif
> +
> +/* Use the definitions from the kernel header files. */
> +#include <asm/ioctls.h>
> +
> +/* Oh well, this is necessary since the kernel data structure is
> + different from the user-level version. */
> +#undef TCGETS
> +#undef TCSETS
> +#undef TCSETSW
> +#undef TCSETSF
> +#define TCGETS _IOR ('T', 8, char[36])
> +#define TCSETS _IOW ('T', 9, char[36])
> +#define TCSETSW _IOW ('T', 10, char[36])
> +#define TCSETSF _IOW ('T', 11, char[36])
> +
> +#include <linux/sockios.h>
> diff --git a/sysdeps/unix/sysv/linux/sparc/old_termios.h b/sysdeps/unix/sysv/linux/sparc/termios_arch.h
> similarity index 62%
> rename from sysdeps/unix/sysv/linux/sparc/old_termios.h
> rename to sysdeps/unix/sysv/linux/sparc/termios_arch.h
> index d7af589c0d..f3b3f656d1 100644
> --- a/sysdeps/unix/sysv/linux/sparc/old_termios.h
> +++ b/sysdeps/unix/sysv/linux/sparc/termios_arch.h
> @@ -1,6 +1,6 @@
> -/* old_termios.h for SPARC.
> +/* Architectural parameters for Linux termios - SPARC version
>
> - Copyright (C) 2025 Free Software Foundation, Inc.
> + Copyright (C) 1991-2025 Free Software Foundation, Inc.
> This file is part of the GNU C Library.
>
> The GNU C Library is free software; you can redistribute it and/or
> @@ -17,15 +17,18 @@
> License along with the GNU C Library; if not, see
> <https://www.gnu.org/licenses/>. */
>
> +#define _TERMIOS2_NCCS 19
> +#define _HAVE_TERMIOS2_C_CC_BEFORE_C_LINE 0
> +
> #define _HAVE_STRUCT_OLD_TERMIOS 1
>
> #define OLD_NCCS 17
> -typedef struct old_termios
> +struct old_termios
> {
> - 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 c_cc[OLD_NCCS]; /* control characters */
> -} old_termios_t;
> + 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 c_cc[OLD_NCCS]; /* control characters */
> +};
> diff --git a/sysdeps/unix/sysv/linux/tcgetattr.c b/sysdeps/unix/sysv/linux/tcgetattr.c
> index 36f68a7868..ca175697a3 100644
> --- a/sysdeps/unix/sysv/linux/tcgetattr.c
> +++ b/sysdeps/unix/sysv/linux/tcgetattr.c
> @@ -22,7 +22,7 @@ int
> __tcgetattr (int fd, struct termios *termios_p)
> {
> struct termios2 k_termios;
> - long int retval = INLINE_SYSCALL_CALL (ioctl, fd, ARCH_TCGETS, &k_termios);
> + long int retval = INLINE_SYSCALL_CALL (ioctl, fd, TCGETS2, &k_termios);
>
> if (__glibc_likely (retval != -1))
> {
> diff --git a/sysdeps/unix/sysv/linux/tcsetattr.c b/sysdeps/unix/sysv/linux/tcsetattr.c
> index ad8f2dfc3f..4f07a03e66 100644
> --- a/sysdeps/unix/sysv/linux/tcsetattr.c
> +++ b/sysdeps/unix/sysv/linux/tcsetattr.c
> @@ -19,12 +19,6 @@
>
> #define static_assert_equal(x,y) _Static_assert ((x) == (y), #x " != " #y)
>
> -static_assert_equal (sizeof (struct termios2), KERNEL_TERMIOS2_SIZE);
> -static_assert_equal (offsetof (struct termios2, c_cc),
> - KERNEL_TERMIOS2_CC_OFFSET);
> -static_assert_equal (offsetof (struct termios2, c_line),
> - KERNEL_TERMIOS2_LINE_OFFSET);
> -
> /* Set the state of FD to *TERMIOS_P. */
> int
> __tcsetattr (int fd, int optional_actions, const struct termios *termios_p)
> @@ -59,10 +53,10 @@ __tcsetattr (int fd, int optional_actions, const struct termios *termios_p)
> */
> static_assert_equal(TCSADRAIN, TCSANOW + 1);
> static_assert_equal(TCSAFLUSH, TCSANOW + 2);
> - static_assert_equal(KERNEL_TCSETSW2, KERNEL_TCSETS2 + 1);
> - static_assert_equal(KERNEL_TCSETSF2, KERNEL_TCSETS2 + 2);
> - static_assert_equal(KERNEL_TCSETSW, KERNEL_TCSETS + 1);
> - static_assert_equal(KERNEL_TCSETSF, KERNEL_TCSETS + 2);
> + static_assert_equal(TCSETSW2, TCSETS2 + 1);
> + static_assert_equal(TCSETSF2, TCSETS2 + 2);
> + static_assert_equal(TCSETSW, TCSETS + 1);
> + static_assert_equal(TCSETSF, TCSETS + 2);
>
> cmd = (long)optional_actions - TCSANOW;
> if (cmd > 2)
> @@ -72,11 +66,11 @@ __tcsetattr (int fd, int optional_actions, const struct termios *termios_p)
> k_termios.c_ospeed != k_termios.c_ispeed ||
> cbaud (k_termios.c_cflag) == __BOTHER)
> {
> - cmd += KERNEL_TCSETS2;
> + cmd += TCSETS2;
> }
> else
> {
> - cmd += KERNEL_TCSETS;
> + cmd += TCSETS;
> k_termios.c_cflag &= ~CIBAUD;
> }
>
> diff --git a/sysdeps/unix/sysv/linux/termios-kernel-consts.sym b/sysdeps/unix/sysv/linux/termios-kernel-consts.sym
> deleted file mode 100644
> index 3856a8cc1c..0000000000
> --- a/sysdeps/unix/sysv/linux/termios-kernel-consts.sym
> +++ /dev/null
> @@ -1,26 +0,0 @@
> -#include <linux/termios.h>
> -#include <stddef.h>
> -
> -#ifdef TCGETS2
> -# define STRUCT_TERMIOS struct termios2
> -#else
> -# define TCGETS2 TCGETS
> -# define TCSETS2 TCSETS
> -# define TCSETSW2 TCSETSW
> -# define TCSETSF2 TCSETSF
> -# define STRUCT_TERMIOS struct termios
> -#endif
> -
> ---
> -KERNEL_TCGETS TCGETS
> -KERNEL_TCSETS TCSETS
> -KERNEL_TCSETSF TCSETSF
> -KERNEL_TCSETSW TCSETSW
> -KERNEL_TCGETS2 TCGETS2
> -KERNEL_TCSETS2 TCSETS2
> -KERNEL_TCSETSF2 TCSETSF2
> -KERNEL_TCSETSW2 TCSETSW2
> -KERNEL_TERMIOS2_SIZE sizeof (STRUCT_TERMIOS)
> -KERNEL_TERMIOS2_CC_OFFSET offsetof (STRUCT_TERMIOS, c_cc)
> -KERNEL_TERMIOS2_LINE_OFFSET offsetof (STRUCT_TERMIOS, c_line)
> -_TERMIOS2_NCCS sizeof ((STRUCT_TERMIOS) { 0 }.c_cc) / sizeof (cc_t)
> diff --git a/sysdeps/unix/sysv/linux/termios_arch.h b/sysdeps/unix/sysv/linux/termios_arch.h
> new file mode 100644
> index 0000000000..8dbf420c28
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/termios_arch.h
> @@ -0,0 +1,23 @@
> +/* Architectural parameters for Linux termios - generic version
> +
> + Copyright (C) 1997-2025 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#define _TERMIOS2_NCCS 19
> +#define _HAVE_TERMIOS2_C_CC_BEFORE_C_LINE 0
> +
> +#define _HAVE_STRUCT_OLD_TERMIOS 0
> diff --git a/sysdeps/unix/sysv/linux/termios_internals.h b/sysdeps/unix/sysv/linux/termios_internals.h
> index b2f3f1b3fd..e8dbfe74de 100644
> --- a/sysdeps/unix/sysv/linux/termios_internals.h
> +++ b/sysdeps/unix/sysv/linux/termios_internals.h
> @@ -30,18 +30,7 @@
> #include <sysdep.h>
> #include <shlib-compat.h>
>
> -#include <termios-kernel-consts.h>
> -
> -/* Alpha got termios2 late, but TCGETS has exactly the same structure
> - format and function as TCGETS2. On all other platforms, the termios2
> - interface exists as far back as this version of glibc supports.
> -
> - For TCSETS* it is more complicated; this is handled in tcsetattr.c. */
> -#ifdef __ASSUME_TERMIOS2
> -# define ARCH_TCGETS KERNEL_TCGETS2
> -#else
> -# define ARCH_TCGETS KERNEL_TCGETS
> -#endif
> +#include <termios_arch.h>
>
> /* ---- Kernel interface definitions ---- */
>
> @@ -55,7 +44,7 @@ struct termios2
> tcflag_t c_oflag; /* output mode flags */
> tcflag_t c_cflag; /* control mode flags */
> tcflag_t c_lflag; /* local mode flags */
> -#if KERNEL_TERMIOS2_CC_OFFSET < KERNEL_TERMIOS2_LINE_OFFSET
> +#if _HAVE_TERMIOS2_C_CC_BEFORE_C_LINE
> cc_t c_cc[_TERMIOS2_NCCS]; /* control characters */
> cc_t c_line; /* line discipline */
> #else
> @@ -66,6 +55,26 @@ struct termios2
> speed_t c_ospeed; /* output speed */
> };
>
> +/* Alpha got termios2 late, but TCGETS has exactly the same structure
> + format and function as TCGETS2. On all other platforms, the termios2
> + interface exists as far back as this version of glibc supports.
> +
> + For TCSETS* it is more complicated; this is handled in tcsetattr.c.
> +
> + Some other architectures only have the equivalent of the termios2
> + interface, in which case the old ioctl names are the only ones
> + presented, but are equivalent to the new ones. */
> +#ifndef TCGETS2
> +# define TCGETS2 TCGETS
> +# define TCSETS2 TCSETS
> +# define TCSETSW2 TCSETSW
> +# define TCSETSF2 TCSETSF
> +#elif !__ASSUME_TERMIOS2
> +/* Hack for Alpha */
> +# undef TCGETS2
> +# define TCGETS2 TCGETS
> +#endif
> +
> /* ---- Application interface definitions ---- */
>
> /*
> @@ -82,7 +91,12 @@ struct termios2
> * This only applies to SPARC and MIPS; for other architectures the
> * new and old speed_t interfaces both use the same struct termios.
> */
> -#include <old_termios.h>
> +#if _HAVE_STRUCT_OLD_TERMIOS
> +typedef struct old_termios old_termios_t;
> +#else
> +# define OLD_NCCS NCCS
> +typedef struct termios old_termios_t;
> +#endif
>
> /* ---- Internal function definitions ---- */
>
>
> base-commit: 01196393c257c59f63e0e14fa1bfe8d2a699bf2d
More information about the Libc-alpha
mailing list