slattach.c revision 1.7
1/*
2 * Copyright (c) 1988 Regents of the University of California.
3 * All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Rick Adams.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 *    must display the following acknowledgement:
18 *	This product includes software developed by the University of
19 *	California, Berkeley and its contributors.
20 * 4. Neither the name of the University nor the names of its contributors
21 *    may be used to endorse or promote products derived from this software
22 *    without specific prior written permission.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 */
36
37/*
38** Hacks to support "-a|c|n" flags on the command line which enalbe VJ
39** header compresion and disable ICMP.  I use getopt to deal witht that
40** stuff because I'm a lazy sob, I can't spell, and that's OK.
41**
42** If this is good all rights go to B & L Jolitz, otherwise send your
43** comments to Reagan (/dev/null).
44**
45** nerd@percival.rain.com (Michael Galassi) 92.09.03
46**
47** Hacked to change from sgtty to POSIX termio style serial line control
48** and added flag to enable cts/rts style flow control.
49**
50** blymn@awadi.com.au (Brett Lymn) 93.04.04
51*/
52
53#ifndef lint
54char copyright[] =
55"@(#) Copyright (c) 1988 Regents of the University of California.\n\
56 All rights reserved.\n";
57#endif /* not lint */
58
59#ifndef lint
60/*static char sccsid[] = "from: @(#)slattach.c	4.6 (Berkeley) 6/1/90";*/
61static char rcsid[] = "$Id: slattach.c,v 1.7 1993/08/01 18:23:56 mycroft Exp $";
62#endif /* not lint */
63
64#include <sys/param.h>
65#include <sys/ioctl.h>
66#include <termios.h>
67#include <sys/socket.h>
68#include <netinet/in.h>
69#include <net/if.h>
70#include <net/if_slvar.h>
71#include <netdb.h>
72#include <fcntl.h>
73#include <stdio.h>
74#include <paths.h>
75
76#define DEFAULT_BAUD	9600
77
78static char usage_str[] = "\
79usage: %s [-a ][-c ][-n ][-s <speed> ]<device>\n\
80	-a -- autoenable VJ compression\n\
81	-c -- enable VJ compression\n\
82	-n -- throw out ICMP packets\n\
83	-h -- turn on cts/rts style flow control\n\
84	-s -- baud rate (default 9600)\n";
85
86int main(int argc, char **argv)
87{
88	struct termios tty;
89	int option;
90	int fd;
91	char devname[32];
92	char *dev = (char *)0;
93	int slipdisc = SLIPDISC;
94	int speed = DEFAULT_BAUD;
95	int slflags = 0;
96	int flow_control = 0;	/* extra flags to enable hardware flow cont. */
97
98	extern char *optarg;
99	extern int optind;
100
101	while ((option = getopt(argc, argv, "achns:")) != EOF) {
102		switch (option) {
103		case 'a':
104			slflags |= SC_AUTOCOMP;
105			slflags &= ~SC_COMPRESS;
106			break;
107		case 'c':
108			slflags |= SC_COMPRESS;
109			slflags &= ~SC_AUTOCOMP;
110			break;
111		case 'h':
112			flow_control |= CRTSCTS;
113			break;
114		case 'n':
115			slflags |= SC_NOICMP;
116			break;
117		case 's':
118			speed = atoi(optarg);
119			break;
120		case '?':
121		default:
122			fprintf(stderr, usage_str, argv[0]);
123			exit(1);
124		}
125	}
126
127	if (optind == argc - 1)
128		dev = argv[optind];
129
130
131	if (dev == (char *)0) {
132		fprintf(stderr, usage_str, argv[0]);
133		exit(2);
134	}
135
136	if ((speed = findspeed(speed)) == 0) {
137		fprintf(stderr, "unknown speed");
138		exit(1);
139	}
140
141	if (strncmp(_PATH_DEV, dev, sizeof(_PATH_DEV) - 1)) {
142		strcpy(devname, _PATH_DEV);
143		strcat(devname, "/");
144		strncat(devname, dev, 10);
145		dev = devname;
146	}
147
148	if ((fd = open(dev, O_RDWR | O_NDELAY)) < 0) {
149		perror(dev);
150		exit(1);
151	}
152
153	tty.c_iflag = 0;
154	tty.c_oflag = 0;
155	tty.c_cflag = CREAD | CS8 | flow_control;
156	tty.c_lflag = 0;
157	tty.c_cc[VMIN] = 1; /* wait for one char */
158	tty.c_cc[VTIME] = 0; /* wait forever for a char */
159	if (ioctl(fd, TIOCSETA, &tty) < 0) {
160		perror("ioctl(TIOCSETA)");
161		close(fd);
162		exit(1);
163	}
164
165	if (ioctl(fd, TIOCSDTR) < 0) {
166                perror("ioctl(TIOCSDTR)");
167                close(fd);
168                exit(1);
169        }
170
171	cfsetispeed(&tty, speed);
172	cfsetospeed(&tty, speed);
173	if (tcsetattr(fd, TCSADRAIN, &tty) < 0) {
174		perror("tcsetattr");
175		close(fd);
176		exit(1);
177	}
178
179	if (ioctl(fd, TIOCSETD, &slipdisc) < 0) {
180		perror("ioctl(TIOCSETD)");
181		close(fd);
182		exit(1);
183	}
184
185	if (ioctl(fd, SLIOCSFLAGS, &slflags) < 0) {
186		perror("ioctl(SLIOCSFLAGS)");
187		close(fd);
188		exit(1);
189	}
190
191	if (fork() > 0)
192		exit(0);
193
194	for (;;)
195		sigpause(0L);
196}
197
198struct sg_spds {
199	int sp_val, sp_name;
200}       spds[] = {
201#ifdef B50
202	{ 50, B50 },
203#endif
204#ifdef B75
205	{ 75, B75 },
206#endif
207#ifdef B110
208	{ 110, B110 },
209#endif
210#ifdef B150
211	{ 150, B150 },
212#endif
213#ifdef B200
214	{ 200, B200 },
215#endif
216#ifdef B300
217	{ 300, B300 },
218#endif
219#ifdef B600
220	{ 600, B600 },
221#endif
222#ifdef B1200
223	{ 1200, B1200 },
224#endif
225#ifdef B1800
226	{ 1800, B1800 },
227#endif
228#ifdef B2000
229	{ 2000, B2000 },
230#endif
231#ifdef B2400
232	{ 2400, B2400 },
233#endif
234#ifdef B3600
235	{ 3600, B3600 },
236#endif
237#ifdef B4800
238	{ 4800, B4800 },
239#endif
240#ifdef B7200
241	{ 7200, B7200 },
242#endif
243#ifdef B9600
244	{ 9600, B9600 },
245#endif
246#ifdef B19200
247	{ 19200, B19200 },
248#endif
249#ifdef B38400
250	{ 38400, B38400 },
251#endif
252#ifdef B57600
253	{ 57600, B57600 },
254#endif
255#ifdef B115200
256	{ 115200, B115200 },
257#endif
258	{ 0, 0 }
259};
260
261int findspeed(int speed)
262{
263	struct sg_spds *sp = spds;
264
265	while ((sp->sp_val != 0) && (sp->sp_val != speed))
266		sp++;
267
268	return (sp->sp_name);
269}
270