]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Revert "Linux: Keep termios ioctl constants strictly internal"
authorFlorian Weimer <fweimer@redhat.com>
Mon, 21 Jul 2025 13:12:44 +0000 (15:12 +0200)
committerFlorian Weimer <fweimer@redhat.com>
Mon, 21 Jul 2025 13:13:08 +0000 (15:13 +0200)
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.

Reviewed-by: Sam James <sam@gentoo.org>
18 files changed:
NEWS
sysdeps/unix/sysv/linux/Makefile
sysdeps/unix/sysv/linux/alpha/bits/ioctls.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/alpha/termios_arch.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/bits/ioctls.h
sysdeps/unix/sysv/linux/hppa/bits/ioctls.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/isatty.c
sysdeps/unix/sysv/linux/isatty_nostatus.c
sysdeps/unix/sysv/linux/mips/termios_arch.h [moved from sysdeps/unix/sysv/linux/mips/old_termios.h with 62% similarity]
sysdeps/unix/sysv/linux/powerpc/internal-ioctl.h
sysdeps/unix/sysv/linux/powerpc/termios_arch.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/sparc/bits/ioctls.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/sparc/termios_arch.h [moved from sysdeps/unix/sysv/linux/sparc/old_termios.h with 62% similarity]
sysdeps/unix/sysv/linux/tcgetattr.c
sysdeps/unix/sysv/linux/tcsetattr.c
sysdeps/unix/sysv/linux/termios-kernel-consts.sym [deleted file]
sysdeps/unix/sysv/linux/termios_arch.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/termios_internals.h

diff --git a/NEWS b/NEWS
index 9a92dd098a00b63c3ad3542afb286de8453e66dd..7c9ff073123dd454ce1ef04d1f91c5fc01341326 100644 (file)
--- 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.
 
index 0aec783f1e03bc4b89b88965866736d20e0289e3..c47cbdf4280c700d1d3c2203f598243b08c26344 100644 (file)
@@ -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 (file)
index 0000000..77dc0c1
--- /dev/null
@@ -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 (file)
index 0000000..20025f2
--- /dev/null
@@ -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
index f340a4f3a0a0897c53cf0f12feff2372b94186d6..1ddcd4f45aea12c16f625f40b9415069de40b108 100644 (file)
 /* 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 (file)
index 0000000..6563be8
--- /dev/null
@@ -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>
index e7e98f8c8c1592fb87d75f55f44188b63a9b29fd..3faaec5e66d21bc180ed7758b3e9da59bd66390b 100644 (file)
@@ -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)
index 99704424f42b5e7dff37e693b7c9345939307f9c..406decba62a1dbefcf558b405f4510e5e301bcc9 100644 (file)
@@ -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;
 }
similarity index 62%
rename from sysdeps/unix/sysv/linux/mips/old_termios.h
rename to sysdeps/unix/sysv/linux/mips/termios_arch.h
index 8164742086e9fb3cb73b6dc12493e7107ff63e76..392d9aa792ed052b926fb877b1efd44d9c215b22 100644 (file)
@@ -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
    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 */
+};
index 94cfd719cab5c1e3a4156d30e8e344b7569a94a1..6c21357a9c5ad2692ab226bb887136694ed0efca 100644 (file)
@@ -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.
 
    <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 (file)
index 0000000..919b437
--- /dev/null
@@ -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 (file)
index 0000000..1a95466
--- /dev/null
@@ -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>
similarity index 62%
rename from sysdeps/unix/sysv/linux/sparc/old_termios.h
rename to sysdeps/unix/sysv/linux/sparc/termios_arch.h
index d7af589c0de69b56973180343f13d656ab32d809..f3b3f656d14e0fef9709dd39a48df80652aee641 100644 (file)
@@ -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
    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 */
+};
index 36f68a7868a04b7b65bbbf3fc8b0ecac56075e13..ca175697a3f4fa62759ae73a17d122656190c3d6 100644 (file)
@@ -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))
     {
index ad8f2dfc3f0dc22f2fb566a31846c11f2a4907ba..4f07a03e665772ac12def539d1c620526519a096 100644 (file)
 
 #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 (file)
index 3856a8c..0000000
+++ /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 (file)
index 0000000..8dbf420
--- /dev/null
@@ -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
index b2f3f1b3fdff4c06a641eda26245d087164cd956..e8dbfe74ded5757bd4f865237ecb85583fb726fd 100644 (file)
 #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 ---- */