121811Skarels /* 221811Skarels * Copyright (c) 1983 Regents of the University of California. 334941Sbostic * All rights reserved. 434941Sbostic * 542702Sbostic * %sccs.include.redist.c% 621811Skarels */ 721811Skarels 814869Ssam #ifndef lint 921811Skarels char copyright[] = 1021811Skarels "@(#) Copyright (c) 1983 Regents of the University of California.\n\ 1121811Skarels All rights reserved.\n"; 1234941Sbostic #endif /* not lint */ 1314869Ssam 1421811Skarels #ifndef lint 15*42965Ssklower static char sccsid[] = "@(#)ifconfig.c 4.28 (Berkeley) 06/07/90"; 1634941Sbostic #endif /* not lint */ 1721811Skarels 1814869Ssam #include <sys/types.h> 1914869Ssam #include <sys/socket.h> 2014869Ssam #include <sys/ioctl.h> 2114869Ssam 2222485Ssklower #include <net/if.h> 2314869Ssam #include <netinet/in.h> 2414869Ssam 2522485Ssklower #define NSIP 2622485Ssklower #include <netns/ns.h> 2722485Ssklower #include <netns/ns_if.h> 2822485Ssklower 2937479Ssklower #define EON 3037315Ssklower #include <netiso/iso.h> 3137315Ssklower #include <netiso/iso_var.h> 3237479Ssklower #include <sys/protosw.h> 3337315Ssklower 3414869Ssam #include <stdio.h> 3514869Ssam #include <errno.h> 3614869Ssam #include <ctype.h> 3714869Ssam #include <netdb.h> 3814869Ssam 3922485Ssklower extern int errno; 4037315Ssklower struct ifreq ifr, ridreq; 4137315Ssklower struct ifaliasreq addreq; 4237315Ssklower struct iso_ifreq iso_ridreq; 43*42965Ssklower struct iso_aliasreq iso_addreq = {"", {0,0,0,0,1}}; /* default nsellen = 1*/ 4437315Ssklower struct sockaddr_in netmask; 4537315Ssklower 4614869Ssam char name[30]; 4721811Skarels int flags; 4826185Skarels int metric; 4916329Skarels int setaddr; 5022485Ssklower int setipdst; 5137315Ssklower int doalias; 5237479Ssklower int clearaddr; 5337315Ssklower int newaddr = 1; 5414869Ssam int s; 5521811Skarels extern int errno; 5614869Ssam 5721811Skarels int setifflags(), setifaddr(), setifdstaddr(), setifnetmask(); 5826185Skarels int setifmetric(), setifbroadaddr(), setifipdst(); 59*42965Ssklower int notealias(), setsnpaoffset(), setnsellength(); 6014869Ssam 6121811Skarels #define NEXTARG 0xffffff 6221811Skarels 6314869Ssam struct cmd { 6414869Ssam char *c_name; 6521811Skarels int c_parameter; /* NEXTARG means next argv */ 6614869Ssam int (*c_func)(); 6714869Ssam } cmds[] = { 6814869Ssam { "up", IFF_UP, setifflags } , 6914869Ssam { "down", -IFF_UP, setifflags }, 7014869Ssam { "trailers", -IFF_NOTRAILERS,setifflags }, 7114869Ssam { "-trailers", IFF_NOTRAILERS, setifflags }, 7215359Skarels { "arp", -IFF_NOARP, setifflags }, 7315359Skarels { "-arp", IFF_NOARP, setifflags }, 7415286Sleres { "debug", IFF_DEBUG, setifflags }, 7515286Sleres { "-debug", -IFF_DEBUG, setifflags }, 7637315Ssklower { "alias", IFF_UP, notealias }, 7737315Ssklower { "-alias", -IFF_UP, notealias }, 7837315Ssklower { "delete", -IFF_UP, notealias }, 7915004Ssam #ifdef notdef 8021811Skarels #define EN_SWABIPS 0x1000 8115004Ssam { "swabips", EN_SWABIPS, setifflags }, 8215004Ssam { "-swabips", -EN_SWABIPS, setifflags }, 8315004Ssam #endif 8421811Skarels { "netmask", NEXTARG, setifnetmask }, 8526185Skarels { "metric", NEXTARG, setifmetric }, 8621811Skarels { "broadcast", NEXTARG, setifbroadaddr }, 8722485Ssklower { "ipdst", NEXTARG, setifipdst }, 88*42965Ssklower { "snpaoffset", NEXTARG, setsnpaoffset }, 89*42965Ssklower { "nsellength", NEXTARG, setnsellength }, 9014869Ssam { 0, 0, setifaddr }, 9117218Stef { 0, 0, setifdstaddr }, 9214869Ssam }; 9314869Ssam 9422485Ssklower /* 9522485Ssklower * XNS support liberally adapted from 9622485Ssklower * code written at the University of Maryland 9722485Ssklower * principally by James O'Toole and Chris Torek. 9822485Ssklower */ 9922485Ssklower int in_status(), in_getaddr(); 10022485Ssklower int xns_status(), xns_getaddr(); 10137315Ssklower int iso_status(), iso_getaddr(); 10222485Ssklower 10322485Ssklower /* Known address families */ 10422485Ssklower struct afswtch { 10522485Ssklower char *af_name; 10622485Ssklower short af_af; 10722485Ssklower int (*af_status)(); 10822485Ssklower int (*af_getaddr)(); 10937315Ssklower int af_difaddr; 11037315Ssklower int af_aifaddr; 11137315Ssklower caddr_t af_ridreq; 11237315Ssklower caddr_t af_addreq; 11322485Ssklower } afs[] = { 11437315Ssklower #define C(x) ((caddr_t) &x) 11537315Ssklower { "inet", AF_INET, in_status, in_getaddr, 11637315Ssklower SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) }, 11737315Ssklower { "ns", AF_NS, xns_status, xns_getaddr, 11837315Ssklower SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) }, 11937315Ssklower { "iso", AF_ISO, iso_status, iso_getaddr, 12037315Ssklower SIOCDIFADDR_ISO, SIOCAIFADDR_ISO, C(iso_ridreq), C(iso_addreq) }, 12137315Ssklower { 0, 0, 0, 0 } 12222485Ssklower }; 12322485Ssklower 12422485Ssklower struct afswtch *afp; /*the address family being set or asked about*/ 12522485Ssklower 12637315Ssklower int testing = 0; 12737315Ssklower Ioctl(a,b,c) { 12837315Ssklower int error = 0; 12937315Ssklower if (testing) 13037315Ssklower printf("would call ioctl with %x, %x, %x\n", a, b, c); 13137315Ssklower else 13237315Ssklower error = ioctl(a, b, c); 13337315Ssklower return error; 13437315Ssklower } 13537315Ssklower #define ioctl(a, b, c) Ioctl(a,b,c) 13637315Ssklower 13714869Ssam main(argc, argv) 13814869Ssam int argc; 13914869Ssam char *argv[]; 14014869Ssam { 14122485Ssklower int af = AF_INET; 14237315Ssklower register struct afswtch *rafp; 14327061Skarels 14414869Ssam if (argc < 2) { 14530789Sbostic fprintf(stderr, "usage: ifconfig interface\n%s%s%s%s%s", 14626185Skarels "\t[ af [ address [ dest_addr ] ] [ up ] [ down ]", 14726185Skarels "[ netmask mask ] ]\n", 14826185Skarels "\t[ metric n ]\n", 14926185Skarels "\t[ trailers | -trailers ]\n", 15026185Skarels "\t[ arp | -arp ]\n"); 15114869Ssam exit(1); 15214869Ssam } 15322485Ssklower argc--, argv++; 15424248Ssklower strncpy(name, *argv, sizeof(name)); 15522485Ssklower strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); 15622485Ssklower argc--, argv++; 15722485Ssklower if (argc > 0) { 15837315Ssklower for (afp = rafp = afs; rafp->af_name; rafp++) 15937315Ssklower if (strcmp(rafp->af_name, *argv) == 0) { 16037315Ssklower afp = rafp; argc--; argv++; 16122485Ssklower break; 16222485Ssklower } 16337315Ssklower rafp = afp; 16437315Ssklower af = ifr.ifr_addr.sa_family = rafp->af_af; 16522485Ssklower } 16622485Ssklower s = socket(af, SOCK_DGRAM, 0); 16714869Ssam if (s < 0) { 16814869Ssam perror("ifconfig: socket"); 16914869Ssam exit(1); 17014869Ssam } 17114869Ssam if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) { 17214869Ssam Perror("ioctl (SIOCGIFFLAGS)"); 17314869Ssam exit(1); 17414869Ssam } 17522485Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 17621811Skarels flags = ifr.ifr_flags; 17726185Skarels if (ioctl(s, SIOCGIFMETRIC, (caddr_t)&ifr) < 0) 17826185Skarels perror("ioctl (SIOCGIFMETRIC)"); 17926185Skarels else 18026185Skarels metric = ifr.ifr_metric; 18114869Ssam if (argc == 0) { 18214869Ssam status(); 18314869Ssam exit(0); 18414869Ssam } 18514869Ssam while (argc > 0) { 18614869Ssam register struct cmd *p; 18714869Ssam 18814869Ssam for (p = cmds; p->c_name; p++) 18914869Ssam if (strcmp(*argv, p->c_name) == 0) 19014869Ssam break; 19117218Stef if (p->c_name == 0 && setaddr) 19217218Stef p++; /* got src, do dst */ 19321811Skarels if (p->c_func) { 19421811Skarels if (p->c_parameter == NEXTARG) { 19521811Skarels (*p->c_func)(argv[1]); 19621811Skarels argc--, argv++; 19721811Skarels } else 19821811Skarels (*p->c_func)(*argv, p->c_parameter); 19921811Skarels } 20014869Ssam argc--, argv++; 20114869Ssam } 20237479Ssklower if (setipdst && af==AF_NS) { 20337479Ssklower struct nsip_req rq; 20437479Ssklower int size = sizeof(rq); 20537479Ssklower 20637479Ssklower rq.rq_ns = addreq.ifra_addr; 20737479Ssklower rq.rq_ip = addreq.ifra_dstaddr; 20837479Ssklower 20937479Ssklower if (setsockopt(s, 0, SO_NSIP_ROUTE, &rq, size) < 0) 21037479Ssklower Perror("Encapsulation Routing"); 21137479Ssklower } 21237315Ssklower if (clearaddr) { 21337315Ssklower int ret; 21437315Ssklower strncpy(rafp->af_ridreq, name, sizeof ifr.ifr_name); 21537315Ssklower if ((ret = ioctl(s, rafp->af_difaddr, rafp->af_ridreq)) < 0) { 21637315Ssklower if (errno == EADDRNOTAVAIL && (doalias >= 0)) { 21737315Ssklower /* means no previous address for interface */ 21837315Ssklower } else 21937315Ssklower Perror("ioctl (SIOCDIFADDR)"); 22037315Ssklower } 22121811Skarels } 22237315Ssklower if (newaddr) { 22337315Ssklower strncpy(rafp->af_addreq, name, sizeof ifr.ifr_name); 22437315Ssklower if (ioctl(s, rafp->af_aifaddr, rafp->af_addreq) < 0) 22537315Ssklower Perror("ioctl (SIOCAIFADDR)"); 22616329Skarels } 22714869Ssam exit(0); 22814869Ssam } 22937315Ssklower #define RIDADDR 0 23037315Ssklower #define ADDR 1 23137315Ssklower #define MASK 2 23237315Ssklower #define DSTADDR 3 23314869Ssam 23414869Ssam /*ARGSUSED*/ 23514869Ssam setifaddr(addr, param) 23614869Ssam char *addr; 23722485Ssklower short param; 23814869Ssam { 23916329Skarels /* 24016329Skarels * Delay the ioctl to set the interface addr until flags are all set. 24116329Skarels * The address interpretation may depend on the flags, 24216329Skarels * and the flags may change when the address is set. 24315390Skarels */ 24416329Skarels setaddr++; 24540830Ssklower if (doalias == 0) 24637479Ssklower clearaddr = 1; 24737315Ssklower (*afp->af_getaddr)(addr, (doalias >= 0 ? ADDR : RIDADDR)); 24814869Ssam } 24914869Ssam 25021811Skarels setifnetmask(addr) 25121811Skarels char *addr; 25221811Skarels { 25337315Ssklower (*afp->af_getaddr)(addr, MASK); 25421811Skarels } 25521811Skarels 25621811Skarels setifbroadaddr(addr) 25721811Skarels char *addr; 25821811Skarels { 25937315Ssklower (*afp->af_getaddr)(addr, DSTADDR); 26021811Skarels } 26121811Skarels 26222485Ssklower setifipdst(addr) 26322485Ssklower char *addr; 26422485Ssklower { 26537315Ssklower in_getaddr(addr, DSTADDR); 26622485Ssklower setipdst++; 26737479Ssklower clearaddr = 0; 26837479Ssklower newaddr = 0; 26922485Ssklower } 27037479Ssklower #define rqtosa(x) (&(((struct ifreq *)(afp->x))->ifr_addr)) 27117218Stef /*ARGSUSED*/ 27237315Ssklower notealias(addr, param) 27337315Ssklower char *addr; 27437315Ssklower { 27537479Ssklower if (setaddr && doalias == 0 && param < 0) 27637479Ssklower bcopy((caddr_t)rqtosa(af_addreq), 27737479Ssklower (caddr_t)rqtosa(af_ridreq), 27837479Ssklower rqtosa(af_addreq)->sa_len); 27937315Ssklower doalias = param; 28037479Ssklower if (param < 0) { 28137479Ssklower clearaddr = 1; 28237479Ssklower newaddr = 0; 28337479Ssklower } else 28437315Ssklower clearaddr = 0; 28537315Ssklower } 28637315Ssklower 28737315Ssklower /*ARGSUSED*/ 28817218Stef setifdstaddr(addr, param) 28917218Stef char *addr; 29017218Stef int param; 29117218Stef { 29237315Ssklower (*afp->af_getaddr)(addr, DSTADDR); 29317218Stef } 29417218Stef 29514870Ssam setifflags(vname, value) 29614870Ssam char *vname; 29722485Ssklower short value; 29814869Ssam { 29922485Ssklower if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) { 30022485Ssklower Perror("ioctl (SIOCGIFFLAGS)"); 30122485Ssklower exit(1); 30222485Ssklower } 30322485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 30422485Ssklower flags = ifr.ifr_flags; 30514869Ssam 30614869Ssam if (value < 0) { 30714869Ssam value = -value; 30821811Skarels flags &= ~value; 30914869Ssam } else 31021811Skarels flags |= value; 31121811Skarels ifr.ifr_flags = flags; 31214869Ssam if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&ifr) < 0) 31314870Ssam Perror(vname); 31414869Ssam } 31514869Ssam 31626185Skarels setifmetric(val) 31726185Skarels char *val; 31826185Skarels { 31926185Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 32026185Skarels ifr.ifr_metric = atoi(val); 32126185Skarels if (ioctl(s, SIOCSIFMETRIC, (caddr_t)&ifr) < 0) 32226185Skarels perror("ioctl (set metric)"); 32326185Skarels } 32426185Skarels 32537315Ssklower setsnpaoffset(val) 32637315Ssklower char *val; 32737315Ssklower { 32837315Ssklower iso_addreq.ifra_snpaoffset = atoi(val); 32937315Ssklower } 33037315Ssklower 33126185Skarels #define IFFBITS \ 33226185Skarels "\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6NOTRAILERS\7RUNNING\10NOARP\ 33326185Skarels " 33426185Skarels 33522485Ssklower /* 33622485Ssklower * Print the status of the interface. If an address family was 33722485Ssklower * specified, show it and it only; otherwise, show them all. 33822485Ssklower */ 33914869Ssam status() 34014869Ssam { 34122485Ssklower register struct afswtch *p = afp; 34222485Ssklower short af = ifr.ifr_addr.sa_family; 34322485Ssklower 34426185Skarels printf("%s: ", name); 34526185Skarels printb("flags", flags, IFFBITS); 34626185Skarels if (metric) 34726185Skarels printf(" metric %d", metric); 34826185Skarels putchar('\n'); 34922485Ssklower if ((p = afp) != NULL) { 35028468Skarels (*p->af_status)(1); 35128468Skarels } else for (p = afs; p->af_name; p++) { 35222485Ssklower ifr.ifr_addr.sa_family = p->af_af; 35328468Skarels (*p->af_status)(0); 35422485Ssklower } 35522485Ssklower } 35622485Ssklower 35728468Skarels in_status(force) 35828468Skarels int force; 35922485Ssklower { 36014869Ssam struct sockaddr_in *sin; 36122485Ssklower char *inet_ntoa(); 36214869Ssam 36327061Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 36421811Skarels if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) { 36528468Skarels if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 36628468Skarels if (!force) 36728468Skarels return; 36821811Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 36928468Skarels } else 37028468Skarels perror("ioctl (SIOCGIFADDR)"); 37121811Skarels } 37214869Ssam sin = (struct sockaddr_in *)&ifr.ifr_addr; 37326429Skarels printf("\tinet %s ", inet_ntoa(sin->sin_addr)); 37428468Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 37528468Skarels if (ioctl(s, SIOCGIFNETMASK, (caddr_t)&ifr) < 0) { 37628468Skarels if (errno != EADDRNOTAVAIL) 37728468Skarels perror("ioctl (SIOCGIFNETMASK)"); 37828468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 37928468Skarels } else 38028468Skarels netmask.sin_addr = 38128468Skarels ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr; 38217218Stef if (flags & IFF_POINTOPOINT) { 38321811Skarels if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) { 38421811Skarels if (errno == EADDRNOTAVAIL) 38521811Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 38621811Skarels else 38728468Skarels perror("ioctl (SIOCGIFDSTADDR)"); 38821811Skarels } 38922485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 39017218Stef sin = (struct sockaddr_in *)&ifr.ifr_dstaddr; 39117218Stef printf("--> %s ", inet_ntoa(sin->sin_addr)); 39217218Stef } 39321811Skarels printf("netmask %x ", ntohl(netmask.sin_addr.s_addr)); 39421811Skarels if (flags & IFF_BROADCAST) { 39521811Skarels if (ioctl(s, SIOCGIFBRDADDR, (caddr_t)&ifr) < 0) { 39621811Skarels if (errno == EADDRNOTAVAIL) 39728468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 39828468Skarels else 39928468Skarels perror("ioctl (SIOCGIFADDR)"); 40021811Skarels } 40122485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 40221811Skarels sin = (struct sockaddr_in *)&ifr.ifr_addr; 40328468Skarels if (sin->sin_addr.s_addr != 0) 40428468Skarels printf("broadcast %s", inet_ntoa(sin->sin_addr)); 40521811Skarels } 40626185Skarels putchar('\n'); 40714869Ssam } 40814869Ssam 40922485Ssklower 41028468Skarels xns_status(force) 41128468Skarels int force; 41222485Ssklower { 41322485Ssklower struct sockaddr_ns *sns; 41422485Ssklower 41522485Ssklower close(s); 41622485Ssklower s = socket(AF_NS, SOCK_DGRAM, 0); 41722485Ssklower if (s < 0) { 41830692Smckusick if (errno == EPROTONOSUPPORT) 41924248Ssklower return; 42022485Ssklower perror("ifconfig: socket"); 42122485Ssklower exit(1); 42222485Ssklower } 42322485Ssklower if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) { 42428468Skarels if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 42528468Skarels if (!force) 42628468Skarels return; 42728468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 42828468Skarels } else 42928468Skarels perror("ioctl (SIOCGIFADDR)"); 43022485Ssklower } 43122485Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 43222485Ssklower sns = (struct sockaddr_ns *)&ifr.ifr_addr; 43326185Skarels printf("\tns %s ", ns_ntoa(sns->sns_addr)); 43426101Ssklower if (flags & IFF_POINTOPOINT) { /* by W. Nesheim@Cornell */ 43526101Ssklower if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) { 43626101Ssklower if (errno == EADDRNOTAVAIL) 43726101Ssklower bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 43826101Ssklower else 43926101Ssklower Perror("ioctl (SIOCGIFDSTADDR)"); 44026101Ssklower } 44126101Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 44226101Ssklower sns = (struct sockaddr_ns *)&ifr.ifr_dstaddr; 44326101Ssklower printf("--> %s ", ns_ntoa(sns->sns_addr)); 44426101Ssklower } 44522485Ssklower putchar('\n'); 44622485Ssklower } 44722485Ssklower 44837315Ssklower iso_status(force) 44937315Ssklower int force; 45037315Ssklower { 45137315Ssklower struct sockaddr_iso *siso; 45237315Ssklower struct iso_ifreq ifr; 45337315Ssklower 45437315Ssklower close(s); 45537315Ssklower s = socket(AF_ISO, SOCK_DGRAM, 0); 45637315Ssklower if (s < 0) { 45737315Ssklower if (errno == EPROTONOSUPPORT) 45837315Ssklower return; 45937315Ssklower perror("ifconfig: socket"); 46037315Ssklower exit(1); 46137315Ssklower } 462*42965Ssklower bzero((caddr_t)&ifr, sizeof(ifr)); 463*42965Ssklower strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); 464*42965Ssklower if (ioctl(s, SIOCGIFADDR_ISO, (caddr_t)&ifr) < 0) { 46537315Ssklower if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 46637315Ssklower if (!force) 46737315Ssklower return; 46837315Ssklower bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr)); 469*42965Ssklower } else { 470*42965Ssklower perror("ioctl (SIOCGIFADDR_ISO)"); 471*42965Ssklower exit(1); 472*42965Ssklower } 47337315Ssklower } 47437315Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 47537315Ssklower siso = &ifr.ifr_Addr; 476*42965Ssklower printf("\tiso %s ", iso_ntoa(&siso->siso_addr)); 477*42965Ssklower if (ioctl(s, SIOCGIFNETMASK_ISO, (caddr_t)&ifr) < 0) { 47837315Ssklower if (errno != EADDRNOTAVAIL) 479*42965Ssklower perror("ioctl (SIOCGIFNETMASK_ISO)"); 48037315Ssklower } else { 481*42965Ssklower printf(" netmask %s ", iso_ntoa(&siso->siso_addr)); 48237315Ssklower } 48337315Ssklower if (flags & IFF_POINTOPOINT) { 484*42965Ssklower if (ioctl(s, SIOCGIFDSTADDR_ISO, (caddr_t)&ifr) < 0) { 48537315Ssklower if (errno == EADDRNOTAVAIL) 48637315Ssklower bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr)); 48737315Ssklower else 488*42965Ssklower Perror("ioctl (SIOCGIFDSTADDR_ISO)"); 48937315Ssklower } 49037315Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 49137315Ssklower siso = &ifr.ifr_Addr; 492*42965Ssklower printf("--> %s ", iso_ntoa(&siso->siso_addr)); 49337315Ssklower } 49437315Ssklower putchar('\n'); 49537315Ssklower } 49637315Ssklower 49714869Ssam Perror(cmd) 49814869Ssam char *cmd; 49914869Ssam { 50014869Ssam extern int errno; 50114869Ssam 50214869Ssam fprintf(stderr, "ifconfig: "); 50314869Ssam switch (errno) { 50414869Ssam 50514869Ssam case ENXIO: 50622485Ssklower fprintf(stderr, "%s: no such interface\n", cmd); 50714869Ssam break; 50814869Ssam 50914869Ssam case EPERM: 51016822Slepreau fprintf(stderr, "%s: permission denied\n", cmd); 51114869Ssam break; 51214869Ssam 51314869Ssam default: 51414869Ssam perror(cmd); 51514869Ssam } 51614869Ssam exit(1); 51714869Ssam } 51814869Ssam 51914869Ssam struct in_addr inet_makeaddr(); 52014869Ssam 52137315Ssklower #define SIN(x) ((struct sockaddr_in *) &(x)) 52237315Ssklower struct sockaddr_in *sintab[] = { 52337315Ssklower SIN(ridreq.ifr_addr), SIN(addreq.ifra_addr), 52437315Ssklower SIN(addreq.ifra_mask), SIN(addreq.ifra_broadaddr)}; 52537315Ssklower 52637315Ssklower in_getaddr(s, which) 52714869Ssam char *s; 52814869Ssam { 52937315Ssklower register struct sockaddr_in *sin = sintab[which]; 53014869Ssam struct hostent *hp; 53114869Ssam struct netent *np; 53214869Ssam int val; 53314869Ssam 53439210Ssklower sin->sin_len = sizeof(*sin); 53539210Ssklower if (which != MASK) 53637315Ssklower sin->sin_family = AF_INET; 53739210Ssklower 53839210Ssklower if ((val = inet_addr(s)) != -1) 53921811Skarels sin->sin_addr.s_addr = val; 54039210Ssklower else if (hp = gethostbyname(s)) 54114869Ssam bcopy(hp->h_addr, (char *)&sin->sin_addr, hp->h_length); 54239210Ssklower else if (np = getnetbyname(s)) 54314869Ssam sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY); 54439210Ssklower else { 54539210Ssklower fprintf(stderr, "%s: bad value\n", s); 54639210Ssklower exit(1); 54714869Ssam } 54814869Ssam } 54914869Ssam 55014869Ssam /* 55114869Ssam * Print a value a la the %b format of the kernel's printf 55214869Ssam */ 55314869Ssam printb(s, v, bits) 55414869Ssam char *s; 55514869Ssam register char *bits; 55614869Ssam register unsigned short v; 55714869Ssam { 55814869Ssam register int i, any = 0; 55914869Ssam register char c; 56014869Ssam 56114869Ssam if (bits && *bits == 8) 56214869Ssam printf("%s=%o", s, v); 56314869Ssam else 56414869Ssam printf("%s=%x", s, v); 56514869Ssam bits++; 56614869Ssam if (bits) { 56714869Ssam putchar('<'); 56814869Ssam while (i = *bits++) { 56914869Ssam if (v & (1 << (i-1))) { 57014869Ssam if (any) 57114869Ssam putchar(','); 57214869Ssam any = 1; 57314869Ssam for (; (c = *bits) > 32; bits++) 57414869Ssam putchar(c); 57514869Ssam } else 57614869Ssam for (; *bits > 32; bits++) 57714869Ssam ; 57814869Ssam } 57914869Ssam putchar('>'); 58014869Ssam } 58114869Ssam } 58222485Ssklower 58337315Ssklower #define SNS(x) ((struct sockaddr_ns *) &(x)) 58437315Ssklower struct sockaddr_ns *snstab[] = { 58537315Ssklower SNS(ridreq.ifr_addr), SNS(addreq.ifra_addr), 58637315Ssklower SNS(addreq.ifra_mask), SNS(addreq.ifra_broadaddr)}; 58737315Ssklower 58837315Ssklower xns_getaddr(addr, which) 58922485Ssklower char *addr; 59022485Ssklower { 59137315Ssklower struct sockaddr_ns *sns = snstab[which]; 59226101Ssklower struct ns_addr ns_addr(); 59337315Ssklower 59422485Ssklower sns->sns_family = AF_NS; 59537227Ssklower sns->sns_len = sizeof(*sns); 59626101Ssklower sns->sns_addr = ns_addr(addr); 59737315Ssklower if (which == MASK) 59837315Ssklower printf("Attempt to set XNS netmask will be ineffectual\n"); 59922485Ssklower } 60037315Ssklower 60137315Ssklower #define SISO(x) ((struct sockaddr_iso *) &(x)) 60237315Ssklower struct sockaddr_iso *sisotab[] = { 60337315Ssklower SISO(iso_ridreq.ifr_Addr), SISO(iso_addreq.ifra_addr), 60437315Ssklower SISO(iso_addreq.ifra_mask), SISO(iso_addreq.ifra_dstaddr)}; 60537315Ssklower 60637315Ssklower iso_getaddr(addr, which) 60737315Ssklower char *addr; 60837315Ssklower { 60937315Ssklower struct sockaddr_iso *siso = sisotab[which]; 61037315Ssklower struct iso_addr *iso_addr(); 61137315Ssklower siso->siso_addr = *iso_addr(addr); 61237315Ssklower if (which == MASK) { 61339210Ssklower siso->siso_len = TSEL(siso) - (caddr_t)(siso); 61437315Ssklower siso->siso_nlen = 0; 61537315Ssklower } else { 61637315Ssklower siso->siso_family = AF_ISO; 61737315Ssklower siso->siso_len = sizeof(*siso); 61837315Ssklower } 61937315Ssklower } 620*42965Ssklower 621*42965Ssklower setnsellength(val) 622*42965Ssklower char *val; 623*42965Ssklower { 624*42965Ssklower register struct sockaddr_iso *siso = sisotab[ADDR]; 625*42965Ssklower int n = atoi(val); 626*42965Ssklower if (afp == 0 || afp->af_af != AF_ISO) { 627*42965Ssklower fprintf(stderr, "Setting NSEL length valid only for iso\n"); 628*42965Ssklower exit (1); 629*42965Ssklower } 630*42965Ssklower if (n >= 0) 631*42965Ssklower siso->siso_tlen = n; 632*42965Ssklower } 633