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