Browse Source

Rework termios wrapping code to try and do the right thing.
-Erik

Eric Andersen 23 years ago
parent
commit
90374108bb
4 changed files with 36 additions and 68 deletions
  1. 26 53
      libc/termios/kernel_termios.h
  2. 1 2
      libc/termios/tcgetattr.c
  3. 2 4
      libc/termios/tcsetattr.c
  4. 7 9
      libc/termios/termios.c

+ 26 - 53
libc/termios/kernel_termios.h

@@ -1,57 +1,30 @@
-/* Copyright (C) 1997 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 Library General Public License as
-   published by the Free Software Foundation; either version 2 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
-   Library General Public License for more details.
-
-   You should have received a copy of the GNU Library General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If not,
-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
-
 #ifndef _KERNEL_TERMIOS_H
 #define _KERNEL_TERMIOS_H 1
 
-#ifndef __powerpc__
-/* The following corresponds to the values from the Linux 2.1.20 kernel.  */
-
-#define __KERNEL_NCCS 19
-
-struct __kernel_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[__KERNEL_NCCS];	/* control characters */
-  };
-
-#else /* powerpc */
-
-#define _HAVE_C_ISPEED
-#define _HAVE_C_OSPEED
-
-#define __KERNEL_NCCS 19
-struct __kernel_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_cc[__KERNEL_NCCS];	/* control characters */
-    cc_t c_line;		/* line discipline */
-    speed_t c_ispeed;		/* input speed */
-    speed_t c_ospeed;		/* output speed */
-  };
-
-#endif
+#include <sys/types.h>
+
+/* Pull in whatever this particular arch's kernel thinks the kernel version of
+ * struct termios should look like.  It turns out that each arch has a different
+ * opinion on the subject, and different kernel revs use different names... */
+#define termio	    __kernel_termios
+#define winsize	    __kernel_winsize
+#define cc_t	    __kernel_cc_t
+#define speed_t	    __kernel_speed_t
+#define tcflag_t    __kernel_tcflag_t
+#undef NCCS
+#include <asm/termios.h> 
+#define __KERNEL_NCCS	NCCS
+#undef NCCS
+#undef termio
+#undef winsize
+#undef cc_t
+#undef speed_t
+#undef tcflag_t
+
+/* Now pull in libc's version of termios */
+#define termios libc_termios
+#include <termios.h>
+#undef termios
+
+#endif	    /* _KERNEL_TERMIOS_H */
 
-#endif /* kernel_termios.h */

+ 1 - 2
libc/termios/tcgetattr.c

@@ -17,7 +17,6 @@
    Boston, MA 02111-1307, USA.  */
 
 #include <string.h>
-#include <termios.h>
 #include <unistd.h>
 #include <sys/ioctl.h>
 #include <sys/types.h>
@@ -28,7 +27,7 @@
 #include "kernel_termios.h"
 
 /* Put the state of FD into *TERMIOS_P.  */
-int tcgetattr ( int fd, struct termios *termios_p)
+int tcgetattr ( int fd, struct libc_termios *termios_p)
 {
   struct __kernel_termios k_termios;
   int retval;

+ 2 - 4
libc/termios/tcsetattr.c

@@ -18,7 +18,6 @@
 
 #include <errno.h>
 #include <string.h>
-#include <termios.h>
 #include <sys/ioctl.h>
 #include <sys/types.h>
 
@@ -47,11 +46,10 @@
 
 
 /* Set the state of FD to *TERMIOS_P.  */
-int
-tcsetattr (fd, optional_actions, termios_p)
+int tcsetattr (fd, optional_actions, termios_p)
      int fd;
      int optional_actions;
-     const struct termios *termios_p;
+     const struct libc_termios *termios_p;
 {
   struct __kernel_termios k_termios;
   unsigned long int cmd;

+ 7 - 9
libc/termios/termios.c

@@ -27,12 +27,11 @@
 #include <stddef.h>
 #include <sys/ioctl.h>
 #include <sys/types.h>
-#include <termios.h>
 #include <unistd.h>
+#include "kernel_termios.h"
 
 #ifdef L_isatty
 /* Return 1 if FD is a terminal, 0 if not.  */
-#include "kernel_termios.h"
 
 int isatty(int fd)
 {
@@ -125,7 +124,7 @@ pid_t tcgetpgrp ( int fd)
 
 #ifdef L_cfgetospeed
 /* Return the output baud rate stored in *TERMIOS_P.  */
-speed_t cfgetospeed ( const struct termios *termios_p)
+speed_t cfgetospeed ( const struct libc_termios *termios_p)
 {
       return termios_p->c_cflag & (CBAUD | CBAUDEX);
 }
@@ -137,7 +136,7 @@ speed_t cfgetospeed ( const struct termios *termios_p)
  * Although for Linux there is no difference between input and output
  * speed, the numerical 0 is a special case for the input baud rate. It
  * should set the input baud rate to the output baud rate. */
-speed_t cfgetispeed (const struct termios *termios_p)
+speed_t cfgetispeed (const struct libc_termios *termios_p)
 {
     return ((termios_p->c_iflag & IBAUD0)
 	    ? 0 : termios_p->c_cflag & (CBAUD | CBAUDEX));
@@ -146,7 +145,7 @@ speed_t cfgetispeed (const struct termios *termios_p)
 
 #ifdef L_cfsetospeed
 /* Set the output baud rate stored in *TERMIOS_P to SPEED.  */
-int cfsetospeed  (struct termios *termios_p, speed_t speed)
+int cfsetospeed  (struct libc_termios *termios_p, speed_t speed)
 {
     if ((speed & ~CBAUD) != 0
 	    && (speed < B57600 || speed > B460800))
@@ -167,7 +166,7 @@ int cfsetospeed  (struct termios *termios_p, speed_t speed)
  *    Although for Linux there is no difference between input and output
  *       speed, the numerical 0 is a special case for the input baud rate.  It
  *          should set the input baud rate to the output baud rate.  */
-int cfsetispeed ( struct termios *termios_p, speed_t speed)
+int cfsetispeed ( struct libc_termios *termios_p, speed_t speed)
 {
     if ((speed & ~CBAUD) != 0
 	    && (speed < B57600 || speed > B460800))
@@ -274,7 +273,7 @@ static const struct speed_struct speeds[] =
 
 
 /* Set both the input and output baud rates stored in *TERMIOS_P to SPEED.  */
-int cfsetspeed (struct termios *termios_p, speed_t speed)
+int cfsetspeed (struct libc_termios *termios_p, speed_t speed)
 {
   size_t cnt;
 
@@ -306,8 +305,7 @@ int cfsetspeed (struct termios *termios_p, speed_t speed)
 
 /* Set *T to indicate raw mode.  */
 void
-cfmakeraw (t)
-     struct termios *t;
+cfmakeraw (struct libc_termios *t)
 {
   t->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
   t->c_oflag &= ~OPOST;