slattach.c revision 1.7
11.1Scgd/* 21.1Scgd * Copyright (c) 1988 Regents of the University of California. 31.1Scgd * All rights reserved. 41.1Scgd * 51.1Scgd * This code is derived from software contributed to Berkeley by 61.1Scgd * Rick Adams. 71.1Scgd * 81.1Scgd * Redistribution and use in source and binary forms, with or without 91.1Scgd * modification, are permitted provided that the following conditions 101.1Scgd * are met: 111.1Scgd * 1. Redistributions of source code must retain the above copyright 121.1Scgd * notice, this list of conditions and the following disclaimer. 131.1Scgd * 2. Redistributions in binary form must reproduce the above copyright 141.1Scgd * notice, this list of conditions and the following disclaimer in the 151.1Scgd * documentation and/or other materials provided with the distribution. 161.1Scgd * 3. All advertising materials mentioning features or use of this software 171.1Scgd * must display the following acknowledgement: 181.1Scgd * This product includes software developed by the University of 191.1Scgd * California, Berkeley and its contributors. 201.1Scgd * 4. Neither the name of the University nor the names of its contributors 211.1Scgd * may be used to endorse or promote products derived from this software 221.1Scgd * without specific prior written permission. 231.1Scgd * 241.1Scgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 251.1Scgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 261.1Scgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 271.1Scgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 281.1Scgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 291.1Scgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 301.1Scgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 311.1Scgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 321.1Scgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 331.1Scgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 341.1Scgd * SUCH DAMAGE. 351.1Scgd */ 361.1Scgd 371.4Scgd/* 381.4Scgd** Hacks to support "-a|c|n" flags on the command line which enalbe VJ 391.4Scgd** header compresion and disable ICMP. I use getopt to deal witht that 401.4Scgd** stuff because I'm a lazy sob, I can't spell, and that's OK. 411.4Scgd** 421.4Scgd** If this is good all rights go to B & L Jolitz, otherwise send your 431.4Scgd** comments to Reagan (/dev/null). 441.4Scgd** 451.4Scgd** nerd@percival.rain.com (Michael Galassi) 92.09.03 461.4Scgd** 471.4Scgd** Hacked to change from sgtty to POSIX termio style serial line control 481.4Scgd** and added flag to enable cts/rts style flow control. 491.4Scgd** 501.4Scgd** blymn@awadi.com.au (Brett Lymn) 93.04.04 511.4Scgd*/ 521.4Scgd 531.1Scgd#ifndef lint 541.1Scgdchar copyright[] = 551.1Scgd"@(#) Copyright (c) 1988 Regents of the University of California.\n\ 561.1Scgd All rights reserved.\n"; 571.1Scgd#endif /* not lint */ 581.1Scgd 591.1Scgd#ifndef lint 601.7Smycroft/*static char sccsid[] = "from: @(#)slattach.c 4.6 (Berkeley) 6/1/90";*/ 611.7Smycroftstatic char rcsid[] = "$Id: slattach.c,v 1.7 1993/08/01 18:23:56 mycroft Exp $"; 621.1Scgd#endif /* not lint */ 631.1Scgd 641.1Scgd#include <sys/param.h> 651.4Scgd#include <sys/ioctl.h> 661.4Scgd#include <termios.h> 671.1Scgd#include <sys/socket.h> 681.1Scgd#include <netinet/in.h> 691.1Scgd#include <net/if.h> 701.4Scgd#include <net/if_slvar.h> 711.1Scgd#include <netdb.h> 721.1Scgd#include <fcntl.h> 731.1Scgd#include <stdio.h> 741.1Scgd#include <paths.h> 751.1Scgd 761.1Scgd#define DEFAULT_BAUD 9600 771.1Scgd 781.4Scgdstatic char usage_str[] = "\ 791.4Scgdusage: %s [-a ][-c ][-n ][-s <speed> ]<device>\n\ 801.4Scgd -a -- autoenable VJ compression\n\ 811.4Scgd -c -- enable VJ compression\n\ 821.4Scgd -n -- throw out ICMP packets\n\ 831.4Scgd -h -- turn on cts/rts style flow control\n\ 841.4Scgd -s -- baud rate (default 9600)\n"; 851.1Scgd 861.4Scgdint main(int argc, char **argv) 871.1Scgd{ 881.4Scgd struct termios tty; 891.4Scgd int option; 901.4Scgd int fd; 911.4Scgd char devname[32]; 921.4Scgd char *dev = (char *)0; 931.4Scgd int slipdisc = SLIPDISC; 941.4Scgd int speed = DEFAULT_BAUD; 951.4Scgd int slflags = 0; 961.4Scgd int flow_control = 0; /* extra flags to enable hardware flow cont. */ 971.4Scgd 981.4Scgd extern char *optarg; 991.4Scgd extern int optind; 1001.4Scgd 1011.4Scgd while ((option = getopt(argc, argv, "achns:")) != EOF) { 1021.4Scgd switch (option) { 1031.4Scgd case 'a': 1041.4Scgd slflags |= SC_AUTOCOMP; 1051.4Scgd slflags &= ~SC_COMPRESS; 1061.4Scgd break; 1071.4Scgd case 'c': 1081.4Scgd slflags |= SC_COMPRESS; 1091.4Scgd slflags &= ~SC_AUTOCOMP; 1101.4Scgd break; 1111.4Scgd case 'h': 1121.4Scgd flow_control |= CRTSCTS; 1131.4Scgd break; 1141.4Scgd case 'n': 1151.4Scgd slflags |= SC_NOICMP; 1161.4Scgd break; 1171.4Scgd case 's': 1181.4Scgd speed = atoi(optarg); 1191.4Scgd break; 1201.4Scgd case '?': 1211.4Scgd default: 1221.4Scgd fprintf(stderr, usage_str, argv[0]); 1231.4Scgd exit(1); 1241.4Scgd } 1251.4Scgd } 1261.4Scgd 1271.4Scgd if (optind == argc - 1) 1281.4Scgd dev = argv[optind]; 1291.4Scgd 1301.4Scgd 1311.4Scgd if (dev == (char *)0) { 1321.4Scgd fprintf(stderr, usage_str, argv[0]); 1331.4Scgd exit(2); 1341.1Scgd } 1351.4Scgd 1361.4Scgd if ((speed = findspeed(speed)) == 0) { 1371.4Scgd fprintf(stderr, "unknown speed"); 1381.1Scgd exit(1); 1391.1Scgd } 1401.4Scgd 1411.1Scgd if (strncmp(_PATH_DEV, dev, sizeof(_PATH_DEV) - 1)) { 1421.4Scgd strcpy(devname, _PATH_DEV); 1431.4Scgd strcat(devname, "/"); 1441.4Scgd strncat(devname, dev, 10); 1451.1Scgd dev = devname; 1461.1Scgd } 1471.4Scgd 1481.1Scgd if ((fd = open(dev, O_RDWR | O_NDELAY)) < 0) { 1491.1Scgd perror(dev); 1501.1Scgd exit(1); 1511.1Scgd } 1521.4Scgd 1531.4Scgd tty.c_iflag = 0; 1541.4Scgd tty.c_oflag = 0; 1551.4Scgd tty.c_cflag = CREAD | CS8 | flow_control; 1561.4Scgd tty.c_lflag = 0; 1571.4Scgd tty.c_cc[VMIN] = 1; /* wait for one char */ 1581.4Scgd tty.c_cc[VTIME] = 0; /* wait forever for a char */ 1591.4Scgd if (ioctl(fd, TIOCSETA, &tty) < 0) { 1601.4Scgd perror("ioctl(TIOCSETA)"); 1611.4Scgd close(fd); 1621.4Scgd exit(1); 1631.4Scgd } 1641.5Scgd 1651.5Scgd if (ioctl(fd, TIOCSDTR) < 0) { 1661.5Scgd perror("ioctl(TIOCSDTR)"); 1671.5Scgd close(fd); 1681.5Scgd exit(1); 1691.5Scgd } 1701.4Scgd 1711.4Scgd cfsetispeed(&tty, speed); 1721.4Scgd cfsetospeed(&tty, speed); 1731.4Scgd if (tcsetattr(fd, TCSADRAIN, &tty) < 0) { 1741.4Scgd perror("tcsetattr"); 1751.4Scgd close(fd); 1761.1Scgd exit(1); 1771.1Scgd } 1781.4Scgd 1791.1Scgd if (ioctl(fd, TIOCSETD, &slipdisc) < 0) { 1801.1Scgd perror("ioctl(TIOCSETD)"); 1811.4Scgd close(fd); 1821.4Scgd exit(1); 1831.4Scgd } 1841.4Scgd 1851.4Scgd if (ioctl(fd, SLIOCSFLAGS, &slflags) < 0) { 1861.4Scgd perror("ioctl(SLIOCSFLAGS)"); 1871.4Scgd close(fd); 1881.1Scgd exit(1); 1891.1Scgd } 1901.1Scgd 1911.1Scgd if (fork() > 0) 1921.1Scgd exit(0); 1931.4Scgd 1941.1Scgd for (;;) 1951.1Scgd sigpause(0L); 1961.1Scgd} 1971.1Scgd 1981.1Scgdstruct sg_spds { 1991.1Scgd int sp_val, sp_name; 2001.1Scgd} spds[] = { 2011.1Scgd#ifdef B50 2021.1Scgd { 50, B50 }, 2031.1Scgd#endif 2041.1Scgd#ifdef B75 2051.1Scgd { 75, B75 }, 2061.1Scgd#endif 2071.1Scgd#ifdef B110 2081.1Scgd { 110, B110 }, 2091.1Scgd#endif 2101.1Scgd#ifdef B150 2111.1Scgd { 150, B150 }, 2121.1Scgd#endif 2131.1Scgd#ifdef B200 2141.1Scgd { 200, B200 }, 2151.1Scgd#endif 2161.1Scgd#ifdef B300 2171.1Scgd { 300, B300 }, 2181.1Scgd#endif 2191.1Scgd#ifdef B600 2201.1Scgd { 600, B600 }, 2211.1Scgd#endif 2221.1Scgd#ifdef B1200 2231.1Scgd { 1200, B1200 }, 2241.1Scgd#endif 2251.1Scgd#ifdef B1800 2261.1Scgd { 1800, B1800 }, 2271.1Scgd#endif 2281.1Scgd#ifdef B2000 2291.1Scgd { 2000, B2000 }, 2301.1Scgd#endif 2311.1Scgd#ifdef B2400 2321.1Scgd { 2400, B2400 }, 2331.1Scgd#endif 2341.1Scgd#ifdef B3600 2351.1Scgd { 3600, B3600 }, 2361.1Scgd#endif 2371.1Scgd#ifdef B4800 2381.1Scgd { 4800, B4800 }, 2391.1Scgd#endif 2401.1Scgd#ifdef B7200 2411.1Scgd { 7200, B7200 }, 2421.1Scgd#endif 2431.1Scgd#ifdef B9600 2441.1Scgd { 9600, B9600 }, 2451.1Scgd#endif 2461.6Sbrezak#ifdef B19200 2471.6Sbrezak { 19200, B19200 }, 2481.1Scgd#endif 2491.6Sbrezak#ifdef B38400 2501.6Sbrezak { 38400, B38400 }, 2511.6Sbrezak#endif 2521.6Sbrezak#ifdef B57600 2531.6Sbrezak { 57600, B57600 }, 2541.6Sbrezak#endif 2551.6Sbrezak#ifdef B115200 2561.6Sbrezak { 115200, B115200 }, 2571.1Scgd#endif 2581.1Scgd { 0, 0 } 2591.1Scgd}; 2601.1Scgd 2611.4Scgdint findspeed(int speed) 2621.1Scgd{ 2631.4Scgd struct sg_spds *sp = spds; 2641.1Scgd 2651.4Scgd while ((sp->sp_val != 0) && (sp->sp_val != speed)) 2661.1Scgd sp++; 2671.4Scgd 2681.1Scgd return (sp->sp_name); 2691.1Scgd} 270