ifconfig.c revision 1.4 1 /*
2 * Copyright (c) 1983 Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34 #ifndef lint
35 char copyright[] =
36 "@(#) Copyright (c) 1983 Regents of the University of California.\n\
37 All rights reserved.\n";
38 #endif /* not lint */
39
40 #ifndef lint
41 static char sccsid[] = "@(#)ifconfig.c 5.1 (Berkeley) 2/28/91";
42 static char rcsid[] = "$Header: /tank/opengrok/rsync2/NetBSD/src/sbin/ifconfig/ifconfig.c,v 1.4 1993/03/23 00:28:32 cgd Exp $";
43 #endif /* not lint */
44
45 #include <sys/param.h>
46 #include <sys/socket.h>
47 #include <sys/ioctl.h>
48
49 #include <net/if.h>
50 #include <netinet/in.h>
51 #include <arpa/inet.h>
52
53 #ifdef notdef
54 #define NSIP
55 #include <netns/ns.h>
56 #include <netns/ns_if.h>
57
58 #define EON
59 #include <netiso/iso.h>
60 #include <netiso/iso_var.h>
61 #endif
62 #include <netdb.h>
63 #include <sys/protosw.h>
64
65 #include <unistd.h>
66 #include <stdio.h>
67 #include <errno.h>
68 #include <ctype.h>
69 #include <stdlib.h>
70 #include <string.h>
71
72 struct ifreq ifr, ridreq;
73 struct ifaliasreq addreq;
74 #ifdef EON
75 struct iso_ifreq iso_ridreq;
76 struct iso_aliasreq iso_addreq;
77 #endif
78 struct sockaddr_in netmask;
79
80 char name[30];
81 int flags;
82 int metric;
83 int nsellength = 1;
84 int setaddr;
85 int setipdst;
86 int doalias;
87 int clearaddr;
88 int newaddr = 1;
89 int s;
90 extern int errno;
91
92 int setifflags(), setifaddr(), setifdstaddr(), setifnetmask();
93 int setifmetric(), setifbroadaddr(), setifipdst();
94 int notealias(), setsnpaoffset(), setnsellength();
95
96 #define NEXTARG 0xffffff
97
98 struct cmd {
99 char *c_name;
100 int c_parameter; /* NEXTARG means next argv */
101 int (*c_func)();
102 } cmds[] = {
103 { "up", IFF_UP, setifflags } ,
104 { "down", -IFF_UP, setifflags },
105 { "trailers", -IFF_NOTRAILERS,setifflags },
106 { "-trailers", IFF_NOTRAILERS, setifflags },
107 { "arp", -IFF_NOARP, setifflags },
108 { "-arp", IFF_NOARP, setifflags },
109 { "debug", IFF_DEBUG, setifflags },
110 { "-debug", -IFF_DEBUG, setifflags },
111 { "aui", IFF_LLC0, setifflags }, /* 06 Sep 92*/
112 { "bnc", -IFF_LLC0, setifflags },
113 { "llc0", IFF_LLC0, setifflags }, /* 10 Mar 93 */
114 { "-llc0", -IFF_LLC0, setifflags },
115 { "llc1", IFF_LLC1, setifflags },
116 { "-llc1", -IFF_LLC1, setifflags },
117 { "llc2", IFF_LLC2, setifflags },
118 { "-llc2", -IFF_LLC2, setifflags },
119 { "alias", IFF_UP, notealias },
120 { "-alias", -IFF_UP, notealias },
121 { "delete", -IFF_UP, notealias },
122 #ifdef notdef
123 #define EN_SWABIPS 0x1000
124 { "swabips", EN_SWABIPS, setifflags },
125 { "-swabips", -EN_SWABIPS, setifflags },
126 #endif
127 { "netmask", NEXTARG, setifnetmask },
128 { "metric", NEXTARG, setifmetric },
129 { "broadcast", NEXTARG, setifbroadaddr },
130 { "ipdst", NEXTARG, setifipdst },
131 { "snpaoffset", NEXTARG, setsnpaoffset },
132 { "nsellength", NEXTARG, setnsellength },
133 { 0, 0, setifaddr },
134 { 0, 0, setifdstaddr },
135 };
136
137 /*
138 * XNS support liberally adapted from
139 * code written at the University of Maryland
140 * principally by James O'Toole and Chris Torek.
141 */
142 int in_status(), in_getaddr();
143 #ifdef NSIP
144 int xns_status(), xns_getaddr();
145 #endif
146 #ifdef EON
147 int iso_status(), iso_getaddr();
148 #endif
149
150 /* Known address families */
151 struct afswtch {
152 char *af_name;
153 short af_af;
154 int (*af_status)();
155 int (*af_getaddr)();
156 int af_difaddr;
157 int af_aifaddr;
158 caddr_t af_ridreq;
159 caddr_t af_addreq;
160 } afs[] = {
161 #define C(x) ((caddr_t) &x)
162 { "inet", AF_INET, in_status, in_getaddr,
163 SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) },
164 #ifdef NSIP
165 { "ns", AF_NS, xns_status, xns_getaddr,
166 SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) },
167 #endif
168 #ifdef EON
169 { "iso", AF_ISO, iso_status, iso_getaddr,
170 SIOCDIFADDR_ISO, SIOCAIFADDR_ISO, C(iso_ridreq), C(iso_addreq) },
171 #endif
172 { 0, 0, 0, 0 }
173 };
174
175 struct afswtch *afp; /*the address family being set or asked about*/
176
177 main(argc, argv)
178 int argc;
179 char *argv[];
180 {
181 int af = AF_INET;
182 register struct afswtch *rafp;
183
184 if (argc < 2) {
185 fprintf(stderr, "usage: ifconfig interface\n%s%s%s%s%s",
186 "\t[ af [ address [ dest_addr ] ] [ up ] [ down ]",
187 "[ netmask mask ] ]\n",
188 "\t[ metric n ]\n",
189 "\t[ trailers | -trailers ]\n",
190 "\t[ arp | -arp ]\n");
191 exit(1);
192 }
193 argc--, argv++;
194 strncpy(name, *argv, sizeof(name));
195 strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
196 argc--, argv++;
197 if (argc > 0) {
198 for (afp = rafp = afs; rafp->af_name; rafp++)
199 if (strcmp(rafp->af_name, *argv) == 0) {
200 afp = rafp; argc--; argv++;
201 break;
202 }
203 rafp = afp;
204 af = ifr.ifr_addr.sa_family = rafp->af_af;
205 }
206 s = socket(af, SOCK_DGRAM, 0);
207 if (s < 0) {
208 perror("ifconfig: socket");
209 exit(1);
210 }
211 if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) {
212 Perror("ioctl (SIOCGIFFLAGS)");
213 exit(1);
214 }
215 strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
216 flags = ifr.ifr_flags;
217 if (ioctl(s, SIOCGIFMETRIC, (caddr_t)&ifr) < 0)
218 perror("ioctl (SIOCGIFMETRIC)");
219 else
220 metric = ifr.ifr_metric;
221 if (argc == 0) {
222 status();
223 exit(0);
224 }
225 while (argc > 0) {
226 register struct cmd *p;
227
228 for (p = cmds; p->c_name; p++)
229 if (strcmp(*argv, p->c_name) == 0)
230 break;
231 if (p->c_name == 0 && setaddr)
232 p++; /* got src, do dst */
233 if (p->c_func) {
234 if (p->c_parameter == NEXTARG) {
235 (*p->c_func)(argv[1]);
236 argc--, argv++;
237 } else
238 (*p->c_func)(*argv, p->c_parameter);
239 }
240 argc--, argv++;
241 }
242 if (af == AF_ISO)
243 adjust_nsellength();
244 #ifdef NSIP
245 if (setipdst && af==AF_NS) {
246 struct nsip_req rq;
247 int size = sizeof(rq);
248
249 rq.rq_ns = addreq.ifra_addr;
250 rq.rq_ip = addreq.ifra_dstaddr;
251
252 if (setsockopt(s, 0, SO_NSIP_ROUTE, &rq, size) < 0)
253 Perror("Encapsulation Routing");
254 }
255 #endif
256 if (clearaddr) {
257 int ret;
258 strncpy(rafp->af_ridreq, name, sizeof ifr.ifr_name);
259 if ((ret = ioctl(s, rafp->af_difaddr, rafp->af_ridreq)) < 0) {
260 if (errno == EADDRNOTAVAIL && (doalias >= 0)) {
261 /* means no previous address for interface */
262 } else
263 Perror("ioctl (SIOCDIFADDR)");
264 }
265 }
266 if (newaddr) {
267 strncpy(rafp->af_addreq, name, sizeof ifr.ifr_name);
268 if (ioctl(s, rafp->af_aifaddr, rafp->af_addreq) < 0)
269 Perror("ioctl (SIOCAIFADDR)");
270 }
271 exit(0);
272 }
273 #define RIDADDR 0
274 #define ADDR 1
275 #define MASK 2
276 #define DSTADDR 3
277
278 /*ARGSUSED*/
279 setifaddr(addr, param)
280 char *addr;
281 short param;
282 {
283 /*
284 * Delay the ioctl to set the interface addr until flags are all set.
285 * The address interpretation may depend on the flags,
286 * and the flags may change when the address is set.
287 */
288 setaddr++;
289 if (doalias == 0)
290 clearaddr = 1;
291 (*afp->af_getaddr)(addr, (doalias >= 0 ? ADDR : RIDADDR));
292 }
293
294 setifnetmask(addr)
295 char *addr;
296 {
297 (*afp->af_getaddr)(addr, MASK);
298 }
299
300 setifbroadaddr(addr)
301 char *addr;
302 {
303 (*afp->af_getaddr)(addr, DSTADDR);
304 }
305
306 setifipdst(addr)
307 char *addr;
308 {
309 in_getaddr(addr, DSTADDR);
310 setipdst++;
311 clearaddr = 0;
312 newaddr = 0;
313 }
314 #define rqtosa(x) (&(((struct ifreq *)(afp->x))->ifr_addr))
315 /*ARGSUSED*/
316 notealias(addr, param)
317 char *addr;
318 {
319 if (setaddr && doalias == 0 && param < 0)
320 bcopy((caddr_t)rqtosa(af_addreq),
321 (caddr_t)rqtosa(af_ridreq),
322 rqtosa(af_addreq)->sa_len);
323 doalias = param;
324 if (param < 0) {
325 clearaddr = 1;
326 newaddr = 0;
327 } else
328 clearaddr = 0;
329 }
330
331 /*ARGSUSED*/
332 setifdstaddr(addr, param)
333 char *addr;
334 int param;
335 {
336 (*afp->af_getaddr)(addr, DSTADDR);
337 }
338
339 setifflags(vname, value)
340 char *vname;
341 short value;
342 {
343 if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) {
344 Perror("ioctl (SIOCGIFFLAGS)");
345 exit(1);
346 }
347 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
348 flags = ifr.ifr_flags;
349
350 if (value < 0) {
351 value = -value;
352 flags &= ~value;
353 } else
354 flags |= value;
355 ifr.ifr_flags = flags;
356 if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&ifr) < 0)
357 Perror(vname);
358 }
359
360 setifmetric(val)
361 char *val;
362 {
363 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
364 ifr.ifr_metric = atoi(val);
365 if (ioctl(s, SIOCSIFMETRIC, (caddr_t)&ifr) < 0)
366 perror("ioctl (set metric)");
367 }
368
369 setsnpaoffset(val)
370 char *val;
371 {
372 #ifdef EON
373 iso_addreq.ifra_snpaoffset = atoi(val);
374 #endif
375 }
376
377 #define IFFBITS \
378 "\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6NOTRAILERS\7RUNNING\10NOARP\
379 \11PROMISC\12ALLMULTI\13OACTIVE\14SIMPLEX\15LLC0\16LLC1\17LLC2\
380 "
381
382 /*
383 * Print the status of the interface. If an address family was
384 * specified, show it and it only; otherwise, show them all.
385 */
386 status()
387 {
388 register struct afswtch *p = afp;
389 short af = ifr.ifr_addr.sa_family;
390
391 printf("%s: ", name);
392 printb("flags", flags, IFFBITS);
393 if (metric)
394 printf(" metric %d", metric);
395 putchar('\n');
396 if ((p = afp) != NULL) {
397 (*p->af_status)(1);
398 } else for (p = afs; p->af_name; p++) {
399 ifr.ifr_addr.sa_family = p->af_af;
400 (*p->af_status)(0);
401 }
402 }
403
404 in_status(force)
405 int force;
406 {
407 struct sockaddr_in *sin;
408 char *inet_ntoa();
409
410 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
411 if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) {
412 if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) {
413 if (!force)
414 return;
415 bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
416 } else
417 perror("ioctl (SIOCGIFADDR)");
418 }
419 sin = (struct sockaddr_in *)&ifr.ifr_addr;
420 printf("\tinet %s ", inet_ntoa(sin->sin_addr));
421 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
422 if (ioctl(s, SIOCGIFNETMASK, (caddr_t)&ifr) < 0) {
423 if (errno != EADDRNOTAVAIL)
424 perror("ioctl (SIOCGIFNETMASK)");
425 bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
426 } else
427 netmask.sin_addr =
428 ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr;
429 if (flags & IFF_POINTOPOINT) {
430 if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) {
431 if (errno == EADDRNOTAVAIL)
432 bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
433 else
434 perror("ioctl (SIOCGIFDSTADDR)");
435 }
436 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
437 sin = (struct sockaddr_in *)&ifr.ifr_dstaddr;
438 printf("--> %s ", inet_ntoa(sin->sin_addr));
439 }
440 printf("netmask %x ", ntohl(netmask.sin_addr.s_addr));
441 if (flags & IFF_BROADCAST) {
442 if (ioctl(s, SIOCGIFBRDADDR, (caddr_t)&ifr) < 0) {
443 if (errno == EADDRNOTAVAIL)
444 bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
445 else
446 perror("ioctl (SIOCGIFADDR)");
447 }
448 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
449 sin = (struct sockaddr_in *)&ifr.ifr_addr;
450 if (sin->sin_addr.s_addr != 0)
451 printf("broadcast %s", inet_ntoa(sin->sin_addr));
452 }
453 putchar('\n');
454 }
455
456 #ifdef NSIP
457
458 xns_status(force)
459 int force;
460 {
461 struct sockaddr_ns *sns;
462
463 close(s);
464 s = socket(AF_NS, SOCK_DGRAM, 0);
465 if (s < 0) {
466 if (errno == EPROTONOSUPPORT)
467 return;
468 perror("ifconfig: socket");
469 exit(1);
470 }
471 if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) {
472 if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) {
473 if (!force)
474 return;
475 bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
476 } else
477 perror("ioctl (SIOCGIFADDR)");
478 }
479 strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
480 sns = (struct sockaddr_ns *)&ifr.ifr_addr;
481 printf("\tns %s ", ns_ntoa(sns->sns_addr));
482 if (flags & IFF_POINTOPOINT) { /* by W. Nesheim@Cornell */
483 if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) {
484 if (errno == EADDRNOTAVAIL)
485 bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
486 else
487 Perror("ioctl (SIOCGIFDSTADDR)");
488 }
489 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
490 sns = (struct sockaddr_ns *)&ifr.ifr_dstaddr;
491 printf("--> %s ", ns_ntoa(sns->sns_addr));
492 }
493 putchar('\n');
494 }
495
496 #endif
497 #ifdef EON
498 iso_status(force)
499 int force;
500 {
501 struct sockaddr_iso *siso;
502 struct iso_ifreq ifr;
503
504 close(s);
505 s = socket(AF_ISO, SOCK_DGRAM, 0);
506 if (s < 0) {
507 if (errno == EPROTONOSUPPORT)
508 return;
509 perror("ifconfig: socket");
510 exit(1);
511 }
512 bzero((caddr_t)&ifr, sizeof(ifr));
513 strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
514 if (ioctl(s, SIOCGIFADDR_ISO, (caddr_t)&ifr) < 0) {
515 if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) {
516 if (!force)
517 return;
518 bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr));
519 } else {
520 perror("ioctl (SIOCGIFADDR_ISO)");
521 exit(1);
522 }
523 }
524 strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
525 siso = &ifr.ifr_Addr;
526 printf("\tiso %s ", iso_ntoa(&siso->siso_addr));
527 if (ioctl(s, SIOCGIFNETMASK_ISO, (caddr_t)&ifr) < 0) {
528 if (errno != EADDRNOTAVAIL)
529 perror("ioctl (SIOCGIFNETMASK_ISO)");
530 } else {
531 printf(" netmask %s ", iso_ntoa(&siso->siso_addr));
532 }
533 if (flags & IFF_POINTOPOINT) {
534 if (ioctl(s, SIOCGIFDSTADDR_ISO, (caddr_t)&ifr) < 0) {
535 if (errno == EADDRNOTAVAIL)
536 bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr));
537 else
538 Perror("ioctl (SIOCGIFDSTADDR_ISO)");
539 }
540 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
541 siso = &ifr.ifr_Addr;
542 printf("--> %s ", iso_ntoa(&siso->siso_addr));
543 }
544 putchar('\n');
545 }
546 #endif
547
548 Perror(cmd)
549 char *cmd;
550 {
551 extern int errno;
552
553 fprintf(stderr, "ifconfig: ");
554 switch (errno) {
555
556 case ENXIO:
557 fprintf(stderr, "%s: no such interface\n", cmd);
558 break;
559
560 case EPERM:
561 fprintf(stderr, "%s: permission denied\n", cmd);
562 break;
563
564 default:
565 perror(cmd);
566 }
567 exit(1);
568 }
569
570 struct in_addr inet_makeaddr();
571
572 #define SIN(x) ((struct sockaddr_in *) &(x))
573 struct sockaddr_in *sintab[] = {
574 SIN(ridreq.ifr_addr), SIN(addreq.ifra_addr),
575 SIN(addreq.ifra_mask), SIN(addreq.ifra_broadaddr)};
576
577 in_getaddr(s, which)
578 char *s;
579 {
580 register struct sockaddr_in *sin = sintab[which];
581 struct hostent *hp;
582 struct netent *np;
583 int val;
584
585 sin->sin_len = sizeof(*sin);
586 if (which != MASK)
587 sin->sin_family = AF_INET;
588
589 if ((val = inet_addr(s)) != -1)
590 sin->sin_addr.s_addr = val;
591 else if (hp = gethostbyname(s))
592 bcopy(hp->h_addr, (char *)&sin->sin_addr, hp->h_length);
593 else if (np = getnetbyname(s))
594 sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY);
595 else {
596 fprintf(stderr, "%s: bad value\n", s);
597 exit(1);
598 }
599 }
600
601 /*
602 * Print a value a la the %b format of the kernel's printf
603 */
604 printb(s, v, bits)
605 char *s;
606 register char *bits;
607 register unsigned short v;
608 {
609 register int i, any = 0;
610 register char c;
611
612 if (bits && *bits == 8)
613 printf("%s=%o", s, v);
614 else
615 printf("%s=%x", s, v);
616 bits++;
617 if (bits) {
618 putchar('<');
619 while (i = *bits++) {
620 if (v & (1 << (i-1))) {
621 if (any)
622 putchar(',');
623 any = 1;
624 for (; (c = *bits) > 32; bits++)
625 putchar(c);
626 } else
627 for (; *bits > 32; bits++)
628 ;
629 }
630 putchar('>');
631 }
632 }
633 #ifdef NSIP
634
635 #define SNS(x) ((struct sockaddr_ns *) &(x))
636 struct sockaddr_ns *snstab[] = {
637 SNS(ridreq.ifr_addr), SNS(addreq.ifra_addr),
638 SNS(addreq.ifra_mask), SNS(addreq.ifra_broadaddr)};
639
640 xns_getaddr(addr, which)
641 char *addr;
642 {
643 struct sockaddr_ns *sns = snstab[which];
644 struct ns_addr ns_addr();
645
646 sns->sns_family = AF_NS;
647 sns->sns_len = sizeof(*sns);
648 sns->sns_addr = ns_addr(addr);
649 if (which == MASK)
650 printf("Attempt to set XNS netmask will be ineffectual\n");
651 }
652
653 #endif
654 #ifdef EON
655 #define SISO(x) ((struct sockaddr_iso *) &(x))
656 struct sockaddr_iso *sisotab[] = {
657 SISO(iso_ridreq.ifr_Addr), SISO(iso_addreq.ifra_addr),
658 SISO(iso_addreq.ifra_mask), SISO(iso_addreq.ifra_dstaddr)};
659
660 iso_getaddr(addr, which)
661 char *addr;
662 {
663 register struct sockaddr_iso *siso = sisotab[which];
664 struct iso_addr *iso_addr();
665 siso->siso_addr = *iso_addr(addr);
666
667 if (which == MASK) {
668 siso->siso_len = TSEL(siso) - (caddr_t)(siso);
669 siso->siso_nlen = 0;
670 } else {
671 siso->siso_len = sizeof(*siso);
672 siso->siso_family = AF_ISO;
673 }
674 }
675 #endif
676
677 setnsellength(val)
678 char *val;
679 {
680 nsellength = atoi(val);
681 if (nsellength < 0) {
682 fprintf(stderr, "Negative NSEL length is absurd\n");
683 exit (1);
684 }
685 if (afp == 0 || afp->af_af != AF_ISO) {
686 fprintf(stderr, "Setting NSEL length valid only for iso\n");
687 exit (1);
688 }
689 }
690
691 #ifdef notdef
692 fixnsel(s)
693 register struct sockaddr_iso *s;
694 {
695 if (s->siso_family == 0)
696 return;
697 s->siso_tlen = nsellength;
698 }
699 #endif
700
701 adjust_nsellength()
702 {
703 #ifdef notdef
704 fixnsel(sisotab[RIDADDR]);
705 fixnsel(sisotab[ADDR]);
706 fixnsel(sisotab[DSTADDR]);
707 #endif
708 }
709