summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2002-01-09 14:13:19 +0000
committerEric Andersen <andersen@codepoet.org>2002-01-09 14:13:19 +0000
commit90374108bb8e84f45ef3186f8d569cf1eb4e446d (patch)
treecdb2169ecf3be304c8ad01b4da85a28dde83c513
parent1ad690545c7079115f76918f483c33c120e48204 (diff)
Rework termios wrapping code to try and do the right thing.
-Erik
-rw-r--r--libc/termios/kernel_termios.h79
-rw-r--r--libc/termios/tcgetattr.c3
-rw-r--r--libc/termios/tcsetattr.c6
-rw-r--r--libc/termios/termios.c16
4 files changed, 36 insertions, 68 deletions
diff --git a/libc/termios/kernel_termios.h b/libc/termios/kernel_termios.h
index e8969eb76..af6fb2aca 100644
--- a/libc/termios/kernel_termios.h
+++ b/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 */
diff --git a/libc/termios/tcgetattr.c b/libc/termios/tcgetattr.c
index 957b5b0c1..b8728461a 100644
--- a/libc/termios/tcgetattr.c
+++ b/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;
diff --git a/libc/termios/tcsetattr.c b/libc/termios/tcsetattr.c
index 9637c0fa6..9f8c172bd 100644
--- a/libc/termios/tcsetattr.c
+++ b/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;
diff --git a/libc/termios/termios.c b/libc/termios/termios.c
index 43b4cb647..a5b3b2776 100644
--- a/libc/termios/termios.c
+++ b/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;