[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