xref: /csrg-svn/sbin/slattach/slattach.c (revision 37690)
134915Sbostic /*
234915Sbostic  * Copyright (c) 1988 Regents of the University of California.
334915Sbostic  * All rights reserved.
434915Sbostic  *
534915Sbostic  * This code is derived from software contributed to Berkeley by
634915Sbostic  * Rick Adams.
734915Sbostic  *
834915Sbostic  * Redistribution and use in source and binary forms are permitted
934915Sbostic  * provided that the above copyright notice and this paragraph are
1034915Sbostic  * duplicated in all such forms and that any documentation,
1134915Sbostic  * advertising materials, and other materials related to such
1234915Sbostic  * distribution and use acknowledge that the software was developed
1334915Sbostic  * by the University of California, Berkeley.  The name of the
1434915Sbostic  * University may not be used to endorse or promote products derived
1534915Sbostic  * from this software without specific prior written permission.
1634915Sbostic  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
1734915Sbostic  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
1834915Sbostic  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
1934915Sbostic  */
2034915Sbostic 
2126211Skarels #ifndef lint
2234915Sbostic char copyright[] =
2334915Sbostic "@(#) Copyright (c) 1988 Regents of the University of California.\n\
2434915Sbostic  All rights reserved.\n";
2534915Sbostic #endif /* not lint */
2634915Sbostic 
2734915Sbostic #ifndef lint
28*37690Sbostic static char sccsid[] = "@(#)slattach.c	4.5 (Berkeley) 05/08/89";
2934915Sbostic #endif /* not lint */
3034915Sbostic 
3126211Skarels #include <sys/param.h>
3226206Skarels #include <sgtty.h>
3326206Skarels #include <sys/socket.h>
3426206Skarels #include <netinet/in.h>
3526206Skarels #include <net/if.h>
3626206Skarels #include <netdb.h>
3726206Skarels #include <fcntl.h>
3837467Sbostic #include <stdio.h>
39*37690Sbostic #include <paths.h>
4026206Skarels 
4126206Skarels #define DEFAULT_BAUD	9600
4226206Skarels int	slipdisc = SLIPDISC;
4326206Skarels 
4426206Skarels char	devname[32];
4526211Skarels char	hostname[MAXHOSTNAMELEN];
4626206Skarels 
4726206Skarels main(argc, argv)
4826206Skarels 	int argc;
4926206Skarels 	char *argv[];
5026206Skarels {
5126206Skarels 	register int fd;
5226206Skarels 	register char *dev = argv[1];
5326206Skarels 	struct sgttyb sgtty;
5431988Sbostic 	int	speed;
5526206Skarels 
5626211Skarels 	if (argc < 2 || argc > 3) {
5726211Skarels 		fprintf(stderr, "usage: %s ttyname [baudrate]\n", argv[0]);
5826211Skarels 		exit(1);
5926211Skarels 	}
6026211Skarels 	speed = argc == 3 ? findspeed(atoi(argv[2])) : findspeed(DEFAULT_BAUD);
6126211Skarels 	if (speed == 0) {
6226211Skarels 		fprintf(stderr, "unknown speed %s", argv[2]);
6326211Skarels 		exit(1);
6426211Skarels 	}
6537467Sbostic 	if (strncmp(_PATH_DEV, dev, sizeof(_PATH_DEV) - 1)) {
6637467Sbostic 		(void)sprintf(devname, "%s/%s", _PATH_DEV, dev);
6726206Skarels 		dev = devname;
6826206Skarels 	}
6926211Skarels 	if ((fd = open(dev, O_RDWR | O_NDELAY)) < 0) {
7026211Skarels 		perror(dev);
7126211Skarels 		exit(1);
7226211Skarels 	}
7326206Skarels 	sgtty.sg_flags = RAW | ANYP;
7426206Skarels 	sgtty.sg_ispeed = sgtty.sg_ospeed = speed;
7526211Skarels 	if (ioctl(fd, TIOCSETP, &sgtty) < 0) {
7626211Skarels 		perror("ioctl(TIOCSETP)");
7726211Skarels 		exit(1);
7826211Skarels 	}
7926211Skarels 	if (ioctl(fd, TIOCSETD, &slipdisc) < 0) {
8026211Skarels 		perror("ioctl(TIOCSETD)");
8126211Skarels 		exit(1);
8226211Skarels 	}
8326206Skarels 
8426211Skarels 	if (fork() > 0)
8526211Skarels 		exit(0);
8626206Skarels 	for (;;)
8731988Sbostic 		sigpause(0L);
8826206Skarels }
8926206Skarels 
9026206Skarels struct sg_spds {
9126206Skarels 	int sp_val, sp_name;
9226206Skarels }       spds[] = {
9326206Skarels #ifdef B50
9426206Skarels 	{ 50, B50 },
9526206Skarels #endif
9626206Skarels #ifdef B75
9726206Skarels 	{ 75, B75 },
9826206Skarels #endif
9926206Skarels #ifdef B110
10026206Skarels 	{ 110, B110 },
10126206Skarels #endif
10226206Skarels #ifdef B150
10326206Skarels 	{ 150, B150 },
10426206Skarels #endif
10526206Skarels #ifdef B200
10626206Skarels 	{ 200, B200 },
10726206Skarels #endif
10826206Skarels #ifdef B300
10926206Skarels 	{ 300, B300 },
11026206Skarels #endif
11126206Skarels #ifdef B600
11226206Skarels 	{ 600, B600 },
11326206Skarels #endif
11426206Skarels #ifdef B1200
11526206Skarels 	{ 1200, B1200 },
11626206Skarels #endif
11726206Skarels #ifdef B1800
11826206Skarels 	{ 1800, B1800 },
11926206Skarels #endif
12026206Skarels #ifdef B2000
12126206Skarels 	{ 2000, B2000 },
12226206Skarels #endif
12326206Skarels #ifdef B2400
12426206Skarels 	{ 2400, B2400 },
12526206Skarels #endif
12626206Skarels #ifdef B3600
12726206Skarels 	{ 3600, B3600 },
12826206Skarels #endif
12926206Skarels #ifdef B4800
13026206Skarels 	{ 4800, B4800 },
13126206Skarels #endif
13226206Skarels #ifdef B7200
13326206Skarels 	{ 7200, B7200 },
13426206Skarels #endif
13526206Skarels #ifdef B9600
13626206Skarels 	{ 9600, B9600 },
13726206Skarels #endif
13826206Skarels #ifdef EXTA
13926206Skarels 	{ 19200, EXTA },
14026206Skarels #endif
14126206Skarels #ifdef EXTB
14226206Skarels 	{ 38400, EXTB },
14326206Skarels #endif
14426206Skarels 	{ 0, 0 }
14526206Skarels };
14626206Skarels 
14726206Skarels findspeed(speed)
14826206Skarels 	register int speed;
14926206Skarels {
15026206Skarels 	register struct sg_spds *sp;
15126206Skarels 
15226206Skarels 	sp = spds;
15326206Skarels 	while (sp->sp_val && sp->sp_val != speed)
15426206Skarels 		sp++;
15526206Skarels 	return (sp->sp_name);
15626206Skarels }
157