ifconfig.c revision 1.7 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.7 1993/06/06 08:55:30 deraadt 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 #define NSIP
54 #include <netns/ns.h>
55 #include <netns/ns_if.h>
56
57 #define EON
58 #include <netiso/iso.h>
59 #include <netiso/iso_var.h>
60
61 #include <netdb.h>
62 #include <sys/protosw.h>
63
64 #include <unistd.h>
65 #include <stdio.h>
66 #include <errno.h>
67 #include <ctype.h>
68 #include <stdlib.h>
69 #include <string.h>
70
71 struct ifreq ifr, ridreq;
72 struct ifaliasreq addreq;
73 #ifdef EON
74 struct iso_ifreq iso_ridreq;
75 struct iso_aliasreq iso_addreq;
76 #endif
77 struct sockaddr_in netmask;
78
79 char name[30];
80 int flags;
81 int metric;
82 int nsellength = 1;
83 int setaddr;
84 int setipdst;
85 int doalias;
86 int clearaddr;
87 int newaddr = 1;
88 int s;
89 extern int errno;
90
91 int setifflags(), setifaddr(), setifdstaddr(), setifnetmask();
92 int setifmetric(), setifbroadaddr(), setifipdst();
93 int notealias(), setsnpaoffset(), setnsellength();
94
95 #define NEXTARG 0xffffff
96
97 struct cmd {
98 char *c_name;
99 int c_parameter; /* NEXTARG means next argv */
100 int (*c_func)();
101 } cmds[] = {
102 { "up", IFF_UP, setifflags } ,
103 { "down", -IFF_UP, setifflags },
104 { "trailers", -IFF_NOTRAILERS,setifflags },
105 { "-trailers", IFF_NOTRAILERS, setifflags },
106 { "arp", -IFF_NOARP, setifflags },
107 { "-arp", IFF_NOARP, setifflags },
108 { "debug", IFF_DEBUG, setifflags },
109 { "-debug", -IFF_DEBUG, setifflags },
110 { "aui", IFF_LLC0, setifflags }, /* 06 Sep 92*/
111 { "bnc", -IFF_LLC0, setifflags },
112 { "llc0", IFF_LLC0, setifflags }, /* 10 Mar 93 */
113 { "-llc0", -IFF_LLC0, setifflags },
114 { "llc1", IFF_LLC1, setifflags },
115 { "-llc1", -IFF_LLC1, setifflags },
116 { "llc2", IFF_LLC2, setifflags },
117 { "-llc2", -IFF_LLC2, setifflags },
118 { "alias", IFF_UP, notealias },
119 { "-alias", -IFF_UP, notealias },
120 { "delete", -IFF_UP, notealias },
121 #ifdef notdef
122 #define EN_SWABIPS 0x1000
123 { "swabips", EN_SWABIPS, setifflags },
124 { "-swabips", -EN_SWABIPS, setifflags },
125 #endif
126 { "netmask", NEXTARG, setifnetmask },
127 { "metric", NEXTARG, setifmetric },
128 { "broadcast", NEXTARG, setifbroadaddr },
129 { "ipdst", NEXTARG, setifipdst },
130 { "snpaoffset", NEXTARG, setsnpaoffset },
131 { "nsellength", NEXTARG, setnsellength },
132 { 0, 0, setifaddr },
133 { 0, 0, setifdstaddr },
134 };
135
136 /*
137 * XNS support liberally adapted from
138 * code written at the University of Maryland
139 * principally by James O'Toole and Chris Torek.
140 */
141 int in_status(), in_getaddr();
142 int in_s = -1;
143
144 #ifdef NSIP
145 int xns_status(), xns_getaddr();
146 int xns_s = -1;
147 #endif
148 #ifdef EON
149 int iso_status(), iso_getaddr();
150 int iso_s = -1;
151 #endif
152
153 /* Known address families */
154 struct afswtch {
155 char *af_name;
156 short af_af;
157 int (*af_status)();
158 int (*af_getaddr)();
159 int af_difaddr;
160 int af_aifaddr;
161 caddr_t af_ridreq;
162 caddr_t af_addreq;
163 } afs[] = {
164 #define C(x) ((caddr_t) &x)
165 { "inet", AF_INET, in_status, in_getaddr,
166 SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) },
167 #ifdef NSIP
168 { "ns", AF_NS, xns_status, xns_getaddr,
169 SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) },
170 #endif
171 #ifdef EON
172 { "iso", AF_ISO, iso_status, iso_getaddr,
173 SIOCDIFADDR_ISO, SIOCAIFADDR_ISO, C(iso_ridreq), C(iso_addreq) },
174 #endif
175 { 0, 0, 0, 0 }
176 };
177
178 struct afswtch *afp; /*the address family being set or asked about*/
179
180 main(argc, argv)
181 int argc;
182 char *argv[];
183 {
184 int af = AF_INET;
185 register struct afswtch *rafp;
186 int all = 0;
187
188 if (argc < 2) {
189 fprintf(stderr, "usage: ifconfig interface\n%s%s%s%s%s",
190 "\t[ af [ address [ dest_addr ] ] [ up ] [ down ]",
191 "[ netmask mask ] ]\n",
192 "\t[ metric n ]\n",
193 "\t[ trailers | -trailers ]\n",
194 "\t[ arp | -arp ]\n");
195 exit(1);
196 }
197 argc--, argv++;
198 if(strcmp(*argv, "-a")==0)
199 all = 1;
200 else {
201 strncpy(name, *argv, sizeof(name));
202 strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
203 }
204 argc--, argv++;
205 if (argc > 0) {
206 for (afp = rafp = afs; rafp->af_name; rafp++)
207 if (strcmp(rafp->af_name, *argv) == 0) {
208 afp = rafp; argc--; argv++;
209 break;
210 }
211 rafp = afp;
212 af = ifr.ifr_addr.sa_family = rafp->af_af;
213 }
214 in_s = s = socket(af, SOCK_DGRAM, 0);
215 if (s < 0) {
216 perror("ifconfig: socket");
217 exit(1);
218 }
219 #ifdef NSIP
220 xns_s = socket(AF_NS, SOCK_DGRAM, 0);
221 if(xns_s < 0) {
222 if (errno != EPROTONOSUPPORT) {
223 perror("ifconfig: xns: socket");
224 }
225 }
226 #endif
227 #ifdef EON
228 iso_s = socket(AF_ISO, SOCK_DGRAM, 0);
229 if (iso_s < 0) {
230 if (errno != EPROTONOSUPPORT) {
231 perror("ifconfig: iso: socket");
232 }
233 }
234 #endif
235
236 if(all) {
237 printall(af);
238 exit(0);
239 }
240 if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) {
241 Perror("ioctl (SIOCGIFFLAGS)");
242 exit(1);
243 }
244 if(argc==0) {
245 handle_ifreq(&ifr);
246 exit(0);
247 }
248
249 strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
250 flags = ifr.ifr_flags;
251 if (ioctl(s, SIOCGIFMETRIC, (caddr_t)&ifr) < 0)
252 perror("ioctl (SIOCGIFMETRIC)");
253 else
254 metric = ifr.ifr_metric;
255
256 while (argc > 0) {
257 register struct cmd *p;
258
259 for (p = cmds; p->c_name; p++)
260 if (strcmp(*argv, p->c_name) == 0)
261 break;
262 if (p->c_name == 0 && setaddr)
263 p++; /* got src, do dst */
264 if (p->c_func) {
265 if (p->c_parameter == NEXTARG) {
266 (*p->c_func)(argv[1]);
267 argc--, argv++;
268 } else
269 (*p->c_func)(*argv, p->c_parameter);
270 }
271 argc--, argv++;
272 }
273 if (af == AF_ISO)
274 adjust_nsellength();
275 #ifdef NSIP
276 if (setipdst && af==AF_NS) {
277 struct nsip_req rq;
278 int size = sizeof(rq);
279
280 rq.rq_ns = addreq.ifra_addr;
281 rq.rq_ip = addreq.ifra_dstaddr;
282
283 if (setsockopt(s, 0, SO_NSIP_ROUTE, &rq, size) < 0)
284 Perror("Encapsulation Routing");
285 }
286 #endif
287 if (clearaddr) {
288 int ret;
289 strncpy(rafp->af_ridreq, name, sizeof ifr.ifr_name);
290 if ((ret = ioctl(s, rafp->af_difaddr, rafp->af_ridreq)) < 0) {
291 if (errno == EADDRNOTAVAIL && (doalias >= 0)) {
292 /* means no previous address for interface */
293 } else
294 Perror("ioctl (SIOCDIFADDR)");
295 }
296 }
297 if (newaddr) {
298 strncpy(rafp->af_addreq, name, sizeof ifr.ifr_name);
299 if (ioctl(s, rafp->af_aifaddr, rafp->af_addreq) < 0)
300 Perror("ioctl (SIOCAIFADDR)");
301 }
302
303 exit(0);
304 }
305
306 printall()
307 {
308 char inbuf[8192];
309 struct ifconf ifc;
310 struct ifreq ifreq, *ifr;
311 struct in_addr in;
312 int i, len;
313
314 ifc.ifc_len = sizeof inbuf;
315 ifc.ifc_buf = inbuf;
316 if( ioctl(s, SIOCGIFCONF, &ifc) < 0) {
317 perror("ioctl(SIOCGIFCONF)");
318 return -1;
319 }
320 ifr = ifc.ifc_req;
321 ifreq.ifr_name[0] = '\0';
322 for(i=0; i<ifc.ifc_len; i+=len, ifr=(struct ifreq *)((caddr_t)ifr+len)) {
323 len = sizeof ifr->ifr_name + ifr->ifr_addr.sa_len;
324 ifreq = *ifr;
325 if( ioctl(s, SIOCGIFFLAGS, &ifreq) < 0) {
326 perror("ioctl(SIOCGIFFLAGS)");
327 continue;
328 }
329 handle_ifreq(&ifreq);
330 }
331 }
332
333 struct ifseen {
334 struct ifseen *next;
335 char *name;
336 } *ifshead;
337
338 handle_ifreq(ifr)
339 struct ifreq *ifr;
340 {
341 struct ifseen *ifs;
342
343 for(ifs=ifshead; ifs; ifs=ifs->next)
344 if(strcmp(ifs->name, ifr->ifr_name)==0)
345 return;
346
347 strncpy(name, ifr->ifr_name, sizeof ifr->ifr_name);
348 flags = ifr->ifr_flags;
349
350 if (ioctl(s, SIOCGIFMETRIC, (caddr_t)ifr) < 0) {
351 perror("ioctl (SIOCGIFMETRIC)");
352 metric = 0;
353 } else
354 metric = ifr->ifr_metric;
355 status();
356
357 ifs = (struct ifseen *)malloc(sizeof *ifs);
358 ifs->name = strdup(ifr->ifr_name);
359 ifs->next = ifshead;
360 ifshead = ifs;
361 }
362
363 #define RIDADDR 0
364 #define ADDR 1
365 #define MASK 2
366 #define DSTADDR 3
367
368 /*ARGSUSED*/
369 setifaddr(addr, param)
370 char *addr;
371 short param;
372 {
373 /*
374 * Delay the ioctl to set the interface addr until flags are all set.
375 * The address interpretation may depend on the flags,
376 * and the flags may change when the address is set.
377 */
378 setaddr++;
379 if (doalias == 0)
380 clearaddr = 1;
381 (*afp->af_getaddr)(addr, (doalias >= 0 ? ADDR : RIDADDR));
382 }
383
384 setifnetmask(addr)
385 char *addr;
386 {
387 (*afp->af_getaddr)(addr, MASK);
388 }
389
390 setifbroadaddr(addr)
391 char *addr;
392 {
393 (*afp->af_getaddr)(addr, DSTADDR);
394 }
395
396 setifipdst(addr)
397 char *addr;
398 {
399 in_getaddr(addr, DSTADDR);
400 setipdst++;
401 clearaddr = 0;
402 newaddr = 0;
403 }
404 #define rqtosa(x) (&(((struct ifreq *)(afp->x))->ifr_addr))
405 /*ARGSUSED*/
406 notealias(addr, param)
407 char *addr;
408 {
409 if (setaddr && doalias == 0 && param < 0)
410 bcopy((caddr_t)rqtosa(af_addreq),
411 (caddr_t)rqtosa(af_ridreq),
412 rqtosa(af_addreq)->sa_len);
413 doalias = param;
414 if (param < 0) {
415 clearaddr = 1;
416 newaddr = 0;
417 } else
418 clearaddr = 0;
419 }
420
421 /*ARGSUSED*/
422 setifdstaddr(addr, param)
423 char *addr;
424 int param;
425 {
426 (*afp->af_getaddr)(addr, DSTADDR);
427 }
428
429 setifflags(vname, value)
430 char *vname;
431 short value;
432 {
433 if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) {
434 Perror("ioctl (SIOCGIFFLAGS)");
435 exit(1);
436 }
437 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
438 flags = ifr.ifr_flags;
439
440 if (value < 0) {
441 value = -value;
442 flags &= ~value;
443 } else
444 flags |= value;
445 ifr.ifr_flags = flags;
446 if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&ifr) < 0)
447 Perror(vname);
448 }
449
450 setifmetric(val)
451 char *val;
452 {
453 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
454 ifr.ifr_metric = atoi(val);
455 if (ioctl(s, SIOCSIFMETRIC, (caddr_t)&ifr) < 0)
456 perror("ioctl (set metric)");
457 }
458
459 setsnpaoffset(val)
460 char *val;
461 {
462 #ifdef EON
463 iso_addreq.ifra_snpaoffset = atoi(val);
464 #endif
465 }
466
467 #define IFFBITS \
468 "\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6NOTRAILERS\7RUNNING\10NOARP\
469 \11PROMISC\12ALLMULTI\13OACTIVE\14SIMPLEX\15LLC0\16LLC1\17LLC2\
470 "
471
472 /*
473 * Print the status of the interface. If an address family was
474 * specified, show it and it only; otherwise, show them all.
475 */
476 status()
477 {
478 register struct afswtch *p = afp;
479 short af = ifr.ifr_addr.sa_family;
480
481 printf("%s: ", name);
482 printb("flags", flags, IFFBITS);
483 if (metric)
484 printf(" metric %d", metric);
485 putchar('\n');
486 if ((p = afp) != NULL) {
487 (*p->af_status)(1);
488 } else for (p = afs; p->af_name; p++) {
489 ifr.ifr_addr.sa_family = p->af_af;
490 (*p->af_status)(0);
491 }
492 }
493
494 in_status(force)
495 int force;
496 {
497 struct sockaddr_in *sin;
498 char *inet_ntoa();
499
500 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
501 if (ioctl(in_s, SIOCGIFADDR, (caddr_t)&ifr) < 0) {
502 if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) {
503 if (!force)
504 return;
505 bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
506 } else
507 perror("ioctl (SIOCGIFADDR)");
508 }
509 sin = (struct sockaddr_in *)&ifr.ifr_addr;
510 printf("\tinet %s ", inet_ntoa(sin->sin_addr));
511 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
512 if (ioctl(in_s, SIOCGIFNETMASK, (caddr_t)&ifr) < 0) {
513 if (errno != EADDRNOTAVAIL)
514 perror("ioctl (SIOCGIFNETMASK)");
515 bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
516 } else
517 netmask.sin_addr =
518 ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr;
519 if (flags & IFF_POINTOPOINT) {
520 if (ioctl(in_s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) {
521 if (errno == EADDRNOTAVAIL)
522 bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
523 else
524 perror("ioctl (SIOCGIFDSTADDR)");
525 }
526 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
527 sin = (struct sockaddr_in *)&ifr.ifr_dstaddr;
528 printf("--> %s ", inet_ntoa(sin->sin_addr));
529 }
530 printf("netmask %x ", ntohl(netmask.sin_addr.s_addr));
531 if (flags & IFF_BROADCAST) {
532 if (ioctl(in_s, SIOCGIFBRDADDR, (caddr_t)&ifr) < 0) {
533 if (errno == EADDRNOTAVAIL)
534 bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
535 else
536 perror("ioctl (SIOCGIFADDR)");
537 }
538 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
539 sin = (struct sockaddr_in *)&ifr.ifr_addr;
540 if (sin->sin_addr.s_addr != 0)
541 printf("broadcast %s", inet_ntoa(sin->sin_addr));
542 }
543 putchar('\n');
544 }
545
546 #ifdef NSIP
547
548 xns_status(force)
549 int force;
550 {
551 struct sockaddr_ns *sns;
552
553 if (xns_s < 0)
554 return;
555
556 if (ioctl(xns_s, SIOCGIFADDR, (caddr_t)&ifr) < 0) {
557 if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) {
558 if (!force)
559 return;
560 bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
561 } else
562 perror("ioctl (SIOCGIFADDR)");
563 }
564 strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
565 sns = (struct sockaddr_ns *)&ifr.ifr_addr;
566 printf("\tns %s ", ns_ntoa(sns->sns_addr));
567 if (flags & IFF_POINTOPOINT) { /* by W. Nesheim@Cornell */
568 if (ioctl(xns_s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) {
569 if (errno == EADDRNOTAVAIL)
570 bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
571 else
572 Perror("ioctl (SIOCGIFDSTADDR)");
573 }
574 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
575 sns = (struct sockaddr_ns *)&ifr.ifr_dstaddr;
576 printf("--> %s ", ns_ntoa(sns->sns_addr));
577 }
578 putchar('\n');
579 }
580
581 #endif
582 #ifdef EON
583 iso_status(force)
584 int force;
585 {
586 struct sockaddr_iso *siso;
587 struct iso_ifreq ifr;
588
589 if (iso_s < 0)
590 return;
591 bzero((caddr_t)&ifr, sizeof(ifr));
592 strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
593 if (ioctl(iso_s, SIOCGIFADDR_ISO, (caddr_t)&ifr) < 0) {
594 if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) {
595 if (!force)
596 return;
597 bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr));
598 } else {
599 perror("ioctl (SIOCGIFADDR_ISO)");
600 exit(1);
601 }
602 }
603 strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
604 siso = &ifr.ifr_Addr;
605 printf("\tiso %s ", iso_ntoa(&siso->siso_addr));
606 if (ioctl(iso_s, SIOCGIFNETMASK_ISO, (caddr_t)&ifr) < 0) {
607 if (errno != EADDRNOTAVAIL)
608 perror("ioctl (SIOCGIFNETMASK_ISO)");
609 } else {
610 printf(" netmask %s ", iso_ntoa(&siso->siso_addr));
611 }
612 if (flags & IFF_POINTOPOINT) {
613 if (ioctl(iso_s, SIOCGIFDSTADDR_ISO, (caddr_t)&ifr) < 0) {
614 if (errno == EADDRNOTAVAIL)
615 bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr));
616 else
617 Perror("ioctl (SIOCGIFDSTADDR_ISO)");
618 }
619 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
620 siso = &ifr.ifr_Addr;
621 printf("--> %s ", iso_ntoa(&siso->siso_addr));
622 }
623 putchar('\n');
624 }
625 #endif
626
627 Perror(cmd)
628 char *cmd;
629 {
630 extern int errno;
631
632 fprintf(stderr, "ifconfig: ");
633 switch (errno) {
634
635 case ENXIO:
636 fprintf(stderr, "%s: no such interface\n", cmd);
637 break;
638
639 case EPERM:
640 fprintf(stderr, "%s: permission denied\n", cmd);
641 break;
642
643 default:
644 perror(cmd);
645 }
646 exit(1);
647 }
648
649 struct in_addr inet_makeaddr();
650
651 #define SIN(x) ((struct sockaddr_in *) &(x))
652 struct sockaddr_in *sintab[] = {
653 SIN(ridreq.ifr_addr), SIN(addreq.ifra_addr),
654 SIN(addreq.ifra_mask), SIN(addreq.ifra_broadaddr)};
655
656 in_getaddr(s, which)
657 char *s;
658 {
659 register struct sockaddr_in *sin = sintab[which];
660 struct hostent *hp;
661 struct netent *np;
662 int val;
663
664 sin->sin_len = sizeof(*sin);
665 if (which != MASK)
666 sin->sin_family = AF_INET;
667
668 if ((val = inet_addr(s)) != -1)
669 sin->sin_addr.s_addr = val;
670 else if (hp = gethostbyname(s))
671 bcopy(hp->h_addr, (char *)&sin->sin_addr, hp->h_length);
672 else if (np = getnetbyname(s))
673 sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY);
674 else {
675 fprintf(stderr, "%s: bad value\n", s);
676 exit(1);
677 }
678 }
679
680 /*
681 * Print a value a la the %b format of the kernel's printf
682 */
683 printb(s, v, bits)
684 char *s;
685 register char *bits;
686 register unsigned short v;
687 {
688 register int i, any = 0;
689 register char c;
690
691 if (bits && *bits == 8)
692 printf("%s=%o", s, v);
693 else
694 printf("%s=%x", s, v);
695 bits++;
696 if (bits) {
697 putchar('<');
698 while (i = *bits++) {
699 if (v & (1 << (i-1))) {
700 if (any)
701 putchar(',');
702 any = 1;
703 for (; (c = *bits) > 32; bits++)
704 putchar(c);
705 } else
706 for (; *bits > 32; bits++)
707 ;
708 }
709 putchar('>');
710 }
711 }
712 #ifdef NSIP
713
714 #define SNS(x) ((struct sockaddr_ns *) &(x))
715 struct sockaddr_ns *snstab[] = {
716 SNS(ridreq.ifr_addr), SNS(addreq.ifra_addr),
717 SNS(addreq.ifra_mask), SNS(addreq.ifra_broadaddr)};
718
719 xns_getaddr(addr, which)
720 char *addr;
721 {
722 struct sockaddr_ns *sns = snstab[which];
723 struct ns_addr ns_addr();
724
725 sns->sns_family = AF_NS;
726 sns->sns_len = sizeof(*sns);
727 sns->sns_addr = ns_addr(addr);
728 if (which == MASK)
729 printf("Attempt to set XNS netmask will be ineffectual\n");
730 }
731
732 #endif
733 #ifdef EON
734 #define SISO(x) ((struct sockaddr_iso *) &(x))
735 struct sockaddr_iso *sisotab[] = {
736 SISO(iso_ridreq.ifr_Addr), SISO(iso_addreq.ifra_addr),
737 SISO(iso_addreq.ifra_mask), SISO(iso_addreq.ifra_dstaddr)};
738
739 iso_getaddr(addr, which)
740 char *addr;
741 {
742 register struct sockaddr_iso *siso = sisotab[which];
743 struct iso_addr *iso_addr();
744 siso->siso_addr = *iso_addr(addr);
745
746 if (which == MASK) {
747 siso->siso_len = TSEL(siso) - (caddr_t)(siso);
748 siso->siso_nlen = 0;
749 } else {
750 siso->siso_len = sizeof(*siso);
751 siso->siso_family = AF_ISO;
752 }
753 }
754 #endif
755
756 setnsellength(val)
757 char *val;
758 {
759 nsellength = atoi(val);
760 if (nsellength < 0) {
761 fprintf(stderr, "Negative NSEL length is absurd\n");
762 exit (1);
763 }
764 if (afp == 0 || afp->af_af != AF_ISO) {
765 fprintf(stderr, "Setting NSEL length valid only for iso\n");
766 exit (1);
767 }
768 }
769
770 #ifdef EON
771 fixnsel(s)
772 register struct sockaddr_iso *s;
773 {
774 if (s->siso_family == 0)
775 return;
776 s->siso_tlen = nsellength;
777 }
778 #endif
779
780 adjust_nsellength()
781 {
782 #ifdef EON
783 fixnsel(sisotab[RIDADDR]);
784 fixnsel(sisotab[ADDR]);
785 fixnsel(sisotab[DSTADDR]);
786 #endif
787 }
788