From 90374108bb8e84f45ef3186f8d569cf1eb4e446d Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Wed, 9 Jan 2002 14:13:19 +0000 Subject: Rework termios wrapping code to try and do the right thing. -Erik --- libc/termios/kernel_termios.h | 79 ++++++++++++++----------------------------- libc/termios/tcgetattr.c | 3 +- libc/termios/tcsetattr.c | 6 ++-- libc/termios/termios.c | 16 ++++----- 4 files changed, 36 insertions(+), 68 deletions(-) (limited to 'libc/termios') 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 + +/* 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 +#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 +#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 -#include #include #include #include @@ -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 #include -#include #include #include @@ -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 #include #include -#include #include +#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; -- cgit v1.2.3