From b1f07180b5e7897f07e390e020b307e6496c9cb1 Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Tue, 28 May 2002 22:26:36 +0000 Subject: [PATCH] 2002-05-28 Jeff Johnston * libc/sys/linux/Makefile.am: Add support for cfspeed.c and tcsendbrk.c. * libc/sys/linux/Makefile.in: Regenerated. * libc/sys/linux/termios.c: Add tcflow(), tcflush(), tcgetpgrp(), and tcsetpgrp() functions. * libc/sys/linux/sys/termios.h: Add include of machine/termios.h to get __MAX_BAUD rate. * libc/sys/linux/machine/i386/include/termios.h: New file. * libc/include/machine/termios.h: Ditto. * libc/sys/linux/cfspeed.c: Ditto. * libc/sys/linux/tcsendbrk.c: Ditto. --- newlib/ChangeLog | 14 +++ newlib/libc/include/machine/termios.h | 1 + newlib/libc/sys/linux/Makefile.am | 8 +- newlib/libc/sys/linux/Makefile.in | 31 +++---- newlib/libc/sys/linux/cfspeed.c | 88 +++++++++++++++++++ .../sys/linux/machine/i386/include/termios.h | 1 + newlib/libc/sys/linux/sys/termios.h | 1 + newlib/libc/sys/linux/tcsendbrk.c | 45 ++++++++++ newlib/libc/sys/linux/termios.c | 70 +++++++++++---- 9 files changed, 222 insertions(+), 37 deletions(-) create mode 100644 newlib/libc/include/machine/termios.h create mode 100644 newlib/libc/sys/linux/cfspeed.c create mode 100644 newlib/libc/sys/linux/machine/i386/include/termios.h create mode 100644 newlib/libc/sys/linux/tcsendbrk.c diff --git a/newlib/ChangeLog b/newlib/ChangeLog index d34f67f02..da2864a8f 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,17 @@ +2002-05-28 Jeff Johnston + + * libc/sys/linux/Makefile.am: Add support for cfspeed.c and + tcsendbrk.c. + * libc/sys/linux/Makefile.in: Regenerated. + * libc/sys/linux/termios.c: Add tcflow(), tcflush(), + tcgetpgrp(), and tcsetpgrp() functions. + * libc/sys/linux/sys/termios.h: Add include of machine/termios.h + to get __MAX_BAUD rate. + * libc/sys/linux/machine/i386/include/termios.h: New file. + * libc/include/machine/termios.h: Ditto. + * libc/sys/linux/cfspeed.c: Ditto. + * libc/sys/linux/tcsendbrk.c: Ditto. + 2002-05-24 Jeff Johnston * libc/include/string.h: Add strnlen and strerror_r prototypes. diff --git a/newlib/libc/include/machine/termios.h b/newlib/libc/include/machine/termios.h new file mode 100644 index 000000000..41fd45938 --- /dev/null +++ b/newlib/libc/include/machine/termios.h @@ -0,0 +1 @@ +#define __MAX_BAUD B4000000 diff --git a/newlib/libc/sys/linux/Makefile.am b/newlib/libc/sys/linux/Makefile.am index 8d9fe5aa2..285baaf46 100644 --- a/newlib/libc/sys/linux/Makefile.am +++ b/newlib/libc/sys/linux/Makefile.am @@ -10,13 +10,13 @@ SUBLIBS = \ $(LINUX_MACH_LIB) LIB_SOURCES = \ - brk.c flockfile.c funlockfile.c gethostname.c getoptlong.c getreent.c ids.c \ - inode.c io.c io64.c linux.c mmap.c \ + brk.c cfspeed.c flockfile.c funlockfile.c gethostname.c getoptlong.c \ + getreent.c ids.c inode.c io.c io64.c linux.c mmap.c \ pread.c pread64.c process.c pwrite.c pwrite64.c raise.c realpath.c \ rename.c resource.c sched.c select.c seteuid.c shm_open.c \ shm_unlink.c signal.c siglongjmp.c socket.c sleep.c stack.c \ - sysconf.c sysctl.c systat.c system.c tcdrain.c termios.c time.c \ - usleep.c wait.c + sysconf.c sysctl.c systat.c system.c tcdrain.c tcsendbrk.c termios.c \ + time.c usleep.c wait.c # This will handle both /usr/src/linux-2.4/include/asm/signal.h (in Red Hat Linux 7.1) # and also /usr/src/linux/include/asm/signal.h in older versions of Red Hat Linux diff --git a/newlib/libc/sys/linux/Makefile.in b/newlib/libc/sys/linux/Makefile.in index 7958a0152..da20d1bb6 100644 --- a/newlib/libc/sys/linux/Makefile.in +++ b/newlib/libc/sys/linux/Makefile.in @@ -101,13 +101,13 @@ SUBLIBS = \ LIB_SOURCES = \ - brk.c flockfile.c funlockfile.c gethostname.c getoptlong.c getreent.c ids.c \ - inode.c io.c io64.c linux.c mmap.c \ + brk.c cfspeed.c flockfile.c funlockfile.c gethostname.c getoptlong.c \ + getreent.c ids.c inode.c io.c io64.c linux.c mmap.c \ pread.c pread64.c process.c pwrite.c pwrite64.c raise.c realpath.c \ rename.c resource.c sched.c select.c seteuid.c shm_open.c \ shm_unlink.c signal.c siglongjmp.c socket.c sleep.c stack.c \ - sysconf.c sysctl.c systat.c system.c tcdrain.c termios.c time.c \ - usleep.c wait.c + sysconf.c sysctl.c systat.c system.c tcdrain.c tcsendbrk.c termios.c \ + time.c usleep.c wait.c # This will handle both /usr/src/linux-2.4/include/asm/signal.h (in Red Hat Linux 7.1) @@ -137,18 +137,19 @@ LIBRARIES = $(noinst_LIBRARIES) DEFS = @DEFS@ -I. -I$(srcdir) CPPFLAGS = @CPPFLAGS@ LIBS = @LIBS@ -@USE_LIBTOOL_FALSE@lib_a_OBJECTS = brk.o flockfile.o funlockfile.o \ -@USE_LIBTOOL_FALSE@gethostname.o getoptlong.o getreent.o ids.o inode.o \ -@USE_LIBTOOL_FALSE@io.o io64.o linux.o mmap.o pread.o pread64.o \ -@USE_LIBTOOL_FALSE@process.o pwrite.o pwrite64.o raise.o realpath.o \ -@USE_LIBTOOL_FALSE@rename.o resource.o sched.o select.o seteuid.o \ -@USE_LIBTOOL_FALSE@shm_open.o shm_unlink.o signal.o siglongjmp.o \ -@USE_LIBTOOL_FALSE@socket.o sleep.o stack.o sysconf.o sysctl.o systat.o \ -@USE_LIBTOOL_FALSE@system.o tcdrain.o termios.o time.o usleep.o wait.o +@USE_LIBTOOL_FALSE@lib_a_OBJECTS = brk.o cfspeed.o flockfile.o \ +@USE_LIBTOOL_FALSE@funlockfile.o gethostname.o getoptlong.o getreent.o \ +@USE_LIBTOOL_FALSE@ids.o inode.o io.o io64.o linux.o mmap.o pread.o \ +@USE_LIBTOOL_FALSE@pread64.o process.o pwrite.o pwrite64.o raise.o \ +@USE_LIBTOOL_FALSE@realpath.o rename.o resource.o sched.o select.o \ +@USE_LIBTOOL_FALSE@seteuid.o shm_open.o shm_unlink.o signal.o \ +@USE_LIBTOOL_FALSE@siglongjmp.o socket.o sleep.o stack.o sysconf.o \ +@USE_LIBTOOL_FALSE@sysctl.o systat.o system.o tcdrain.o tcsendbrk.o \ +@USE_LIBTOOL_FALSE@termios.o time.o usleep.o wait.o LTLIBRARIES = $(noinst_LTLIBRARIES) @USE_LIBTOOL_TRUE@liblinux_la_DEPENDENCIES = -@USE_LIBTOOL_TRUE@liblinux_la_OBJECTS = brk.lo flockfile.lo \ +@USE_LIBTOOL_TRUE@liblinux_la_OBJECTS = brk.lo cfspeed.lo flockfile.lo \ @USE_LIBTOOL_TRUE@funlockfile.lo gethostname.lo getoptlong.lo \ @USE_LIBTOOL_TRUE@getreent.lo ids.lo inode.lo io.lo io64.lo linux.lo \ @USE_LIBTOOL_TRUE@mmap.lo pread.lo pread64.lo process.lo pwrite.lo \ @@ -156,8 +157,8 @@ LTLIBRARIES = $(noinst_LTLIBRARIES) @USE_LIBTOOL_TRUE@resource.lo sched.lo select.lo seteuid.lo shm_open.lo \ @USE_LIBTOOL_TRUE@shm_unlink.lo signal.lo siglongjmp.lo socket.lo \ @USE_LIBTOOL_TRUE@sleep.lo stack.lo sysconf.lo sysctl.lo systat.lo \ -@USE_LIBTOOL_TRUE@system.lo tcdrain.lo termios.lo time.lo usleep.lo \ -@USE_LIBTOOL_TRUE@wait.lo +@USE_LIBTOOL_TRUE@system.lo tcdrain.lo tcsendbrk.lo termios.lo time.lo \ +@USE_LIBTOOL_TRUE@usleep.lo wait.lo CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) diff --git a/newlib/libc/sys/linux/cfspeed.c b/newlib/libc/sys/linux/cfspeed.c new file mode 100644 index 000000000..e935bf178 --- /dev/null +++ b/newlib/libc/sys/linux/cfspeed.c @@ -0,0 +1,88 @@ +/* `struct termios' speed frobnication functions. Linux version. + Copyright (C) 1991, 92, 93, 95, 96, 97, 98, 2000 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, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* Modified by Jeff Johnston, May 27, 2002 to remove kernel hack + as we simply ignore a cfisetspeed of 0 instead of treating it specially */ + +#include +#include +#include + +/* Return the output baud rate stored in *TERMIOS_P. */ +speed_t +cfgetospeed (termios_p) + const struct termios *termios_p; +{ + return termios_p->c_cflag & (CBAUD | CBAUDEX); +} + +/* Return the input baud rate stored in *TERMIOS_P. + For Linux there is no difference between input and output + speed. */ +speed_t +cfgetispeed (termios_p) + const struct termios *termios_p; +{ + return termios_p->c_cflag & (CBAUD | CBAUDEX); +} + +/* Set the output baud rate stored in *TERMIOS_P to SPEED. */ +int +cfsetospeed (termios_p, speed) + struct termios *termios_p; + speed_t speed; +{ + if ((speed & ~CBAUD) != 0 + && (speed < B57600 || speed > __MAX_BAUD)) + { + errno = (EINVAL); + return -1; + } + + termios_p->c_cflag &= ~(CBAUD | CBAUDEX); + termios_p->c_cflag |= speed; + + return 0; +} + +/* Set the input baud rate stored in *TERMIOS_P to 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 so we do + nothing. */ +int +cfsetispeed (termios_p, speed) + struct termios *termios_p; + speed_t speed; +{ + if ((speed & ~CBAUD) != 0 + && (speed < B57600 || speed > __MAX_BAUD)) + { + errno = (EINVAL); + return -1; + } + + if (speed != 0) + { + termios_p->c_cflag &= ~(CBAUD | CBAUDEX); + termios_p->c_cflag |= speed; + } + + return 0; +} diff --git a/newlib/libc/sys/linux/machine/i386/include/termios.h b/newlib/libc/sys/linux/machine/i386/include/termios.h new file mode 100644 index 000000000..ffbbed8ce --- /dev/null +++ b/newlib/libc/sys/linux/machine/i386/include/termios.h @@ -0,0 +1 @@ +#define __MAX_BAUD B4000000 diff --git a/newlib/libc/sys/linux/sys/termios.h b/newlib/libc/sys/linux/sys/termios.h index bde51ab92..ae053b5e4 100644 --- a/newlib/libc/sys/linux/sys/termios.h +++ b/newlib/libc/sys/linux/sys/termios.h @@ -7,6 +7,7 @@ #define _SYS_TERMIOS_H #include +#include /* grr, this shouldn't have to be here */ diff --git a/newlib/libc/sys/linux/tcsendbrk.c b/newlib/libc/sys/linux/tcsendbrk.c new file mode 100644 index 000000000..a35a4d8ce --- /dev/null +++ b/newlib/libc/sys/linux/tcsendbrk.c @@ -0,0 +1,45 @@ +/* Copyright (C) 1992, 1996, 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 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, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* Modified for newlib, May 27, 2002, by Jeff Johnston */ + +#include +#include +#include +#include +#include +#include + +/* Send zero bits on FD. */ +int +tcsendbreak (fd, duration) + int fd; + int duration; +{ + /* The break lasts 0.25 to 0.5 seconds if DURATION is zero, + and an implementation-defined period if DURATION is nonzero. + We define a positive DURATION to be number of milliseconds to break. */ + if (duration <= 0) + return ioctl (fd, TCSBRK, 0); + + /* ioctl can't send a break of any other duration for us. + This could be changed to use trickery (e.g. lower speed and + send a '\0') to send the break, but for now just return an error. */ + errno = (EINVAL); + return -1; +} diff --git a/newlib/libc/sys/linux/termios.c b/newlib/libc/sys/linux/termios.c index 94567b16d..bc0ac550a 100644 --- a/newlib/libc/sys/linux/termios.c +++ b/newlib/libc/sys/linux/termios.c @@ -9,29 +9,63 @@ #include -int tcgetattr(int fd,struct termios *termios_p) +int +tcgetattr(int fd,struct termios *termios_p) { - return ioctl(fd,TCGETS,termios_p); + return ioctl(fd,TCGETS,termios_p); } -int tcsetattr(int fd,int optional_actions,const struct termios *termios_p) +int +tcsetattr(int fd,int optional_actions,const struct termios *termios_p) { - int cmd; + int cmd; - switch (optional_actions) { - case TCSANOW: - cmd = TCSETS; - break; - case TCSADRAIN: - cmd = TCSETSW; - break; - case TCSAFLUSH: - cmd = TCSETSF; - break; - default: - errno = EINVAL; - return -1; + switch (optional_actions) { + case TCSANOW: + cmd = TCSETS; + break; + case TCSADRAIN: + cmd = TCSETSW; + break; + case TCSAFLUSH: + cmd = TCSETSF; + break; + default: + errno = EINVAL; + return -1; } - return ioctl(fd,cmd,termios_p); + return ioctl(fd,cmd,termios_p); } + + +pid_t +tcgetpgrp(int fd) +{ + int p; + + if (ioctl(fd,TIOCGPGRP,&p) < 0) + return (pid_t)-1; + return (pid_t)p; +} + + +int +tcsetpgrp(int fd, pid_t pid) +{ + int p = (int)pid; + return ioctl(fd,TIOCSPGRP,&p); +} + +int +tcflow (int fd, int action) +{ + return ioctl (fd, TCXONC, action); +} + +int +tcflush (int fd, int queue_selector) +{ + return ioctl (fd, TCFLSH, queue_selector); +} +