From 87b0aa552a018447132ffa4d72cf90844d0e6c87 Mon Sep 17 00:00:00 2001 From: bg- Date: Wed, 2 Aug 2006 14:41:30 +0000 Subject: [PATCH] Read error messages from device file and print to stdout. --- tools/scat.c | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 tools/scat.c diff --git a/tools/scat.c b/tools/scat.c new file mode 100644 index 000000000..219eac1ea --- /dev/null +++ b/tools/scat.c @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $Id: scat.c,v 1.1 2006/08/02 14:41:30 bg- Exp $ + * + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#define SLIP_END 0300 +#define SLIP_ESC 0333 +#define SLIP_ESC_END 0334 +#define SLIP_ESC_ESC 0335 + +#define BAUDRATE B57600 +//#define BAUDRATE B38400 +//#define BAUDRATE B19200 + +void +stty_telos(int fd) +{ + struct termios tty; + speed_t speed = BAUDRATE; + int i; + + if(tcflush(fd, TCIOFLUSH) == -1) err(1, "tcflush"); + + if(tcgetattr(fd, &tty) == -1) err(1, "tcgetattr"); + + cfmakeraw(&tty); + + /* Nonblocking read. */ + tty.c_cc[VTIME] = 0; + tty.c_cc[VMIN] = 0; + tty.c_cflag &= ~CRTSCTS; + tty.c_cflag &= ~HUPCL; + tty.c_cflag &= ~CLOCAL; + + cfsetispeed(&tty, speed); + cfsetospeed(&tty, speed); + + if(tcsetattr(fd, TCSAFLUSH, &tty) == -1) err(1, "tcsetattr"); + +#if 1 + /* Nonblocking read and write. */ + /* if(fcntl(fd, F_SETFL, O_NONBLOCK) == -1) err(1, "fcntl"); */ + + tty.c_cflag |= CLOCAL; + if(tcsetattr(fd, TCSAFLUSH, &tty) == -1) err(1, "tcsetattr"); + + i = TIOCM_DTR; + if(ioctl(fd, TIOCMBIS, &i) == -1) err(1, "ioctl"); +#endif + + usleep(10*1000); /* Wait for hardware 10ms. */ + + /* Flush input and output buffers. */ + if(tcflush(fd, TCIOFLUSH) == -1) err(1, "tcflush"); +} + +int +main(int argc, char **argv) +{ + int slipfd; + int ret; + FILE *inslip; + const char *siodev; + int c; + + if (argc != 2) + err(1, "usage: scat device-file"); + siodev = argv[1]; + + slipfd = open(siodev, O_RDWR | O_NONBLOCK); + if (slipfd == -1) err(1, "can't open '%s'", siodev); + stty_telos(slipfd); + inslip = fdopen(slipfd, "r"); + if(inslip == NULL) err(1, "main: fdopen"); + + do { + fd_set rset; + + FD_ZERO(&rset); + FD_SET(slipfd, &rset); + + ret = select(slipfd + 1, &rset, NULL, NULL, NULL); + if (FD_ISSET(slipfd, &rset)) { + while ((c = getc(inslip)) != -1) + if (c != SLIP_END) + putchar(c); + } + clearerr(inslip); + } while (1); + + return 0; +}