xref: /csrg-svn/sbin/slattach/slattach.c (revision 65571)
134915Sbostic /*
261550Sbostic  * Copyright (c) 1988, 1993
361550Sbostic  *	The Regents of the University of California.  All rights reserved.
434915Sbostic  *
534915Sbostic  * This code is derived from software contributed to Berkeley by
634915Sbostic  * Rick Adams.
734915Sbostic  *
842712Sbostic  * %sccs.include.redist.c%
934915Sbostic  */
1034915Sbostic 
1126211Skarels #ifndef lint
1261550Sbostic static char copyright[] =
1361550Sbostic "@(#) Copyright (c) 1988, 1993\n\
1461550Sbostic 	The Regents of the University of California.  All rights reserved.\n";
1534915Sbostic #endif /* not lint */
1634915Sbostic 
1734915Sbostic #ifndef lint
18*65571Sbostic static char sccsid[] = "@(#)slattach.c	8.2 (Berkeley) 01/07/94";
1934915Sbostic #endif /* not lint */
2034915Sbostic 
2126211Skarels #include <sys/param.h>
2226206Skarels #include <sgtty.h>
2326206Skarels #include <sys/socket.h>
2426206Skarels #include <netinet/in.h>
2526206Skarels #include <net/if.h>
2626206Skarels #include <netdb.h>
2726206Skarels #include <fcntl.h>
2837467Sbostic #include <stdio.h>
2937690Sbostic #include <paths.h>
3026206Skarels 
3126206Skarels #define DEFAULT_BAUD	9600
3226206Skarels int	slipdisc = SLIPDISC;
3326206Skarels 
3426206Skarels char	devname[32];
3526211Skarels char	hostname[MAXHOSTNAMELEN];
3626206Skarels 
main(argc,argv)3726206Skarels main(argc, argv)
3826206Skarels 	int argc;
3926206Skarels 	char *argv[];
4026206Skarels {
4126206Skarels 	register int fd;
4226206Skarels 	register char *dev = argv[1];
4326206Skarels 	struct sgttyb sgtty;
4431988Sbostic 	int	speed;
4526206Skarels 
4626211Skarels 	if (argc < 2 || argc > 3) {
4726211Skarels 		fprintf(stderr, "usage: %s ttyname [baudrate]\n", argv[0]);
4826211Skarels 		exit(1);
4926211Skarels 	}
5026211Skarels 	speed = argc == 3 ? findspeed(atoi(argv[2])) : findspeed(DEFAULT_BAUD);
5126211Skarels 	if (speed == 0) {
5226211Skarels 		fprintf(stderr, "unknown speed %s", argv[2]);
5326211Skarels 		exit(1);
5426211Skarels 	}
5537467Sbostic 	if (strncmp(_PATH_DEV, dev, sizeof(_PATH_DEV) - 1)) {
56*65571Sbostic 		(void)snprintf(devname, sizeof(devname),
57*65571Sbostic 		    "%s%s", _PATH_DEV, dev);
5826206Skarels 		dev = devname;
5926206Skarels 	}
6026211Skarels 	if ((fd = open(dev, O_RDWR | O_NDELAY)) < 0) {
6126211Skarels 		perror(dev);
6226211Skarels 		exit(1);
6326211Skarels 	}
6426206Skarels 	sgtty.sg_flags = RAW | ANYP;
6526206Skarels 	sgtty.sg_ispeed = sgtty.sg_ospeed = speed;
6626211Skarels 	if (ioctl(fd, TIOCSETP, &sgtty) < 0) {
6726211Skarels 		perror("ioctl(TIOCSETP)");
6826211Skarels 		exit(1);
6926211Skarels 	}
7026211Skarels 	if (ioctl(fd, TIOCSETD, &slipdisc) < 0) {
7126211Skarels 		perror("ioctl(TIOCSETD)");
7226211Skarels 		exit(1);
7326211Skarels 	}
7426206Skarels 
7526211Skarels 	if (fork() > 0)
7626211Skarels 		exit(0);
7726206Skarels 	for (;;)
7831988Sbostic 		sigpause(0L);
7926206Skarels }
8026206Skarels 
8126206Skarels struct sg_spds {
8226206Skarels 	int sp_val, sp_name;
8326206Skarels }       spds[] = {
8426206Skarels #ifdef B50
8526206Skarels 	{ 50, B50 },
8626206Skarels #endif
8726206Skarels #ifdef B75
8826206Skarels 	{ 75, B75 },
8926206Skarels #endif
9026206Skarels #ifdef B110
9126206Skarels 	{ 110, B110 },
9226206Skarels #endif
9326206Skarels #ifdef B150
9426206Skarels 	{ 150, B150 },
9526206Skarels #endif
9626206Skarels #ifdef B200
9726206Skarels 	{ 200, B200 },
9826206Skarels #endif
9926206Skarels #ifdef B300
10026206Skarels 	{ 300, B300 },
10126206Skarels #endif
10226206Skarels #ifdef B600
10326206Skarels 	{ 600, B600 },
10426206Skarels #endif
10526206Skarels #ifdef B1200
10626206Skarels 	{ 1200, B1200 },
10726206Skarels #endif
10826206Skarels #ifdef B1800
10926206Skarels 	{ 1800, B1800 },
11026206Skarels #endif
11126206Skarels #ifdef B2000
11226206Skarels 	{ 2000, B2000 },
11326206Skarels #endif
11426206Skarels #ifdef B2400
11526206Skarels 	{ 2400, B2400 },
11626206Skarels #endif
11726206Skarels #ifdef B3600
11826206Skarels 	{ 3600, B3600 },
11926206Skarels #endif
12026206Skarels #ifdef B4800
12126206Skarels 	{ 4800, B4800 },
12226206Skarels #endif
12326206Skarels #ifdef B7200
12426206Skarels 	{ 7200, B7200 },
12526206Skarels #endif
12626206Skarels #ifdef B9600
12726206Skarels 	{ 9600, B9600 },
12826206Skarels #endif
12926206Skarels #ifdef EXTA
13026206Skarels 	{ 19200, EXTA },
13126206Skarels #endif
13226206Skarels #ifdef EXTB
13326206Skarels 	{ 38400, EXTB },
13426206Skarels #endif
13526206Skarels 	{ 0, 0 }
13626206Skarels };
13726206Skarels 
findspeed(speed)13826206Skarels findspeed(speed)
13926206Skarels 	register int speed;
14026206Skarels {
14126206Skarels 	register struct sg_spds *sp;
14226206Skarels 
14326206Skarels 	sp = spds;
14426206Skarels 	while (sp->sp_val && sp->sp_val != speed)
14526206Skarels 		sp++;
14626206Skarels 	return (sp->sp_name);
14726206Skarels }
148