xref: /original-bsd/sbin/slattach/slattach.c (revision 7211505a)
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 are permitted
9  * provided that the above copyright notice and this paragraph are
10  * duplicated in all such forms and that any documentation,
11  * advertising materials, and other materials related to such
12  * distribution and use acknowledge that the software was developed
13  * by the University of California, Berkeley.  The name of the
14  * University may not be used to endorse or promote products derived
15  * from this software without specific prior written permission.
16  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
18  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19  */
20 
21 #ifndef lint
22 char copyright[] =
23 "@(#) Copyright (c) 1988 Regents of the University of California.\n\
24  All rights reserved.\n";
25 #endif /* not lint */
26 
27 #ifndef lint
28 static char sccsid[] = "@(#)slattach.c	4.3 (Berkeley) 06/30/88";
29 #endif /* not lint */
30 
31 #include <stdio.h>
32 #include <sys/param.h>
33 #include <sgtty.h>
34 #include <sys/socket.h>
35 #include <netinet/in.h>
36 #include <net/if.h>
37 #include <netdb.h>
38 #include <fcntl.h>
39 
40 #define DEFAULT_BAUD	9600
41 int	slipdisc = SLIPDISC;
42 
43 char	devname[32];
44 char	hostname[MAXHOSTNAMELEN];
45 
46 main(argc, argv)
47 	int argc;
48 	char *argv[];
49 {
50 	register int fd;
51 	register char *dev = argv[1];
52 	struct sgttyb sgtty;
53 	int	speed;
54 
55 	if (argc < 2 || argc > 3) {
56 		fprintf(stderr, "usage: %s ttyname [baudrate]\n", argv[0]);
57 		exit(1);
58 	}
59 	speed = argc == 3 ? findspeed(atoi(argv[2])) : findspeed(DEFAULT_BAUD);
60 	if (speed == 0) {
61 		fprintf(stderr, "unknown speed %s", argv[2]);
62 		exit(1);
63 	}
64 	if (strncmp("/dev/", dev, 5)) {
65 		(void)sprintf(devname, "/dev/%s", dev);
66 		dev = devname;
67 	}
68 	if ((fd = open(dev, O_RDWR | O_NDELAY)) < 0) {
69 		perror(dev);
70 		exit(1);
71 	}
72 	sgtty.sg_flags = RAW | ANYP;
73 	sgtty.sg_ispeed = sgtty.sg_ospeed = speed;
74 	if (ioctl(fd, TIOCSETP, &sgtty) < 0) {
75 		perror("ioctl(TIOCSETP)");
76 		exit(1);
77 	}
78 	if (ioctl(fd, TIOCSETD, &slipdisc) < 0) {
79 		perror("ioctl(TIOCSETD)");
80 		exit(1);
81 	}
82 
83 	if (fork() > 0)
84 		exit(0);
85 	for (;;)
86 		sigpause(0L);
87 }
88 
89 struct sg_spds {
90 	int sp_val, sp_name;
91 }       spds[] = {
92 #ifdef B50
93 	{ 50, B50 },
94 #endif
95 #ifdef B75
96 	{ 75, B75 },
97 #endif
98 #ifdef B110
99 	{ 110, B110 },
100 #endif
101 #ifdef B150
102 	{ 150, B150 },
103 #endif
104 #ifdef B200
105 	{ 200, B200 },
106 #endif
107 #ifdef B300
108 	{ 300, B300 },
109 #endif
110 #ifdef B600
111 	{ 600, B600 },
112 #endif
113 #ifdef B1200
114 	{ 1200, B1200 },
115 #endif
116 #ifdef B1800
117 	{ 1800, B1800 },
118 #endif
119 #ifdef B2000
120 	{ 2000, B2000 },
121 #endif
122 #ifdef B2400
123 	{ 2400, B2400 },
124 #endif
125 #ifdef B3600
126 	{ 3600, B3600 },
127 #endif
128 #ifdef B4800
129 	{ 4800, B4800 },
130 #endif
131 #ifdef B7200
132 	{ 7200, B7200 },
133 #endif
134 #ifdef B9600
135 	{ 9600, B9600 },
136 #endif
137 #ifdef EXTA
138 	{ 19200, EXTA },
139 #endif
140 #ifdef EXTB
141 	{ 38400, EXTB },
142 #endif
143 	{ 0, 0 }
144 };
145 
146 findspeed(speed)
147 	register int speed;
148 {
149 	register struct sg_spds *sp;
150 
151 	sp = spds;
152 	while (sp->sp_val && sp->sp_val != speed)
153 		sp++;
154 	return (sp->sp_name);
155 }
156