ISO ip encapsulation targets set by route rather than ifconfig
[unix-history] / usr / src / sbin / ifconfig / ifconfig.c
CommitLineData
0fd5cf4f
MK
1/*
2 * Copyright (c) 1983 Regents of the University of California.
40c992d9
KB
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are permitted
6 * provided that the above copyright notice and this paragraph are
7 * duplicated in all such forms and that any documentation,
8 * advertising materials, and other materials related to such
9 * distribution and use acknowledge that the software was developed
10 * by the University of California, Berkeley. The name of the
11 * University may not be used to endorse or promote products derived
12 * from this software without specific prior written permission.
13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
0fd5cf4f
MK
16 */
17
b3eab9f9 18#ifndef lint
0fd5cf4f
MK
19char copyright[] =
20"@(#) Copyright (c) 1983 Regents of the University of California.\n\
21 All rights reserved.\n";
40c992d9 22#endif /* not lint */
0fd5cf4f
MK
23
24#ifndef lint
b95f7094 25static char sccsid[] = "@(#)ifconfig.c 4.26 (Berkeley) %G%";
40c992d9 26#endif /* not lint */
0fd5cf4f 27
b3eab9f9
SL
28#include <sys/types.h>
29#include <sys/socket.h>
30#include <sys/ioctl.h>
31
b3eab9f9 32#include <net/if.h>
62e9bc4a
KS
33#include <netinet/in.h>
34
35#define NSIP
36#include <netns/ns.h>
37#include <netns/ns_if.h>
b3eab9f9 38
22b2b267 39#define EON
59c3b7d8
KS
40#include <netiso/iso.h>
41#include <netiso/iso_var.h>
22b2b267 42#include <sys/protosw.h>
59c3b7d8 43
b3eab9f9
SL
44#include <stdio.h>
45#include <errno.h>
46#include <ctype.h>
47#include <netdb.h>
48
62e9bc4a 49extern int errno;
59c3b7d8
KS
50struct ifreq ifr, ridreq;
51struct ifaliasreq addreq;
52struct iso_ifreq iso_ridreq;
53struct iso_aliasreq iso_addreq;
54struct sockaddr_in netmask;
55
b3eab9f9 56char name[30];
0fd5cf4f 57int flags;
f5f09b9d 58int metric;
dea973a0 59int setaddr;
62e9bc4a 60int setipdst;
59c3b7d8 61int doalias;
22b2b267 62int clearaddr;
59c3b7d8 63int newaddr = 1;
b3eab9f9 64int s;
0fd5cf4f
MK
65extern int errno;
66
67int setifflags(), setifaddr(), setifdstaddr(), setifnetmask();
f5f09b9d 68int setifmetric(), setifbroadaddr(), setifipdst();
59c3b7d8 69int notealias(), setsnpaoffset();
b3eab9f9 70
0fd5cf4f 71#define NEXTARG 0xffffff
b3eab9f9
SL
72
73struct cmd {
74 char *c_name;
0fd5cf4f 75 int c_parameter; /* NEXTARG means next argv */
b3eab9f9
SL
76 int (*c_func)();
77} cmds[] = {
78 { "up", IFF_UP, setifflags } ,
79 { "down", -IFF_UP, setifflags },
80 { "trailers", -IFF_NOTRAILERS,setifflags },
81 { "-trailers", IFF_NOTRAILERS, setifflags },
1095926d
MK
82 { "arp", -IFF_NOARP, setifflags },
83 { "-arp", IFF_NOARP, setifflags },
717eb130
CL
84 { "debug", IFF_DEBUG, setifflags },
85 { "-debug", -IFF_DEBUG, setifflags },
59c3b7d8
KS
86 { "alias", IFF_UP, notealias },
87 { "-alias", -IFF_UP, notealias },
88 { "delete", -IFF_UP, notealias },
a390ced5 89#ifdef notdef
0fd5cf4f 90#define EN_SWABIPS 0x1000
a390ced5
SL
91 { "swabips", EN_SWABIPS, setifflags },
92 { "-swabips", -EN_SWABIPS, setifflags },
93#endif
0fd5cf4f 94 { "netmask", NEXTARG, setifnetmask },
f5f09b9d 95 { "metric", NEXTARG, setifmetric },
59c3b7d8 96 { "snpaoffset", NEXTARG, setsnpaoffset },
0fd5cf4f 97 { "broadcast", NEXTARG, setifbroadaddr },
62e9bc4a 98 { "ipdst", NEXTARG, setifipdst },
b3eab9f9 99 { 0, 0, setifaddr },
40a42b7f 100 { 0, 0, setifdstaddr },
b3eab9f9
SL
101};
102
62e9bc4a
KS
103/*
104 * XNS support liberally adapted from
105 * code written at the University of Maryland
106 * principally by James O'Toole and Chris Torek.
107 */
62e9bc4a
KS
108int in_status(), in_getaddr();
109int xns_status(), xns_getaddr();
59c3b7d8 110int iso_status(), iso_getaddr();
62e9bc4a
KS
111
112/* Known address families */
113struct afswtch {
114 char *af_name;
115 short af_af;
116 int (*af_status)();
117 int (*af_getaddr)();
59c3b7d8
KS
118 int af_difaddr;
119 int af_aifaddr;
120 caddr_t af_ridreq;
121 caddr_t af_addreq;
62e9bc4a 122} afs[] = {
59c3b7d8
KS
123#define C(x) ((caddr_t) &x)
124 { "inet", AF_INET, in_status, in_getaddr,
125 SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) },
126 { "ns", AF_NS, xns_status, xns_getaddr,
127 SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) },
128 { "iso", AF_ISO, iso_status, iso_getaddr,
129 SIOCDIFADDR_ISO, SIOCAIFADDR_ISO, C(iso_ridreq), C(iso_addreq) },
130 { 0, 0, 0, 0 }
62e9bc4a
KS
131};
132
133struct afswtch *afp; /*the address family being set or asked about*/
134
59c3b7d8
KS
135int testing = 0;
136Ioctl(a,b,c) {
137 int error = 0;
138 if (testing)
139 printf("would call ioctl with %x, %x, %x\n", a, b, c);
140 else
141 error = ioctl(a, b, c);
142 return error;
143}
144#define ioctl(a, b, c) Ioctl(a,b,c)
145
b3eab9f9
SL
146main(argc, argv)
147 int argc;
148 char *argv[];
149{
62e9bc4a 150 int af = AF_INET;
59c3b7d8 151 register struct afswtch *rafp;
37d62ab6 152
b3eab9f9 153 if (argc < 2) {
30078595 154 fprintf(stderr, "usage: ifconfig interface\n%s%s%s%s%s",
f5f09b9d
MK
155 "\t[ af [ address [ dest_addr ] ] [ up ] [ down ]",
156 "[ netmask mask ] ]\n",
157 "\t[ metric n ]\n",
158 "\t[ trailers | -trailers ]\n",
159 "\t[ arp | -arp ]\n");
b3eab9f9
SL
160 exit(1);
161 }
62e9bc4a 162 argc--, argv++;
63f46c0f 163 strncpy(name, *argv, sizeof(name));
62e9bc4a
KS
164 strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
165 argc--, argv++;
166 if (argc > 0) {
59c3b7d8
KS
167 for (afp = rafp = afs; rafp->af_name; rafp++)
168 if (strcmp(rafp->af_name, *argv) == 0) {
169 afp = rafp; argc--; argv++;
62e9bc4a
KS
170 break;
171 }
59c3b7d8
KS
172 rafp = afp;
173 af = ifr.ifr_addr.sa_family = rafp->af_af;
62e9bc4a
KS
174 }
175 s = socket(af, SOCK_DGRAM, 0);
b3eab9f9
SL
176 if (s < 0) {
177 perror("ifconfig: socket");
178 exit(1);
179 }
b3eab9f9
SL
180 if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) {
181 Perror("ioctl (SIOCGIFFLAGS)");
182 exit(1);
183 }
62e9bc4a 184 strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
0fd5cf4f 185 flags = ifr.ifr_flags;
f5f09b9d
MK
186 if (ioctl(s, SIOCGIFMETRIC, (caddr_t)&ifr) < 0)
187 perror("ioctl (SIOCGIFMETRIC)");
188 else
189 metric = ifr.ifr_metric;
b3eab9f9
SL
190 if (argc == 0) {
191 status();
192 exit(0);
193 }
194 while (argc > 0) {
195 register struct cmd *p;
196
197 for (p = cmds; p->c_name; p++)
198 if (strcmp(*argv, p->c_name) == 0)
199 break;
40a42b7f
TF
200 if (p->c_name == 0 && setaddr)
201 p++; /* got src, do dst */
0fd5cf4f
MK
202 if (p->c_func) {
203 if (p->c_parameter == NEXTARG) {
204 (*p->c_func)(argv[1]);
205 argc--, argv++;
206 } else
207 (*p->c_func)(*argv, p->c_parameter);
208 }
b3eab9f9
SL
209 argc--, argv++;
210 }
62e9bc4a
KS
211 if (setipdst && af==AF_NS) {
212 struct nsip_req rq;
213 int size = sizeof(rq);
214
59c3b7d8
KS
215 rq.rq_ns = addreq.ifra_addr;
216 rq.rq_ip = addreq.ifra_dstaddr;
62e9bc4a
KS
217
218 if (setsockopt(s, 0, SO_NSIP_ROUTE, &rq, size) < 0)
219 Perror("Encapsulation Routing");
22b2b267 220 }
22b2b267
KS
221 if (clearaddr) {
222 int ret;
223 strncpy(rafp->af_ridreq, name, sizeof ifr.ifr_name);
224 if ((ret = ioctl(s, rafp->af_difaddr, rafp->af_ridreq)) < 0) {
225 if (errno == EADDRNOTAVAIL && (doalias >= 0)) {
226 /* means no previous address for interface */
227 } else
228 Perror("ioctl (SIOCDIFADDR)");
229 }
62e9bc4a 230 }
59c3b7d8
KS
231 if (newaddr) {
232 strncpy(rafp->af_addreq, name, sizeof ifr.ifr_name);
233 if (ioctl(s, rafp->af_aifaddr, rafp->af_addreq) < 0)
234 Perror("ioctl (SIOCAIFADDR)");
0fd5cf4f 235 }
b3eab9f9
SL
236 exit(0);
237}
59c3b7d8
KS
238#define RIDADDR 0
239#define ADDR 1
240#define MASK 2
241#define DSTADDR 3
b3eab9f9
SL
242
243/*ARGSUSED*/
244setifaddr(addr, param)
245 char *addr;
62e9bc4a 246 short param;
b3eab9f9 247{
dea973a0
MK
248 /*
249 * Delay the ioctl to set the interface addr until flags are all set.
250 * The address interpretation may depend on the flags,
251 * and the flags may change when the address is set.
a9575a9a 252 */
dea973a0 253 setaddr++;
b95f7094 254 if (doalias == 0)
22b2b267 255 clearaddr = 1;
59c3b7d8 256 (*afp->af_getaddr)(addr, (doalias >= 0 ? ADDR : RIDADDR));
b3eab9f9
SL
257}
258
0fd5cf4f
MK
259setifnetmask(addr)
260 char *addr;
261{
59c3b7d8 262 (*afp->af_getaddr)(addr, MASK);
0fd5cf4f
MK
263}
264
265setifbroadaddr(addr)
266 char *addr;
267{
59c3b7d8 268 (*afp->af_getaddr)(addr, DSTADDR);
0fd5cf4f
MK
269}
270
62e9bc4a
KS
271setifipdst(addr)
272 char *addr;
273{
59c3b7d8 274 in_getaddr(addr, DSTADDR);
62e9bc4a 275 setipdst++;
22b2b267
KS
276 clearaddr = 0;
277 newaddr = 0;
62e9bc4a 278}
22b2b267 279#define rqtosa(x) (&(((struct ifreq *)(afp->x))->ifr_addr))
59c3b7d8
KS
280/*ARGSUSED*/
281notealias(addr, param)
282 char *addr;
283{
22b2b267
KS
284 if (setaddr && doalias == 0 && param < 0)
285 bcopy((caddr_t)rqtosa(af_addreq),
286 (caddr_t)rqtosa(af_ridreq),
287 rqtosa(af_addreq)->sa_len);
59c3b7d8 288 doalias = param;
22b2b267
KS
289 if (param < 0) {
290 clearaddr = 1;
59c3b7d8 291 newaddr = 0;
22b2b267
KS
292 } else
293 clearaddr = 0;
59c3b7d8
KS
294}
295
40a42b7f
TF
296/*ARGSUSED*/
297setifdstaddr(addr, param)
298 char *addr;
299 int param;
300{
59c3b7d8 301 (*afp->af_getaddr)(addr, DSTADDR);
40a42b7f
TF
302}
303
2c4ef00e
SL
304setifflags(vname, value)
305 char *vname;
62e9bc4a 306 short value;
b3eab9f9 307{
62e9bc4a
KS
308 if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) {
309 Perror("ioctl (SIOCGIFFLAGS)");
310 exit(1);
311 }
312 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
313 flags = ifr.ifr_flags;
b3eab9f9
SL
314
315 if (value < 0) {
316 value = -value;
0fd5cf4f 317 flags &= ~value;
b3eab9f9 318 } else
0fd5cf4f 319 flags |= value;
0fd5cf4f 320 ifr.ifr_flags = flags;
b3eab9f9 321 if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&ifr) < 0)
2c4ef00e 322 Perror(vname);
b3eab9f9
SL
323}
324
f5f09b9d
MK
325setifmetric(val)
326 char *val;
327{
328 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
329 ifr.ifr_metric = atoi(val);
330 if (ioctl(s, SIOCSIFMETRIC, (caddr_t)&ifr) < 0)
331 perror("ioctl (set metric)");
332}
333
59c3b7d8
KS
334setsnpaoffset(val)
335 char *val;
336{
337 iso_addreq.ifra_snpaoffset = atoi(val);
338}
339
f5f09b9d
MK
340#define IFFBITS \
341"\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6NOTRAILERS\7RUNNING\10NOARP\
342"
343
62e9bc4a
KS
344/*
345 * Print the status of the interface. If an address family was
346 * specified, show it and it only; otherwise, show them all.
347 */
b3eab9f9 348status()
62e9bc4a
KS
349{
350 register struct afswtch *p = afp;
351 short af = ifr.ifr_addr.sa_family;
352
f5f09b9d
MK
353 printf("%s: ", name);
354 printb("flags", flags, IFFBITS);
355 if (metric)
356 printf(" metric %d", metric);
357 putchar('\n');
62e9bc4a 358 if ((p = afp) != NULL) {
b14b214d
MK
359 (*p->af_status)(1);
360 } else for (p = afs; p->af_name; p++) {
62e9bc4a 361 ifr.ifr_addr.sa_family = p->af_af;
b14b214d 362 (*p->af_status)(0);
62e9bc4a
KS
363 }
364}
365
b14b214d
MK
366in_status(force)
367 int force;
b3eab9f9
SL
368{
369 struct sockaddr_in *sin;
62e9bc4a 370 char *inet_ntoa();
b3eab9f9 371
37d62ab6 372 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
0fd5cf4f 373 if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) {
b14b214d
MK
374 if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) {
375 if (!force)
376 return;
0fd5cf4f 377 bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
b14b214d
MK
378 } else
379 perror("ioctl (SIOCGIFADDR)");
0fd5cf4f 380 }
b3eab9f9 381 sin = (struct sockaddr_in *)&ifr.ifr_addr;
5868d993 382 printf("\tinet %s ", inet_ntoa(sin->sin_addr));
b14b214d
MK
383 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
384 if (ioctl(s, SIOCGIFNETMASK, (caddr_t)&ifr) < 0) {
385 if (errno != EADDRNOTAVAIL)
386 perror("ioctl (SIOCGIFNETMASK)");
387 bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
388 } else
389 netmask.sin_addr =
390 ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr;
40a42b7f 391 if (flags & IFF_POINTOPOINT) {
0fd5cf4f
MK
392 if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) {
393 if (errno == EADDRNOTAVAIL)
394 bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
395 else
b14b214d 396 perror("ioctl (SIOCGIFDSTADDR)");
0fd5cf4f 397 }
62e9bc4a 398 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
40a42b7f
TF
399 sin = (struct sockaddr_in *)&ifr.ifr_dstaddr;
400 printf("--> %s ", inet_ntoa(sin->sin_addr));
401 }
0fd5cf4f 402 printf("netmask %x ", ntohl(netmask.sin_addr.s_addr));
0fd5cf4f 403 if (flags & IFF_BROADCAST) {
0fd5cf4f
MK
404 if (ioctl(s, SIOCGIFBRDADDR, (caddr_t)&ifr) < 0) {
405 if (errno == EADDRNOTAVAIL)
b14b214d
MK
406 bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
407 else
408 perror("ioctl (SIOCGIFADDR)");
0fd5cf4f 409 }
62e9bc4a 410 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
0fd5cf4f 411 sin = (struct sockaddr_in *)&ifr.ifr_addr;
b14b214d
MK
412 if (sin->sin_addr.s_addr != 0)
413 printf("broadcast %s", inet_ntoa(sin->sin_addr));
0fd5cf4f 414 }
f5f09b9d 415 putchar('\n');
b3eab9f9
SL
416}
417
62e9bc4a 418
b14b214d
MK
419xns_status(force)
420 int force;
62e9bc4a
KS
421{
422 struct sockaddr_ns *sns;
62e9bc4a
KS
423
424 close(s);
425 s = socket(AF_NS, SOCK_DGRAM, 0);
426 if (s < 0) {
cd2e8e25 427 if (errno == EPROTONOSUPPORT)
63f46c0f 428 return;
62e9bc4a
KS
429 perror("ifconfig: socket");
430 exit(1);
431 }
432 if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) {
b14b214d
MK
433 if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) {
434 if (!force)
435 return;
436 bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
437 } else
438 perror("ioctl (SIOCGIFADDR)");
62e9bc4a
KS
439 }
440 strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
441 sns = (struct sockaddr_ns *)&ifr.ifr_addr;
f5f09b9d 442 printf("\tns %s ", ns_ntoa(sns->sns_addr));
90a22cbc
KS
443 if (flags & IFF_POINTOPOINT) { /* by W. Nesheim@Cornell */
444 if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) {
445 if (errno == EADDRNOTAVAIL)
446 bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
447 else
448 Perror("ioctl (SIOCGIFDSTADDR)");
449 }
450 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
451 sns = (struct sockaddr_ns *)&ifr.ifr_dstaddr;
452 printf("--> %s ", ns_ntoa(sns->sns_addr));
453 }
62e9bc4a
KS
454 putchar('\n');
455}
456
59c3b7d8
KS
457iso_status(force)
458 int force;
459{
460 struct sockaddr_iso *siso;
461 struct iso_ifreq ifr;
462
463 close(s);
464 s = socket(AF_ISO, 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 siso = &ifr.ifr_Addr;
481 printf("\tiso %s ", iso_ntoa(siso->siso_addr));
482 if (ioctl(s, SIOCGIFNETMASK, (caddr_t)&ifr) < 0) {
483 if (errno != EADDRNOTAVAIL)
484 perror("ioctl (SIOCGIFNETMASK)");
485 } else {
486 printf("\n netmask %s ", iso_ntoa(siso->siso_addr));
487 }
488 if (flags & IFF_POINTOPOINT) {
489 if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) {
490 if (errno == EADDRNOTAVAIL)
491 bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr));
492 else
493 Perror("ioctl (SIOCGIFDSTADDR)");
494 }
495 strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
496 siso = &ifr.ifr_Addr;
497 printf("--> %s ", iso_ntoa(siso->siso_addr));
498 }
499 putchar('\n');
500}
501
b3eab9f9
SL
502Perror(cmd)
503 char *cmd;
504{
505 extern int errno;
506
507 fprintf(stderr, "ifconfig: ");
508 switch (errno) {
509
510 case ENXIO:
62e9bc4a 511 fprintf(stderr, "%s: no such interface\n", cmd);
b3eab9f9
SL
512 break;
513
514 case EPERM:
9f1b5d96 515 fprintf(stderr, "%s: permission denied\n", cmd);
b3eab9f9
SL
516 break;
517
518 default:
519 perror(cmd);
520 }
521 exit(1);
522}
523
524struct in_addr inet_makeaddr();
525
59c3b7d8
KS
526#define SIN(x) ((struct sockaddr_in *) &(x))
527struct sockaddr_in *sintab[] = {
528SIN(ridreq.ifr_addr), SIN(addreq.ifra_addr),
529SIN(addreq.ifra_mask), SIN(addreq.ifra_broadaddr)};
530
531in_getaddr(s, which)
b3eab9f9 532 char *s;
b3eab9f9 533{
59c3b7d8 534 register struct sockaddr_in *sin = sintab[which];
b3eab9f9
SL
535 struct hostent *hp;
536 struct netent *np;
537 int val;
538
84ce95b5
KS
539 sin->sin_len = sizeof(*sin);
540 if (which != MASK)
59c3b7d8 541 sin->sin_family = AF_INET;
84ce95b5
KS
542
543 if ((val = inet_addr(s)) != -1)
0fd5cf4f 544 sin->sin_addr.s_addr = val;
84ce95b5 545 else if (hp = gethostbyname(s))
b3eab9f9 546 bcopy(hp->h_addr, (char *)&sin->sin_addr, hp->h_length);
84ce95b5 547 else if (np = getnetbyname(s))
b3eab9f9 548 sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY);
84ce95b5
KS
549 else {
550 fprintf(stderr, "%s: bad value\n", s);
551 exit(1);
b3eab9f9 552 }
b3eab9f9
SL
553}
554
555/*
556 * Print a value a la the %b format of the kernel's printf
557 */
558printb(s, v, bits)
559 char *s;
560 register char *bits;
561 register unsigned short v;
562{
563 register int i, any = 0;
564 register char c;
565
566 if (bits && *bits == 8)
567 printf("%s=%o", s, v);
568 else
569 printf("%s=%x", s, v);
570 bits++;
571 if (bits) {
572 putchar('<');
573 while (i = *bits++) {
574 if (v & (1 << (i-1))) {
575 if (any)
576 putchar(',');
577 any = 1;
578 for (; (c = *bits) > 32; bits++)
579 putchar(c);
580 } else
581 for (; *bits > 32; bits++)
582 ;
583 }
584 putchar('>');
585 }
586}
62e9bc4a 587
59c3b7d8
KS
588#define SNS(x) ((struct sockaddr_ns *) &(x))
589struct sockaddr_ns *snstab[] = {
590SNS(ridreq.ifr_addr), SNS(addreq.ifra_addr),
591SNS(addreq.ifra_mask), SNS(addreq.ifra_broadaddr)};
592
593xns_getaddr(addr, which)
62e9bc4a 594char *addr;
62e9bc4a 595{
59c3b7d8 596 struct sockaddr_ns *sns = snstab[which];
90a22cbc 597 struct ns_addr ns_addr();
59c3b7d8 598
62e9bc4a 599 sns->sns_family = AF_NS;
ac96969a 600 sns->sns_len = sizeof(*sns);
90a22cbc 601 sns->sns_addr = ns_addr(addr);
59c3b7d8
KS
602 if (which == MASK)
603 printf("Attempt to set XNS netmask will be ineffectual\n");
604}
605
606#define SISO(x) ((struct sockaddr_iso *) &(x))
607struct sockaddr_iso *sisotab[] = {
608SISO(iso_ridreq.ifr_Addr), SISO(iso_addreq.ifra_addr),
609SISO(iso_addreq.ifra_mask), SISO(iso_addreq.ifra_dstaddr)};
610
611iso_getaddr(addr, which)
612char *addr;
613{
614 struct sockaddr_iso *siso = sisotab[which];
615 struct iso_addr *iso_addr();
616 siso->siso_addr = *iso_addr(addr);
617 if (which == MASK) {
84ce95b5 618 siso->siso_len = TSEL(siso) - (caddr_t)(siso);
59c3b7d8
KS
619 siso->siso_nlen = 0;
620 } else {
621 siso->siso_family = AF_ISO;
622 siso->siso_len = sizeof(*siso);
623 }
62e9bc4a 624}