xref: /csrg-svn/sbin/slattach/slattach.c (revision 34915)
1*34915Sbostic /*
2*34915Sbostic  * Copyright (c) 1988 Regents of the University of California.
3*34915Sbostic  * All rights reserved.
4*34915Sbostic  *
5*34915Sbostic  * This code is derived from software contributed to Berkeley by
6*34915Sbostic  * Rick Adams.
7*34915Sbostic  *
8*34915Sbostic  * Redistribution and use in source and binary forms are permitted
9*34915Sbostic  * provided that the above copyright notice and this paragraph are
10*34915Sbostic  * duplicated in all such forms and that any documentation,
11*34915Sbostic  * advertising materials, and other materials related to such
12*34915Sbostic  * distribution and use acknowledge that the software was developed
13*34915Sbostic  * by the University of California, Berkeley.  The name of the
14*34915Sbostic  * University may not be used to endorse or promote products derived
15*34915Sbostic  * from this software without specific prior written permission.
16*34915Sbostic  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
17*34915Sbostic  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
18*34915Sbostic  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19*34915Sbostic  */
20*34915Sbostic 
2126211Skarels #ifndef lint
22*34915Sbostic char copyright[] =
23*34915Sbostic "@(#) Copyright (c) 1988 Regents of the University of California.\n\
24*34915Sbostic  All rights reserved.\n";
25*34915Sbostic #endif /* not lint */
26*34915Sbostic 
27*34915Sbostic #ifndef lint
28*34915Sbostic static char sccsid[] = "@(#)slattach.c	4.3 (Berkeley) 06/30/88";
29*34915Sbostic #endif /* not lint */
30*34915Sbostic 
3126206Skarels #include <stdio.h>
3226211Skarels #include <sys/param.h>
3326206Skarels #include <sgtty.h>
3426206Skarels #include <sys/socket.h>
3526206Skarels #include <netinet/in.h>
3626206Skarels #include <net/if.h>
3726206Skarels #include <netdb.h>
3826206Skarels #include <fcntl.h>
3926206Skarels 
4026206Skarels #define DEFAULT_BAUD	9600
4126206Skarels int	slipdisc = SLIPDISC;
4226206Skarels 
4326206Skarels char	devname[32];
4426211Skarels char	hostname[MAXHOSTNAMELEN];
4526206Skarels 
4626206Skarels main(argc, argv)
4726206Skarels 	int argc;
4826206Skarels 	char *argv[];
4926206Skarels {
5026206Skarels 	register int fd;
5126206Skarels 	register char *dev = argv[1];
5226206Skarels 	struct sgttyb sgtty;
5331988Sbostic 	int	speed;
5426206Skarels 
5526211Skarels 	if (argc < 2 || argc > 3) {
5626211Skarels 		fprintf(stderr, "usage: %s ttyname [baudrate]\n", argv[0]);
5726211Skarels 		exit(1);
5826211Skarels 	}
5926211Skarels 	speed = argc == 3 ? findspeed(atoi(argv[2])) : findspeed(DEFAULT_BAUD);
6026211Skarels 	if (speed == 0) {
6126211Skarels 		fprintf(stderr, "unknown speed %s", argv[2]);
6226211Skarels 		exit(1);
6326211Skarels 	}
6426206Skarels 	if (strncmp("/dev/", dev, 5)) {
6531988Sbostic 		(void)sprintf(devname, "/dev/%s", dev);
6626206Skarels 		dev = devname;
6726206Skarels 	}
6826211Skarels 	if ((fd = open(dev, O_RDWR | O_NDELAY)) < 0) {
6926211Skarels 		perror(dev);
7026211Skarels 		exit(1);
7126211Skarels 	}
7226206Skarels 	sgtty.sg_flags = RAW | ANYP;
7326206Skarels 	sgtty.sg_ispeed = sgtty.sg_ospeed = speed;
7426211Skarels 	if (ioctl(fd, TIOCSETP, &sgtty) < 0) {
7526211Skarels 		perror("ioctl(TIOCSETP)");
7626211Skarels 		exit(1);
7726211Skarels 	}
7826211Skarels 	if (ioctl(fd, TIOCSETD, &slipdisc) < 0) {
7926211Skarels 		perror("ioctl(TIOCSETD)");
8026211Skarels 		exit(1);
8126211Skarels 	}
8226206Skarels 
8326211Skarels 	if (fork() > 0)
8426211Skarels 		exit(0);
8526206Skarels 	for (;;)
8631988Sbostic 		sigpause(0L);
8726206Skarels }
8826206Skarels 
8926206Skarels struct sg_spds {
9026206Skarels 	int sp_val, sp_name;
9126206Skarels }       spds[] = {
9226206Skarels #ifdef B50
9326206Skarels 	{ 50, B50 },
9426206Skarels #endif
9526206Skarels #ifdef B75
9626206Skarels 	{ 75, B75 },
9726206Skarels #endif
9826206Skarels #ifdef B110
9926206Skarels 	{ 110, B110 },
10026206Skarels #endif
10126206Skarels #ifdef B150
10226206Skarels 	{ 150, B150 },
10326206Skarels #endif
10426206Skarels #ifdef B200
10526206Skarels 	{ 200, B200 },
10626206Skarels #endif
10726206Skarels #ifdef B300
10826206Skarels 	{ 300, B300 },
10926206Skarels #endif
11026206Skarels #ifdef B600
11126206Skarels 	{ 600, B600 },
11226206Skarels #endif
11326206Skarels #ifdef B1200
11426206Skarels 	{ 1200, B1200 },
11526206Skarels #endif
11626206Skarels #ifdef B1800
11726206Skarels 	{ 1800, B1800 },
11826206Skarels #endif
11926206Skarels #ifdef B2000
12026206Skarels 	{ 2000, B2000 },
12126206Skarels #endif
12226206Skarels #ifdef B2400
12326206Skarels 	{ 2400, B2400 },
12426206Skarels #endif
12526206Skarels #ifdef B3600
12626206Skarels 	{ 3600, B3600 },
12726206Skarels #endif
12826206Skarels #ifdef B4800
12926206Skarels 	{ 4800, B4800 },
13026206Skarels #endif
13126206Skarels #ifdef B7200
13226206Skarels 	{ 7200, B7200 },
13326206Skarels #endif
13426206Skarels #ifdef B9600
13526206Skarels 	{ 9600, B9600 },
13626206Skarels #endif
13726206Skarels #ifdef EXTA
13826206Skarels 	{ 19200, EXTA },
13926206Skarels #endif
14026206Skarels #ifdef EXTB
14126206Skarels 	{ 38400, EXTB },
14226206Skarels #endif
14326206Skarels 	{ 0, 0 }
14426206Skarels };
14526206Skarels 
14626206Skarels findspeed(speed)
14726206Skarels 	register int speed;
14826206Skarels {
14926206Skarels 	register struct sg_spds *sp;
15026206Skarels 
15126206Skarels 	sp = spds;
15226206Skarels 	while (sp->sp_val && sp->sp_val != speed)
15326206Skarels 		sp++;
15426206Skarels 	return (sp->sp_name);
15526206Skarels }
156