|
|
1.1 root 1: #include <stdio.h>
2: #include <sys/types.h>
3: #include <sgtty.h>
4: #include <sys/socket.h>
5: #include <signal.h>
6: #include <netinet/in.h>
7: #include <net/if.h>
8: #include <netdb.h>
9: #include <fcntl.h>
10:
11: struct ifreq ifr;
12: struct sockaddr_in sin = { AF_INET };
13:
14: int speed = B9600; /* default speed */
15: int slipdisc = SLIPDISC;
16:
17: char devname[32];
18: char hostname[32];
19: char *pname;
20: char *dev;
21:
22: /*
23: * Changes:
24: * fix format printing in perror()
25: */
26:
27: main(argc, argv)
28: int argc;
29: char *argv[];
30: {
31: pname = argv[0];
32: if ((argc < 2) || (argv[1][0] != '-')) {
33: usage();
34: exit(1);
35: }
36: argc--;
37: switch (argv[1][1]) {
38: case 'a' :
39: case 'A' :
40: attach(argc,&argv[1]);
41: break;
42: case 'd' :
43: case 'D' :
44: detach(argc,&argv[1]);
45: break;
46: default:
47: usage();
48: exit(1);
49: }
50: }
51:
52: attach(argc, argv)
53: int argc;
54: char *argv[];
55: {
56: register FILE *fp;
57: register int fd;
58: struct sgttyb sgtty;
59: int n, catch_alarm();
60:
61: dev = argv[1];
62: if (argc != 4 && argc != 5) {
63: usage();
64: exit(1);
65: }
66:
67: if (argc == 5) {
68: speed = findspeed(argv[4]);
69: if (speed == 0) {
70: fprintf(stderr, "%s: %s: Unknown speed\n",pname, argv[4]);
71: usage();
72: exit(1);
73: }
74: }
75: if (strncmp("/dev/", dev, 5)) {
76: sprintf(devname, "/dev/%s", dev);
77: dev = devname;
78: }
79: signal(SIGALRM, catch_alarm);
80: alarm(60);
81: if ((fd = open(dev, O_RDWR|O_NDELAY)) < 0 ) {
82: perror(dev);
83: exit(1);
84: }
85: alarm(0);
86:
87: if (ioctl(fd, TIOCGETP, &sgtty) < 0) {
88: perror(dev);
89: exit(1);
90: }
91: sgtty.sg_ispeed = sgtty.sg_ospeed = speed;
92: if (ioctl(fd, TIOCSETP, &sgtty) < 0) {
93: perror(dev);
94: exit(1);
95: }
96:
97: if (ioctl(fd, TIOCSETD, &slipdisc) < 0) {
98: fprintf(stderr,"%s: ",pname);
99: perror("Can't set line discipline");
100: exit(1);
101: }
102:
103: if (ioctl(fd, TIOCGETD, &n) < 0) {
104: fprintf(stderr,"%s: ",pname);
105: perror("Can't get line discipline");
106: exit(1);
107: }
108:
109: close(fd);
110:
111: fd = socket(AF_INET, SOCK_DGRAM, 0);
112: if (fd < 0) {
113: fprintf(stderr,"%s: ",pname);
114: perror("Can't get socket");
115: exit(1);
116: }
117: sprintf(ifr.ifr_name, "sl%d", n);
118:
119: getaddr(argv[3], (struct sockaddr_in *)&ifr.ifr_dstaddr);
120: if (ioctl(fd, SIOCSIFDSTADDR, (caddr_t)&ifr) < 0) {
121: fprintf(stderr,"%s: ",pname);
122: perror("Can't do ioctl (SIOCSIFDSTADDR)");
123: exit(1);
124: }
125: getaddr(argv[2], (struct sockaddr_in *)&ifr.ifr_addr);
126: if (ioctl(fd, SIOCSIFADDR, (caddr_t)&ifr) < 0) {
127: fprintf(stderr,"%s: ",pname);
128: perror("Can't do ioctl (SIOCSIFADDR)");
129: exit(1);
130: }
131: }
132:
133: catch_alarm()
134: {
135: fprintf(stderr,"open failed on \"%s\" -- timed out after 60 seconds.\n",dev);
136: exit(1);
137: }
138:
139: struct speedtab {
140: char *sp_name;
141: int sp_val;
142: } spds[] = {
143: #ifdef B50
144: { "50", B50},
145: #endif
146: #ifdef B75
147: { "75", B75},
148: #endif
149: #ifdef B110
150: { "110", B110},
151: #endif
152: #ifdef B150
153: { "150", B150},
154: #endif
155: #ifdef B200
156: { "200", B200},
157: #endif
158: #ifdef B300
159: { "300", B300},
160: #endif
161: #ifdef B600
162: { "600", B600},
163: #endif
164: #ifdef B1200
165: {"1200", B1200},
166: #endif
167: #ifdef B1800
168: {"1800", B1800},
169: #endif
170: #ifdef B2000
171: {"2000", B2000},
172: #endif
173: #ifdef B2400
174: {"2400", B2400},
175: #endif
176: #ifdef B3600
177: {"3600", B3600},
178: #endif
179: #ifdef B4800
180: {"4800", B4800},
181: #endif
182: #ifdef B7200
183: {"7200", B7200},
184: #endif
185: #ifdef B9600
186: {"9600", B9600},
187: #endif
188: #ifdef EXTA
189: {"19200",EXTA},
190: {"exta" ,EXTA},
191: #endif
192: {0, 0}
193: };
194:
195: usage()
196: {
197: fprintf(stderr,
198: "usage: %s -a ttyname source-hostname destination-hostname [baudrate]\n",pname);
199: fprintf(stderr," Attach an serial interface.\n");
200: fprintf(stderr,"Or\n");
201: fprintf(stderr," %s -d interface-name\n",pname);
202: fprintf(stderr," Detach an serial interface.\n");
203: }
204:
205:
206: findspeed(wantbaud)
207: char *wantbaud;
208: {
209: register struct speedtab *sp;
210:
211: for (sp = spds; sp->sp_name != 0; sp++) {
212: if (strcmp(sp->sp_name, wantbaud) == 0)
213: return(sp->sp_val);
214: }
215: return(0);
216: }
217:
218: struct in_addr inet_makeaddr();
219:
220: getaddr(s, sin)
221: char *s;
222: struct sockaddr_in *sin;
223: {
224: struct hostent *hp;
225: struct netent *np;
226: int val;
227:
228: hp = gethostbyname(s);
229: if (hp) {
230: sin->sin_family = hp->h_addrtype;
231: bcopy(hp->h_addr, (char *)&sin->sin_addr, hp->h_length);
232: return;
233: }
234: np = getnetbyname(s);
235: if (np) {
236: sin->sin_family = np->n_addrtype;
237: sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY);
238: return;
239: }
240: sin->sin_family = AF_INET;
241: val = inet_addr(s);
242: if (val != -1) {
243: sin->sin_addr.s_addr = val;
244: return;
245: }
246: val = inet_network(s);
247: if (val != -1) {
248: sin->sin_addr = inet_makeaddr(val, INADDR_ANY);
249: return;
250: }
251: fprintf(stderr, "%s: %s: bad value\n",pname, s);
252: exit(1);
253: }
254:
255: /* ************** */
256:
257: detach(argc, argv)
258: int argc;
259: char *argv[];
260: {
261: register int fd;
262:
263: if (argc != 2) {
264: fprintf(stderr, "usage: sldetach interface-name\n");
265: exit(1);
266: }
267:
268: fd = socket(AF_INET, SOCK_DGRAM, 0);
269: if (fd < 0) {
270: perror("sldetach: socket");
271: exit(1);
272: }
273:
274: strcpy(ifr.ifr_name, argv[1]);
275: if (ioctl(fd, SIOCIFDETACH, (caddr_t)&ifr) < 0) {
276: perror("sldetach: Can't do ioctl (SIOCIFDETACH)");
277: exit(1);
278: }
279: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.