xref: /original-bsd/sbin/slattach/slattach.c (revision 333da485)
1 /*
2  * Copyright (c) 1988, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * This code is derived from software contributed to Berkeley by
6  * Rick Adams.
7  *
8  * %sccs.include.redist.c%
9  */
10 
11 #ifndef lint
12 static char copyright[] =
13 "@(#) Copyright (c) 1988, 1993\n\
14 	The Regents of the University of California.  All rights reserved.\n";
15 #endif /* not lint */
16 
17 #ifndef lint
18 static char sccsid[] = "@(#)slattach.c	8.2 (Berkeley) 01/07/94";
19 #endif /* not lint */
20 
21 #include <sys/param.h>
22 #include <sgtty.h>
23 #include <sys/socket.h>
24 #include <netinet/in.h>
25 #include <net/if.h>
26 #include <netdb.h>
27 #include <fcntl.h>
28 #include <stdio.h>
29 #include <paths.h>
30 
31 #define DEFAULT_BAUD	9600
32 int	slipdisc = SLIPDISC;
33 
34 char	devname[32];
35 char	hostname[MAXHOSTNAMELEN];
36 
37 main(argc, argv)
38 	int argc;
39 	char *argv[];
40 {
41 	register int fd;
42 	register char *dev = argv[1];
43 	struct sgttyb sgtty;
44 	int	speed;
45 
46 	if (argc < 2 || argc > 3) {
47 		fprintf(stderr, "usage: %s ttyname [baudrate]\n", argv[0]);
48 		exit(1);
49 	}
50 	speed = argc == 3 ? findspeed(atoi(argv[2])) : findspeed(DEFAULT_BAUD);
51 	if (speed == 0) {
52 		fprintf(stderr, "unknown speed %s", argv[2]);
53 		exit(1);
54 	}
55 	if (strncmp(_PATH_DEV, dev, sizeof(_PATH_DEV) - 1)) {
56 		(void)snprintf(devname, sizeof(devname),
57 		    "%s%s", _PATH_DEV, dev);
58 		dev = devname;
59 	}
60 	if ((fd = open(dev, O_RDWR | O_NDELAY)) < 0) {
61 		perror(dev);
62 		exit(1);
63 	}
64 	sgtty.sg_flags = RAW | ANYP;
65 	sgtty.sg_ispeed = sgtty.sg_ospeed = speed;
66 	if (ioctl(fd, TIOCSETP, &sgtty) < 0) {
67 		perror("ioctl(TIOCSETP)");
68 		exit(1);
69 	}
70 	if (ioctl(fd, TIOCSETD, &slipdisc) < 0) {
71 		perror("ioctl(TIOCSETD)");
72 		exit(1);
73 	}
74 
75 	if (fork() > 0)
76 		exit(0);
77 	for (;;)
78 		sigpause(0L);
79 }
80 
81 struct sg_spds {
82 	int sp_val, sp_name;
83 }       spds[] = {
84 #ifdef B50
85 	{ 50, B50 },
86 #endif
87 #ifdef B75
88 	{ 75, B75 },
89 #endif
90 #ifdef B110
91 	{ 110, B110 },
92 #endif
93 #ifdef B150
94 	{ 150, B150 },
95 #endif
96 #ifdef B200
97 	{ 200, B200 },
98 #endif
99 #ifdef B300
100 	{ 300, B300 },
101 #endif
102 #ifdef B600
103 	{ 600, B600 },
104 #endif
105 #ifdef B1200
106 	{ 1200, B1200 },
107 #endif
108 #ifdef B1800
109 	{ 1800, B1800 },
110 #endif
111 #ifdef B2000
112 	{ 2000, B2000 },
113 #endif
114 #ifdef B2400
115 	{ 2400, B2400 },
116 #endif
117 #ifdef B3600
118 	{ 3600, B3600 },
119 #endif
120 #ifdef B4800
121 	{ 4800, B4800 },
122 #endif
123 #ifdef B7200
124 	{ 7200, B7200 },
125 #endif
126 #ifdef B9600
127 	{ 9600, B9600 },
128 #endif
129 #ifdef EXTA
130 	{ 19200, EXTA },
131 #endif
132 #ifdef EXTB
133 	{ 38400, EXTB },
134 #endif
135 	{ 0, 0 }
136 };
137 
138 findspeed(speed)
139 	register int speed;
140 {
141 	register struct sg_spds *sp;
142 
143 	sp = spds;
144 	while (sp->sp_val && sp->sp_val != speed)
145 		sp++;
146 	return (sp->sp_name);
147 }
148